RT-Thread Studio中STM32F030系列芯片UART3~UART6使用问题总结
RT-Thread Studio中STM32F030系列芯片UART3~UART6使用问题总结
在调试STM32F030RCT6的过程中,发现使用UART3~UART6时,无论是使用rt-thread Studio(1.1.3) 还是使用BSP(自制的030RCT6 BSP) 如果直接使用rt-thread4.0.2的代码,这几个串口都无法直接正常工作。但同样的代码在STM32F103VCT6,STM32F407ZGT6 (我只在这两个芯片上测试过,其它未知)却可无修改的正常运行。同时如果直接使用STM32F030RCT6的UART1、UART2则都能正常工作,无问题。
经过摸索,发现主要是如下两个问题:
问题1、直接编译rt-thread Studio代码,提示 identifier “UARTX_CONFIG” is undefined,其中的UARTX为你使用的串口,比如"UART3_CONFIG、"UART6_CONFIG
典型问题表现:
STM32F030RCT6 增加UART6出错
STM32F0系列"UART3_CONFIG" is undefined 错误
该问题是在uart_config.h文件中仅默认配置了UART1、UART2。要使用UART3~UART6需要手工在该文件中增加相应配置。比如使用UART6,需手工增加如下代码段:
#if defined(BSP_USING_UART6)
#ifndef UART6_CONFIG
#define UART6_CONFIG \
{ \
.name = "uart6", \
.Instance = USART6, \
.irq_type = USART3_6_IRQn, \
}
#endif /* UART6_CONFIG */
#endif /* BSP_USING_UART6 */
问题2、UART3~UART6可正常输出,但无法输入
典型问题表现:
F030RCT6 UART3 作为console 能输出但无法输入
STMF030 控制台选择串口3,控制台无法输出,只能接收
经过分析,这个问题的原因是未进入串口的接收中断。
在stm32f030xc.h文件中,定义了如下与串口中断有关的STM32F0 specific Interrupt Numbers,其中UART1、UART2都是独立定义的。但UART3~UART6仅定义了一个中断number
在解决第一个问题时,我们定义的UART6_CONFIG.irq_type = USART3_6_IRQn, 其中的中断number是USART3_6_IRQn,与stm32f030xc.h文件中的定义是一致的。如果这里仅配置UART6_CONFIG.irq_type = USART6_IRQn 是会报错的,因为USART6_IRQn并无定义。
但是在rt-thread 4.0.2的drv_uart.c中,对uart6的中断函数是如下定义的:
其函数名称是USART6_IRQHandler(void),其中的USART6_IRQ需要与stm32f030xc.h文件中定义的中断number名对应起来。通过前面的分析stm32f030xc.h中定义的是USART3_6_IRQn,当UART3~UART6的串口中断发生时,系统会找void USART3_6_IRQHandler(void)函数。但drv_uart.c中却定义的是形如USART3_IRQHandler(void)、USART6_IRQHandler(void)的函数。按名称根本找不到中断函数。
解决办法:将drv_uart.c中使用的串口的中断函数名改为USART3_6_IRQHandler,如下图:
再次编译下载,串口可正常输入了。
这样改动的一个问题是:当同时使用UART3~UART6中的多个串口时,由于其中断响应函数都是同一个,需要自己在中断函数USART3_6_IRQHandler() 中判断是来自哪个串口的中断。
如果直接在stm32f030xc.h中更改,给每个串口定义一个独立的Interrupt Number,这样就无需改动drv_uart.c文件,原理上应该也是可以的,等有时间验证一下。
上一篇: MVP,MVVM架构模式