嵌入式技术论坛
直播中

fanB

9年用户 1546经验值
擅长:20615
私信 关注
[经验]

STM32F030RCT6芯片的UART3~UART6串口都无法正常工作是怎么回事

在调试STM32F030RCT6的过程中,发现使用UART3~UART6时,无论是使用rt-thread Studio(1.1.3) 还是使用BSP(自制的030RCT6 BSP) 如果直接使用rt-thread4.0.2的代码,这几个串口都无法正常工作。但同样的代码在STM32F103VCT6,STM32F407ZGT6 (我只在这两个芯片上测试过,其它未知)却可无修改的正常运行。同时如果直接使用STM32F030RCT6的UART1、UART2则都能正常工作,无问题。
从下面的几个案例看,F030系列使用UART3~UART6时,常见的两个主要问题如下:
问题1、直接编译rt-thread Studio代码,提示 identifier “UARTX_CONFIG” is undefined,其中的UARTX为你使用的串口,比如”UART3_CONFIG、”UART6_CONFIG
该问题是在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文件,原理上应该也是可以的,等有时间验证一下。


原作者:pkokoc

更多回帖

发帖
×
20
完善资料,
赚取积分