记录一下开启低功耗串口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;
}
|