OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3416|回复: 5

关于USART2配置的几点小分享

[复制链接]

3

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2016-8-13
在线时间
14 小时
发表于 2016-11-27 20:23:11 | 显示全部楼层 |阅读模式
本来用着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好啊
欢迎大家继续补充~~~~~
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

61

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2017-1-6
在线时间
29 小时
发表于 2017-1-12 11:17:16 | 显示全部楼层
尼斯达 发表于 2016-12-7 16:46
刚开始我也是这里搞错了,弄了好几天才发现呢,哈哈~~

我也是改成了USART2,用的是原子哥的代码,但是最后主函数里面的printf打印的部分没用,还有是不是要用USART1下载完代码后,要把跳线冒拔了,把PA2接在RXD上,PA3接在TXD上,是这个意思吗
回复 支持 1 反对 0

使用道具 举报

4

主题

346

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3657
金钱
3657
注册时间
2016-2-21
在线时间
542 小时
发表于 2016-12-7 17:31:50 | 显示全部楼层
好贴,留名
回复 支持 1 反对 0

使用道具 举报

8

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2015-6-21
在线时间
41 小时
发表于 2016-12-7 16:04:00 | 显示全部楼层
本帖最后由 Allen.W 于 2016-12-7 16:07 编辑

感谢同学的分享,我也是把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]
回复 支持 反对

使用道具 举报

3

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2016-8-13
在线时间
14 小时
 楼主| 发表于 2016-12-7 16:46:24 | 显示全部楼层
Allen.W 发表于 2016-12-7 16:04
感谢同学的分享,我也是把usart1的代码移植到usart2上面时出问题,现在终于发现问题出现在哪了,就是APB的 ...

刚开始我也是这里搞错了,弄了好几天才发现呢,哈哈~~
回复 支持 反对

使用道具 举报

3

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2016-8-13
在线时间
14 小时
 楼主| 发表于 2016-12-7 16:46:12 | 显示全部楼层
Allen.W 发表于 2016-12-7 16:04
感谢同学的分享,我也是把usart1的代码移植到usart2上面时出问题,现在终于发现问题出现在哪了,就是APB的 ...

刚开始我也是这里搞错了,弄了好几天才发现呢,哈哈~~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-30 11:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表