反馈rtt串口驱动对低功耗串口lpuart1不兼容的问题

发布于 2020-06-15 22:46:45
  • 本帖最后由 Jone 于 2020-6-15 22:56 编辑 *

记录一下开启低功耗串口lpuart1的问题点和临时解决办法,希望官方早日修复

问题现象:

使用rtt studio基于芯片创建了stm32h750的基础工程,log串口选用的LPUART1(tx:PB6/rx:PB7)
编译下载后程序可以运行,但无log输出,硬件上串口指示灯变常亮

问题原因:

1. 缺少LPUART1定义

这个问题在编译时就会报错,在uart_config.h文件末尾仿造其他串口增加配置即可

#if defined(BSP_USING_LPUART1)
#ifndef LPUART1_CONFIG
#define LPUART1_CONFIG                                                \
    {                                                               \
        .name = "lpuart1",                                            \
        .Instance = LPUART1,                                         \
        .irq_type = LPUART1_IRQn,                                    \
        .tx_pin_name = BSP_LPUART1_TX_PIN,                            \
        .rx_pin_name = BSP_LPUART1_RX_PIN,                            \
    }
#endif /* LPUART1_CONFIG */

#if defined(BSP_LPUART1_RX_USING_DMA)
#ifndef LPUART1_DMA_RX_CONFIG
#define LPUART1_DMA_RX_CONFIG                                         \
    {                                                               \
        .Instance = LPUART1_RX_DMA_INSTANCE,                          \
        .channel = LPUART1_RX_DMA_CHANNEL,                            \
        .dma_rcc = LPUART1_RX_DMA_RCC,                                \
        .dma_irq = LPUART1_RX_DMA_IRQ,                                \
    }
#endif /* LPUART1_DMA_RX_CONFIG */
#endif /* BSP_LPUART1_RX_USING_DMA */

#if defined(BSP_LPUART1_TX_USING_DMA)
#ifndef LPUART1_DMA_TX_CONFIG
#define LPUART1_DMA_TX_CONFIG                                         \
    {                                                               \
        .Instance = LPUART1_TX_DMA_INSTANCE,                          \
        .channel = LPUART1_TX_DMA_CHANNEL,                            \
        .dma_rcc = LPUART1_TX_DMA_RCC,                                \
        .dma_irq = LPUART1_TX_DMA_IRQ,                                \
    }
#endif /* LPUART1_DMA_TX_CONFIG */
#endif /* BSP_LPUART1_TX_USING_DMA */
#endif /* BSP_USING_LPUART1 */

2. 缺少LPUART1对应的引脚定义

static const struct gpio_uart_af uart_afs[] =
{
        { .pin_index = GET_PIN(A,  0), .afs[0] = {.uart_num = UART_IS_TX|4, .af_num =  8}},
        { .pin_index = GET_PIN(A,  1), .afs[0] = {.uart_num = UART_IS_RX|4, .af_num =  8}},
        ...
}

上述代码是drv_usart.c中的stm32_gpio_configure()函数里的数组uart_afs的一部分片段。
第一行元素中.uart_num = UART_IS_TX|4表示引脚作为UART4的TX引脚,af_num = 8引脚复用号
同理,第二行是将PA1作为UART4的RX引脚,复用号也是8

然而uart_afs中无对LPUART的uart_num定义,我用的是B6和B7(AF8),把LPUART编号为9(第三点问题的时候用到),增加如下两行:

{ .pin_index = GET_PIN(B,  6), .afs[0] = {.uart_num = UART_IS_TX|9, .af_num =  8}},
{ .pin_index = GET_PIN(B,  7), .afs[0] = {.uart_num = UART_IS_RX|9, .af_num =  8}},

3. 当前串口号定义判断不合理

问题还在stm32_gpio_configure()尾部。正常来讲1~8号串口的命名为uartx,rtt通过串口名字的第4字节来计算串口号,这样对于低功耗串口lpuart1的计算就会出现偏差,我增加了一下判断,当uart_num大于8的时候就赋值为9

   /* get tx/rx pin index */
   uart_num = config->name[4] - '0';

   /* add by jone */
   if(uart_num > 8)
   {
     uart_num = 9;
   }

查看更多

关注者
0
被浏览
76
0 个回答
暂无答案,快来添加答案吧

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友