|
一.串口输入输出测试1.1发送测试 hal_entry.c中 初始化串口 err = R_SCI_UART_Open(&g_uart0_ctrl, &g_uart0_cfg); assert(FSP_SUCCESS == err); 发送 uint8_t ch; fsp_err_t err = R_SCI_UART_Read(&g_uart0_ctrl, (uint8_t *)&ch, 1); if(FSP_SUCCESS != err) __BKPT(); 发送完进入中断设置标志 void user_uart_callback (uart_callback_args_t * p_args) { if(p_args->event == UART_EVENT_TX_COMPLETE) { uart_send_complete_flag = true; } } 等待标志发送完 while(uart_send_complete_flag == false){} uart_send_complete_flag = false; return ch; 1.2接收测试和发送类似 准备接收 uint8_t ch; fsp_err_t err = R_SCI_UART_Read(&g_uart0_ctrl, (uint8_t *)&ch, 1); if(FSP_SUCCESS != err) __BKPT(); 进入接收中断设置标志 void user_uart_callback (uart_callback_args_t * p_args) { if(p_args->event == UART_EVENT_RX_COMPLETE) { uart_read_complete_flag = true; } } 等待标志接收完 while(uart_read_complete_flag == false){} uart_read_complete_flag = false; return ch; 接收可以在接收中断打断点看是否进入中断 二.基于FIFO的串口驱动上述接口应用层不好使用,为了提供方便好用的应用层串口读写接口,我们来封装基于FIFO的串口驱动。接收中断接收数据到FIFO,读接口从FIFO取数,这样解耦了应用层底层操作。 发送也是类似,简单起见这里发送使用查询方式,接收使用中断方式。 2.1 fifo实现见《https://mp.weixin.qq.com/s/MvL9eDesyuxD60fnbl1nag 超级精简系列之十三:超级精简的循环FIFO,C实现》 代码见fifo.c/h这里不再赘述。 2.2 串口驱动见uart.c/h 先分配接收FIFO实例 static uint8_t s_uart_rx_buffer[1029]; static fifo_st s_uart_fifo_dev[1]= { { .in = 0, .len = 0, .out = 0, .buffer = s_uart_rx_buffer, .buffer_len = sizeof(s_uart_rx_buffer), }, }; 然后接收中断将数据写入fifo void user_uart_callback (uart_callback_args_t * p_args) { if(p_args->event == UART_EVENT_TX_COMPLETE) { uart_send_complete_flag = true; } if(p_args->event == UART_EVENT_RX_COMPLETE) { fsp_err_t err = R_SCI_UART_Read(&g_uart0_ctrl, s_rx_buffer, sizeof(s_rx_buffer)); if(FSP_SUCCESS != err) __BKPT(); uart_rx_cb(0, s_rx_buffer, 1); } } 串口读即查询fifo读即可 uint32_tuart_read(int id, uint8_t* buffer, uint32_t len) { uint32_t rlen; CriticalAlloc(); EnterCritical(); rlen = fifo_out(&(s_uart_fifo_dev[0]), buffer, len); ExitCritical(); return rlen; } 其他初始化和发送等见代码,不再赘述。 三. 测试不断读数据读到任意长度原样发送出去,代码如下 uint8_t rx_buffer[64]={'1','2','3',0x00}; uart_init(0,115200); uart_send(0, rx_buffer, sizeof(rx_buffer)); while(1) { uint32_t len = uart_read(0, rx_buffer, sizeof(rx_buffer)); if(len > 0){ uart_send(0, rx_buffer, len); } } 测试如下 看到收到内容和后原样返回 四. 总结使用基于FIFO的串口驱动设计,应用层只和FIFO打交道,解耦了应用和底层操作,接口使用非常方便。
|