本来用着USART1很好用,可是因为想后续引入USMART调试,所以就想换成USART2,结果就费劲了...
看了论坛各位的帖子,好多都是USART2没有配置出来,因此结合今次调试,总结了几点,欢迎补充~~~
(1)低级失误:时钟配置错误
在论坛里看到好多位没有配置USART2成功的,有几个都是犯了这个错误:把USART2当成是APB2下的外设。
但事实上USART2是APB1的,这是和USART1的根本区别,USART2只能最大去到36MHz。
可能是大家都是直接搬USART1的实验代码,然后直接把USART1改成USART2所导致的吧....
而且,注意用keil仿真时,就算没有使能对应的时钟,USART2的UE还是会被使能的,因此必须还要查看APB Bridge1才能发现。
(2)低级失误:使能IO口错误
(3)使能的中断标志位没有及时清空
奉劝各位,在使能某中断标志之前,还有进入中断函数后,都必须养成良好习惯:清空使能的中断标志位。之前有次配置USART1时,就是在使能完USART_IT_TC前没有清空,在中断函数内又没有清空,结果导致一使能就马上无端端地进入了中断卡死了。这次配置USART2时,由于我只是想STM32执行发送,暂时不执行接收,所以没有写中断函数。结果就悲剧了...有时候可以接收有时候接收到一半就停了。后来我在发送函数里增加了LED闪烁功能,每发送一位闪烁一次,结果发现LED闪了随机次数后就变成了常亮或常灭,而且非常随机。。。经过思考后,想到了由于RX的GPIO是配置为浮空输入,由于高阻态是很容易受外界的电磁场、静电等影响,导致端口被随机地上拉或下拉。后来在中断函数内增加清空USART_IT_RXNE就没事了。。。很奇怪,USART1貌似不清空也没事啊。。。
(4)电平不兼容
这个最大的问题在于,软件调试很完美,串口助手调试也很完美,结果到了上下位机通信时就悲剧了。。。注意:USART2的端口PA2、PA3是非FT的,也就是说是不能接收5V电平的,所以对于5V电平系统,一定会导致收到了乱码。本人是用STM32的USART2,控制GPU,后来经过电平转换后的确没问题了,但是非常不稳定的说。。。估计是由于电平转换芯片的速率跟不上?
总之就是:还是USART1好啊
欢迎大家继续补充~~~~~
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
感谢同学的分享,我也是把usart1的代码移植到usart2上面时出问题,现在终于发现问题出现在哪了,就是APB的时钟使能有问题,usart2是APB1上的外设,所以应该使能APB1的时钟,现在已经调好了,时钟这一部分修改的代码如下:
[mw_shl_code=applescript,true]RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); //使能usart2时钟;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA时钟[/mw_shl_code]
一周热门 更多>