完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛
使用rtt studio基于芯片创建了STM32h750的基础工程,log串口选用的LPUART1(tx:PB6/rx:PB7) 编译下载后程序可以运行,但无log输出,硬件上串口指示灯变常亮。 问题原因: 1. 缺少LPUART1定义 这个问题在编译时就会报错,在uart_config.h文件末尾仿造其他串口增加配置即可
2. 缺少LPUART1对应的引脚定义
上述代码是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(第三点问题的时候用到),增加如下两行:
3. 当前串口号定义判断不合理 问题还在stm32_gpio_configure()尾部。正常来讲1~8号串口的命名为uartx,rtt通过串口名字的第4字节来计算串口号,这样对于低功耗串口lpuart1的计算就会出现偏差,我增加了一下判断,当uart_num大于8的时候就赋值为9
|
|
相关推荐
1个回答
|
|
|
根据用户提供的信息,问题是由于RT-Thread Studio创建的STM32H750工程中,使用LPUART1作为日志输出串口时,无法输出日志,且串口指示灯常亮。用户已经指出在`uart_config.h`中缺少LPUART1的定义,并手动添加了配置。但问题仍然存在,因此需要进一步分析。 可能的原因: 1. 时钟配置问题:LPUART1的时钟源可能未正确配置。LPUART1通常使用低功耗时钟源(如LSE),而其他串口使用PCLK。如果时钟没有使能或配置不正确,串口无法工作。 2. 引脚配置问题:虽然定义了引脚,但可能引脚复用功能未正确配置。 3. 驱动支持问题:RT-Thread的串口驱动可能未完全支持LPUART1,特别是在低功耗模式下。 用户已经添加了LPUART1的配置,但可能还需要在驱动中确保LPUART的时钟和初始化与常规UART不同。 临时解决办法(基于用户提供的信息扩展): 1. 在`uart_config.h`中添加LPUART1的配置(用户已做): ```c #if defined(BSP_USING_LPUART1) #ifndef LPUART1_CONFIG #define LPUART1_CONFIG { .name = "lpuart1", .Instance = LPUART1, .irq_type = LPUART1_IRQn, } #endif #endif ``` 2. 检查并配置LPUART1的时钟: - LPUART1的时钟源可能来自不同的PLL或外部低速时钟(LSE)。在`drv_clk.c`或类似时钟配置文件中,确保LPUART1的时钟已使能并配置正确。例如,在STM32H7中,LPUART1的时钟由RCC_BDCR寄存器控制,时钟源可以是HSI、CSI、LSE或PLL。 3. 修改串口驱动初始化代码: - 在`drv_usart.c`中,找到串口初始化函数(如`stm32_init`)。需要为LPUART1添加特殊的初始化处理,因为LPUART的寄存器与普通UART略有不同(例如,控制寄存器CR1、CR2等,以及波特率寄存器BRR的计算可能不同)。 - 在波特率设置部分,LPUART的波特率计算可能不同,因为它的时钟源频率较低(通常是32.768kHz或更低)。需要根据实际时钟源计算。 4. 检查中断向量表: - 确保LPUART1的中断服务函数被正确注册。在`stm32h7xx_it.c`中,应该有对应的中断服务函数,并调用RT-Thread的串口中断处理函数。 5. 如果以上步骤仍不能解决,可以尝试在初始化LPUART1之前,先切换其时钟源到一个已知可用的时钟(例如,暂时使用HSI作为时钟源测试)。 详细步骤(以RT-Thread的BSP为例): - 打开`board.h`,检查是否定义了`BSP_USING_LPUART1`,并确认引脚定义正确。 - 在`drv_usart.c`中,修改串口初始化函数,针对LPUART1进行特殊处理。例如: ```c static int stm32_init(struct rt_serial_device *serial) { struct stm32_uart *uart; RT_ASSERT(serial != RT_NULL); uart = rt_container_of(serial, struct stm32_uart, serial); /* 配置串口引脚 */ stm32_gpio_configure(uart->config->tx_pin, uart->config->tx_pin_cfg); if (uart->config->rx_pin != RT_NULL) { stm32_gpio_configure(uart->config->rx_pin, uart->config->rx_pin_cfg); } /* 使能串口时钟 */ if (uart->Instance == USART1) { __HAL_RCC_USART1_CLK_ENABLE(); } // ... 其他串口 else if (uart->Instance == LPUART1) { __HAL_RCC_LPUART1_CLK_ENABLE(); /* 设置LPUART1时钟源,例如使用LSE */ // 注意:需要根据实际板载时钟源配置 __HAL_RCC_LPUART1_CONFIG(RCC_LPUART1CLKSOURCE_LSE); } /* 初始化串口 */ uart->handle.Instance = uart->Instance; uart->handle.Init.BaudRate = uart->config->baud_rate; uart->handle.Init.WordLength = UART_WORDLENGTH_8B; uart->handle.Init.StopBits = UART_STOPBITS_1; uart->handle.Init.Parity = UART_PARITY_NONE; uart->handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; uart->handle.Init.Mode = UART_MODE_TX_RX; /* 对于LPUART1,可能需要设置过采样率 */ uart->handle.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&uart->handle) != HAL_OK) { return -RT_ERROR; } /* 使能中断 */ if (uart->config->irq_type != 0) { HAL_NVIC_SetPriority(uart->config->irq_type, 0, 0); HAL_NVIC_EnableIRQ(uart->config->irq_type); } return RT_EOK; } ``` 6. 注意:LPUART的波特率设置与普通UART可能不同,因为其时钟源频率较低。在计算波特率时,需要根据实际输入的时钟频率。例如,如果使用LSE(32768Hz),那么设置115200的波特率是不现实的,因为最大波特率只能达到32768/16=2048。所以,通常LPUART用于低波特率通信。如果用户需要较高的波特率,可能需要选择其他时钟源。 7. 另外,检查`stm32h7xx_hal_conf.h`中是否启用了LPUART模块: ```c #define HAL_UART_MODULE_ENABLED #define HAL_LPUART_MODULE_ENABLED // 确保这一行存在 ``` 8. 如果以上步骤仍然不能解决问题,可能需要使用调试器检查LPUART1的寄存器配置,特别是BRR寄存器的值,确认波特率设置是否正确。 希望这些步骤能帮助解决问题。同时,建议用户向RT-Thread官方提交issue,以便官方在后续版本中修复对LPUART的支持。 根据您描述的问题现象和初步分析,结合RT-Thread对STM32 LPUART的支持现状,以下是完整的解决方案和临时修复步骤: 问题根本原因
临时解决方案(完整步骤)1. 修改串口配置文件 |
|
|
|
|
只有小组成员才能发言,加入小组>>
184个成员聚集在这个小组
加入小组rtstudio是否可像keil加载ini解决虚拟串口与mcu串口通讯?
1212 浏览 0 评论
【Vision Board创客营连载体验】基于RA8D1-Vision Board的自动路径规划小车
1776 浏览 1 评论
【Vision Board创客营连载体验】基于Vision Board的垃圾分类
2156 浏览 0 评论
【Vision Board创客营连载体验】使用 Vision Board 做一个 UVC Camera
1777 浏览 0 评论
【Vision Board创客营连载体验】TinyMaix进行手写数字识别
2006 浏览 0 评论
1465浏览 5评论
在RT-Thread Studio中新建的stm32f407-atk-explorer工程运行qemu失败,是什么原因引起的?
1767浏览 3评论
为什么rt_device_read()只能读取到两个字节数据?
364浏览 3评论
连得上热点,但是ping baidu.com出现timeout,请问跟什么有关?
422浏览 3评论
421浏览 2评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 01:08 , Processed in 0.852629 second(s), Total 77, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1792
