Basics
Tôi biết rằng bạn vẫn đang quan tâm đến từ viết tắt UART, nhưng đừng lo lắng nó rất đơn giản. Không biết từ Universal xuất phát từ đâu nhưng, Asynchronous có rất nhiều ý nghĩa. Hình dưới đây cho thấy kết nối điển hình của thiết bị nối tiếp với MCU. Về cơ bản có các đường Truyền (Tx) và Nhận (Rx) và một điểm chung.
Bây giờ, hãy tưởng tượng chúng ta muốn gửi một số dữ liệu như hình dưới đây:
Thiết bị nhận không xác định được thời lượng của '1' hoặc '0'. Do đó nó không đồng bộ. Điều này được giải quyết bằng cách đồng ý về tốc độ dữ liệu chung của cả hai thiết bị, được gọi là Tốc độ truyền.
Bạn sẽ thấy tốc độ truyền điển hình là 4800, 9600, 19200, 115200, v.v. Atmega32 cho phép bạn chọn tốc độ truyền bạn muốn. Bạn cần nhìn vào tốc độ truyền của thiết bị giao tiếp để biết đó là giá trị mặc định. Thông thường, hầu hết các thiết bị được đặt thành 9600. Đừng dùng lời của tôi cho nó, hãy kiểm tra biểu dữ liệu.
Hãy để chúng tôi tiếp tục và cấu hình Atmega32 Hardware UART để giao tiếp với máy tính và gửi / nhận các chuỗi dữ liệu.
Code
- #include "uart.h"
- int main()
- {
- UART_Init(9600);
- while(1)
- {
- UART_Printf("Welcome to AVR Serial Programming by ExploreEmbedded\n\r");
- }
- return (0);
- }
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
RXC | TXC | UDRE | FE | DOR | PE | U2X | MPCM |
UCSRB | |||||||
---|---|---|---|---|---|---|---|
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
RXCIE | TXCIE | UDREIE | RXEN | TXEN | UCSZ2 | RXB8 | TXB8 |
♦ Bit 4 - RXEN: Receiver Enable
Writing this bit to one enables the USART Receiver.
♦ Bit 3 - TXEN: Transmitter Enable
Writing this bit to one enables the USART Transmitter.
UCSRC | |||||||
---|---|---|---|---|---|---|---|
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
URSEL | UMSEL | UPM1 | UPM0 | USBS | UCSZ1 | UCSZ0 | UCPOL |
♦ Bit 2:1 - UCSZ1:0: Character Size
The UCSZ1:0 bits combined with the UCSZ2 bit in UCSRC sets the number of data bits ( Character Size) in a frame the Receiver and Transmitter use.
♦ Bit 7 - URSEL: Register Select
The URSEL must be one when writing the UCSRC.
UBRRH | UBRRL | ||||
---|---|---|---|---|---|
D15 | D14 | D13 | D12 | D11:D8 | D7:D0 |
URSEL | - | - | - | UBRR[11:8] | UBRR[7:0] |
♦ Bit 11:0 - UBRR11:0: USART Baud Rate Register
Đây là một thanh ghi 12 bit chứa tốc độ truyền USART. UBRRH chứa 4 bit quan trọng nhất và UBRRL chứa 8 bit ít quan trọng nhất của tốc độ truyền USART.
- void UART_Init(uint32_t v_baudRate_u32)
- {
- UCSRA= 0x00; // Clear the UASRT status register
- UCSRB= (1<<RXEN) | (1<<TXEN); // Enable Receiver and Transmitter
- UCSRC= (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0); // Async-mode
- UART_SetBaudRate(v_baudRate_u32);
- }
Hàm UART_SetBaudRate () tính tổng các giá trị thành tập cho các thanh ghi thích hợp như bên dưới.
- void UART_SetBaudRate(uint32_t v_baudRate_u32)
- {
- uint16_t RegValue;
- if((v_baudRate_u32 >= C_MinBaudRate_U32) && (v_baudRate_u32<=C_MaxBaudRate_U32))
- {
- /* Check if the requested baudate is within range,
- If yes then calculate the value to be loaded into baud rate generator. */
- RegValue = M_GetBaudRateGeneratorValue(v_baudRate_u32);
- }
- else
- {
- /*Invalid baudrate requested, hence set it to default baudrate of 9600 */
- RegValue = M_GetBaudRateGeneratorValue(9600);
- }
- UBRRL = util_ExtractByte0to8(RegValue);
- UBRRH = util_ExtractByte8to16(RegValue);
- }
HÀM THƯ VIỆN UART.
- void UART_Init(uint32_t v_baudRate_u32);
- void UART_SetBaudRate(uint32_t v_baudRate_u32);
- void UART_TxChar(char v_uartData_u8);
- char UART_RxChar(void);
- void UART_TxString(char *ptr_string);
- uint8_t UART_RxString(char *ptr_string);
- void UART_TxNumber(uint8_t v_numericSystem_u8, uint32_t v_number_u32, uint8_t v_numOfDigitsToTransmit_u8);
- void UART_TxFloatNumber(float v_floatNumber_f32);
- void UART_Printf(const char *argList, ...);