简介
在上一篇我们使用了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);
}至此串口的接收/发送功能已经完成适配。
我要赚赏金
