简介
在上一篇我们使用了S32DS配置了FreeRTOS但是打印使用了IAR 的 LOG 断点,我们在此基础上继续添加Uart 的配置用于输出log 信息及适配基于uart 的shell 终端。
时钟配置
本次试验使用uart0 串口,开启对应的时钟配置,时钟源配置为SOSC DIV2的16M时钟,以下为S32DS的时钟配置信息及路由状态。
生成的配置代码中的时钟的gate/clock source/倍频/分频 系数的配置
引脚配置
配置GPIO PC8/PC9为uart 功能
串口配置
在串口外设配置界面配置UART功能参数使用中断方式,对应波特率为115200
生成串口初始化配置代码如下
功能验证
在之前适配FreeRtos 的代码基础上添加,pin 和 uart 初始化的处理
修改代码在每个任务内添加周期打印
通过串口助手发现uart 已经正常输出log了,周期的输出task1/task2 的信息。
printf 函数对接
上面的打印直接调取的UART驱动函数,通常在项目打印会使用printf 函数,我们需要简单的修改即可完成printf 函数的对接,这样上述的函数内打印处理就可以替换为printf打印输出了。
size_t __write(int handle, const unsigned char *buffer, size_t size) { status_t ret; do{ ret = LPUART_DRV_SendDataPolling(INST_LPUART_1,buffer,size); } while( ret != STATUS_SUCCESS); return size; }
shell 适配
shell 的适配之前帖子(shell 适配) 有介绍,再此就不多赘述了,只要添加uart 的接收处理即可,对应uart 接收代码如下;
/******************************************************************************************************** * Private Type Declarations * *******************************************************************************************************/ typedef struct UartRecvType { RingBuffer ringbuff; uint8_t data; }UartRecvType; /******************************************************************************************************** * Private Variable Definitions * *******************************************************************************************************/ static UartRecvType uart_rx; /******************************************************************************************************** * Private Function Declarations * *******************************************************************************************************/ void uart_rx_callback(void *driverState, uart_event_t event, void *userData) { UartRecvType * Puart = (UartRecvType *)userData; if(event == UART_EVENT_RX_FULL) { /* Get date and write to ringbuffer */ RingBuffer_Write(&Puart->ringbuff,&Puart->data,1); } /* Start to recive uart data */ LPUART_DRV_ReceiveData(INST_LPUART_1,&Puart->data,1); } /******************************************************************************************************** * Global Function Declarations * *******************************************************************************************************/ void uart_init(void) { /* Init lpuart */ LPUART_DRV_Init(INST_LPUART_1,&lpUartState0,&lpuart_0_InitConfig0); /* Init Ringbuffer */ static uint8_t uart_rx_buff[128] = {0}; RingBuffer_Init(&uart_rx.ringbuff,uart_rx_buff,128); /* Enable uart rx irq and set rx callback */ LPUART_DRV_InstallRxCallback(INST_LPUART_1,uart_rx_callback,(void *)&uart_rx); /* Start to recive uart data */ LPUART_DRV_ReceiveData(INST_LPUART_1,&uart_rx.data,1); }
至此串口的接收/发送功能已经完成适配。