BÀI 07 : UART TRONG STM8S.
- Khái niệm lý thuyết liên quan.
- Cấu hình sử dụng thư viện ST.
- Cấu hình chương trình con không sử dụng ngắt.
- Hàm thực thi: các bạn có thể dùng hàm UART1_SendData8(uint8_t Data) và uint8_t UART1_ReceiveData8(void) để truyền và nhận data
- Trong ví dụ 1 khi gửi data trong vòng lặp while nên có hàm Delay một khoảng thời gian nhỏ để quan sát khi giao tiếp với máy tính(ở đây mình Delay khá lớn để dễ quan sát) Nếu bạn không để hàm Delay: khi giao tiếp với máy tính ở tốc độ baud cao và lặp lại liên tục trong vòng lặp while máy tính có thể bị treo khi nhận liên tục data với tốc độ lớn.
- ở ví dụ 2 :chương trình sẽ bị dừng ở vòng lặp while khi chờ cờ RXNE nhận xong data. Khi máy tính gửi 1 kí tự bất kì thì chương trình sẽ thoát khỏi vòng lặp while đó.
- Các hàm UART1_SendData8(uint8_t Data) và uint8_t UART1_ReceiveData8(void) có dữ liệu là 8 byte nên khi khai báo nên khai báo dữ liệu ở kiểu 8 btye(uint8_t, char, int…) để tránh lãng phí thanh ghi trong bộ nhớ chương trình cũng như hạn chế lỗi.
- Chương trình truyền nhiều kí tự bằng UART.
- Chương trình con truyền chuỗi kí tự kiều char
- Hàm thực thi:
- Dùng hàm printf của thư viện stdio.h.
- Cấu hình để sử dụng hàm printf:
- In chuỗi lên màn hình không có tham số đi kèm.
- In chuỗi lên màn hình có tham số đi kèm.
- Cấu hình với ngắt nhận UART.
- Chương trình con cấu hình:
- Chương trình thực thi trong file stm8s_it.c : nhận được 1 kí tự nào từ máy tính gửi lên kí tự đó.
- Một số thanh ghi quan trọng trong STM8S:
- UART_SR - Status register.
- TXE : bit thông báo trạng thái data đã truyền xong (TXE=1) hay chưa(TXE=0).
- TC: bit thông báo quá trình truyền hoàn tất(TC=1) hay không(TC=0).
- RXNE: bit thông báo đã nhận data(RXNE=1) hay chưa(RXNE=0).
- UART_BRR – Baud rate register.
- UART_DR – Data register.
- UART_CR – control register.
- UART_CR1.
- UART_CR2.
- UART_CR3.
- Bài tập.
- Cấu hình sử dụng uart 1 với tốc độ baund 119200 nhận kí tự từ máy tính. Nhận được kí tự nào truyền lên lại kí tự đó. Dùng ngắt UART để nhận kí tự từ máy tính và mềm Hercules để xem quá trình truyền nhận.
- Dùng hàm printf của thư viện stdio để truyền dòng chữ “Hello word” lên máy tính. Sử dụng phần mềm Hercules để xem quá trình truyền.
UART - Universal synchronous asynchronous receiver transmitter là một ngoại vi cơ bản và thường dùng trong các quá trình giao tiếp với các module như : Xbee, Wifi, Blutooth…. Khi giao tiếp UART kết hợp với các IC giao tiếp như MAX232CP, SP485EEN…. thì sẽ tạo thành các chuẩn giao tiếp RS232, RS485. Đây là các chuẩn giao tiếp thông dụng và phổ biến trong công nghiệp từ trước đến nay.
Khi ta sử dụng chân UART_CLK thì giao tiếp UART sẽ trở thành giao tiếp đồng bộ và không dùng sẽ là chuẩn giao tiếp không đồng bộ. Các bạn để ý là với bất cứ 1 chuẩn truyền thông nào, khi có sử dụng 1 chân tín hiệu làm chân CLK thì chuẩn giao tiếp đó sẽ là chuẩn giao tiếp đồng bộ và ngược lại. Ở đây mình chỉ đề cập đến giao tiếp UART không đồng bộ.
Ưu điểm của giao tiếp UART không đồng bộ: tiết kiệm chân vi điều khiển(2 chân), là ngoại vi mà bất kì 1 VĐK nào cũng có, có khá nhiều module, cảm biến dùng UART để truyền nhận data với VĐK. Nhược điểm của loại ngoại vi này là tốc độ khá chậm, tốc độ tối đa tùy thuộc vào từng dòng; quá trình truyền nhận dễ xảy ra lỗi nên trong quá trình truyền nhận cần có các phương pháp để kiểm tra(thông thường là truyền thêm bit hoặc byte kiểm tra lỗi). Khi muốn truyền data đi xa, chúng ta cần phải sử dụng các IC thông dụng để tạo thành các chuẩn giao tiếp đáng tin cậy như RS485 hay RS232.
STM8S003F3P6 chỉ có duy nhất 1 cổng UART đó là UART1, các loại STM8S khác thì sẽ có UART1, UART2, UART3,UART4 tùy thuộc theo từng dòng và nhận biết thông qua datasheet của vi điều khiển đó - VD STM8S105C6T6 trên board discovery sẽ có UART2.
Thông thường chúng ta sẽ dùng ngắt nhận UART để nhận dữ liệu vì sử dụng ngắt sẽ tiện lợi, không tốn thời gian chờ cũng như mất dữ liệu.Các tốc độ thường dùng để giao tiếp với máy tính: 600,1200,2400,4800,9600,14400,19200,38400,56000,57600,115200.
Một số phần mềm giao tiếp với máy tính: hercules_3-2-5,teraterm, Serial-Oscilloscope-v1.5...Một số modulde dùng để giao tiếp với máy tính: CP2102 USB 2.0, USB ra UART dùng PL2303, USB to UART dùng TTL FT232RL, USB ra UART dùng CH340G…
Ví dụ 1 : chương trình gửi kí tự “A” lên máy tính – tra cứu bảng mã ASCII thì kí tự “A” có giá trị là 65
Ví dụ 2 : nhận data trong vòng lặp while :
CHÚ Ý :
CHÚ Ý : mình để hàm delay để cho dễ quan sát, dòng lệnh truyền kí tự xuống hàng có thể để trong chương trình con UARTPrintf ở ngoài vòng lặp while(*char) , cuối chương trình.
Hàm printf nằm trong thư viện stdio.h nên cần phải add vào ở đầu chương trình.
CHÚ Ý : kiểu các kiểu dữ liệu %d,%f,%c các bạn có thể tham khảo trên mạng với từ khóa “ Printf trong c++”. Với kiểu dữ liệu thì hàm printf không thể in các số đằng sau dấu “.” Ví dụ 4.596 thì chỉ in được 4.
Bao gồm 2 thanh ghi là BRR1 chứa 8 bit ở giữa quy định tốc độ baud và BRR2 chứa 4 bit đầu và 4 bit cuối của thanh ghi tốc độ baund. Giá trị của thanh ghi = Clock cấp UART/baud.Vd lock cấp cho UART là 16Mhz, tốc đọ baud là 19200 -> val = 16*10^6/19200= 0x0341.UART_BRR1= 0x34 và UART_BRR2=0x01.
Thanh ghi này chứa giá trị truyền và nhận của UART, nó gồm 8 bit nên giá trị max 255.
Bao gồm 6 thanh ghi để điều khiển quá trình UART, mình chỉ nói qua 1 số bit và thanh ghi cấu hình chính.
M : số bit data truyền nhận (8 hoặc 9 bit) tương ứng ở trong code là UART1_WORDLENGTH_8D. PCEN: cho phép bit chẵn lẻ hoặc không tương ứng ở trong code là UART1_PARITY_NO.
TEN : cho phép truyền(TEN = 1) hoặc không(TEN = 0). REN : cho phép nhận(REN=1) hoặc không(REN=0).Ở trong code UART1_MODE_TXRX_ENABLE vừa cho phép truyền và vừa cho phép nhận.
STOP: số bit STOP sử dụng tương ứng ở trong code là UART1_STOPBITS_1. o CLKEN : có cho phép chân CLK hoạt động hay không(ở STM8S003F3P6 là chân PD4). Nếu là giao tiếp không đồng bộ thì không cho phép tương ứng với UART1_SYNCMODE_CLOCK_DISABLE trong code.
Link tải chương trình ngắt nhận uart và gửi lại lên máy tính
Link tải chương trình truyền kí tự lên máy tính dùng hàm printf
if(UART1_GetITStatus(UART1_IT_RXNE) != RESET)
ReplyDelete{
// handle
}
UART1_ClearITPendingBit(UART1_IT_RXNE);
dùng ngắt nhận thì dùng GetIT chứ nhỉ AD