Khối hàm API của UART nằm trong 2 tập tin cmx_uart.h (chứa khai báo hàm) & cmx_uart.c (chứa định nghĩa hàm): - void cmxUart.init(cmxUART_NAME uart, cmxTRANSFER_MODE tfmode) : khởi tạo UART ở chế độ Polling hoặc Interrupt với tốc độ baudrate mặc định là 115200, 8bit data, No parity, 1 stop bit, No Hardware flow control.
- void cmxUart.baud(cmxUART_NAME uart, uint16_t baudrate): thay đổi tốc độ baudrate
- void cmxUart.format(cmxUART_NAME uart, cmxUART_DATA_FMT bits, cmxUART_PARITY parity, cmxUART_STOP_BITS stop_bits): thay đổi chiều dài data (8bit hoặc 9bit), Parity (No, Even, Odd), stop bit (1bit hoặc 2 bit)
- void cmxUart.print(cmxUART_NAME uart, uint8_t *s, uint16_t n): xuất chuỗi ra cổng UART có hoặc không quan tâm đến kí tự kết thúc chuỗi NULL (‘\0’).
- void cmxUart.putc(cmxUART_NAME uart, uint8_t c, cmxDATA_PIPELINE_TYPE pipeline): ghi dữ liệu vào bộ đệm hoặc ghi trực tiếp vào thanh ghi data của UART.
- uint8_t cmxUart.getc(cmxUART_NAME uart, uint8_t *c, cmxDATA_PIPELINE_TYPE pipeline) : đọc về dữ liệu từ bộ đệm hoặc đọc trực tiếp từ thanh ghi data của UART.
- uint16_t cmxUart.txdatalen(cmxUART_NAME uart): trả về n byte dữ liệu đang chờ xử lí trong bộ đệm truyền.
- uint16_t cmxUart.rxdatalen(cmxUART_NAME uart): trả về n byte dữ liệu đang chờ xử lí trong bộ đệm nhận.
- uint8_t cmxUart.setTxIntCb(cmxUART_NAME uart, cmxUartIntHandler tx_inthandler, uint8_t *tx_ringbuf, uint16_t size): cài đặt hàm xử lí ngắt truyền và bộ đệm truyền cùng với kích thước của bộ đệm.
- uint8_t cmxUart.setRxIntCb(cmxUART_NAME uart, cmxUartIntHandler rx_inthandler, uint8_t *rx_ringbuf, uint16_t size): cài đặt hàm xử lí ngắt nhận và bộ đệm nhận cùng với kích thước của bộ đệm.
Trong ví dụ này chúng ta sẽ dùng cổng USART1 có pin PA9(TXD1) và PA10(RXD1) của chíp STM32F103 kết nối với máy tính qua cổng RS232. Cổng USART1 được cấu hình ở chế độ ngắt truyền-nhận. Chương trình sẽ truyền ngược lại bất kì kí tự nào được nhận từ máy tính. Chương trình được viết trên nền Keil-MDK4.2 và kít OPENCMX-STM3210D:  #include “cmx.h” // declare buffer and ISR (Interrupt Service Routine) for transmit-receive uint8_t tx_buf[32]; uint8_t rx_buf[32]; void USART1_TxIntHandler(void); void USART1_RxIntHandler(void); /** * @brief Main program. * @param None * @retval None */ int main(void) { uint8_t byte; /* init uart1 with interrupt mode */ cmxUart.init(UART_1, IT_MODE); /* set tx, rx interrupt call back function with buffer size is 32bytes */ cmxUart.setTxIntCb(UART_1, USART1_TxIntHandler, tx_buf, 32); cmxUart.setRxIntCb(UART_1, USART1_RxIntHandler, rx_buf, 32); #ifdef CMX_INT_HANDLER // this Macro is defined in ..\OpenCMX\cmx_api\config\cmx_appconf.h cmxNvic.init(); // the last function call for system interrupt initiation, after other peripheral is //initialized in case one or more interrupt is used #endif cmxUart.print(UART_1, "Please type some characters...\r\n", 0); /* Insert delay */ Delay(5); /* main program */ while(1) { //wait until receive at least one data while(!cmxUart.rxdatalen(UART_1)); //get one data from receive buffer cmxUart.getc(UART_1, &byte, RX_PIPELINE); //put one data to transmit buffer cmxUart.putc(UART_1, byte, TX_PIPELINE); } } /** * @brief These functions below handle USART1 interrupt request. * @param None * @retval None */ void USART1_TxIntHandler(void) { uint8_t byte; /* The interrupt was caused by the transmit register become empty. Are there any more data to transmit? */ if (cmxUart.txdatalen(UART_1)) { /* get data from tx buffer */ cmxUart.getc(UART_1, &byte, TX_PIPELINE); /* write data to uart register */ cmxUart.putc(UART_1, byte, BYPASS_PIPELINE); } else // no more data to transmit {cmxUart.setTxLineStatus(UART_1, DISABLE);// disable transmit line} } void USART1_RxIntHandler(void) { uint8_t byte; /* get data from uart register */ cmxUart.getc(UART_1, &byte, BYPASS_PIPELINE); /* push data to rx buffer */ cmxUart.putc(UART_1, byte, RX_PIPELINE); }  Chú ý: • Trong ví dụ này chúng ta không thêm tập tin stm32f10x_it.c (OpenCMX\chip_vendor_stdperiph_lib\ST\STM32F10x_App_Config) vào project là vì chúng ta xử dụng phương thức xử lí ngắt của thư viện Opencmx. • stm32f10x_it.c : tập tin này do người dùng tự định nghĩa, không phải là tập tin hệ thống của thư viện ngoại vi chuẩn, nên có thể thêm hoặc không thêm tập tin này vào Project. Tập tin này được tạo sẵn cho người dùng dễ dàng định nghĩa các hàm xử lí ngắt. Sau khi biên dịch chương trình xong, các bạn có thể chạy simulink trên Keil để xem terminal UART1 của Keil hiển thị thông tin hoặc nạp chương trình (Opencmx.hex) vào kít để chạy thử.   Sau khi chạy Simulink, các bạn có thể gõ vài chữ vào Terminal UART1 của Keil, các bạn sẽ thấy khi UART1 của MCU nhận được kí tự và sẽ xuất ngược kí tự đó lên Terminal, kết quả là các bạn thấy được các kí tự mà mình vữa gõ. |