STM32系列CPU的UART5应用的惨痛教训
在使用STM32F103ZET6做一个24位高速AD采样的项目中,用到了串口5,程序启动运行却时好时坏,始终找不到问题所在,每次执行初始化USART5_Init(115200);时程序运行就不稳定。但是每次启动时采样板和电脑通过ULInk或J-Link连接时,却每次都运行正常。
串口5的初始化函数部分是正确的,经一步步屏蔽函数内的程序行,发现屏蔽最后一行的USART_Cmd(UART5, ENABLE); 时程序每次运行均正常。
void USART5_Init(u32 bound)
{
…
USART_ClearFlag(UART5, USART_FLAG_RXNE);
USART_ITConfig(UART5, USART_IT_RXNE, ENABLE);
USART_Cmd(UART5, ENABLE);
}
然后就去查看startup_stm32f10x_hd.s文件,发现对串口4和串口5,其中断响应函数名的定义是这样的:
DCD UART4_IRQHandler ; UART4
DCD UART5_IRQHandler ; UART5
而我将串口5的中断响应函数名写成了
void USART5_IRQHandler (void)
{
…
}
但是编译器并没有报错,致使一使能串口5中断时,系统找不到中断的入口,造成程序运行紊乱。
同时也要注意,同一个中断源的中断响应函数只能有一个,不能对同一个中断源写两个或两个以上的中断响应函数。