这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 【S32K146车规级MCU】使用S32DS适配Uart

共4条 1/1 1 跳转至

【S32K146车规级MCU】使用S32DS适配Uart

工程师
2025-02-21 20:47:24     打赏

简介

       在上一篇我们使用了S32DS配置了FreeRTOS但是打印使用了IAR 的 LOG 断点,我们在此基础上继续添加Uart 的配置用于输出log 信息及适配基于uart 的shell  终端。

时钟配置

本次试验使用uart0 串口,开启对应的时钟配置,时钟源配置为SOSC DIV2的16M时钟,以下为S32DS的时钟配置信息及路由状态。

image.png

image.pngimage.png

生成的配置代码中的时钟的gate/clock source/倍频/分频 系数的配置

image.png

引脚配置

配置GPIO PC8/PC9为uart 功能

image.png

串口配置

在串口外设配置界面配置UART功能参数使用中断方式,对应波特率为115200

image.png

生成串口初始化配置代码如下

image.png

功能验证

在之前适配FreeRtos 的代码基础上添加,pin 和 uart 初始化的处理

image.png

修改代码在每个任务内添加周期打印

image.png

通过串口助手发现uart 已经正常输出log了,周期的输出task1/task2 的信息。

image.png

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);

}

至此串口的接收/发送功能已经完成适配。


专家
2025-02-21 22:59:16     打赏
2楼

感谢分享


专家
2025-02-21 23:03:03     打赏
3楼

感谢分享


专家
2025-02-21 23:09:46     打赏
4楼

感谢分享


共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]