你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32L4零基础学习笔记(六)串口通讯之踩到的坑

[复制链接]
D5Power 发布时间:2017-11-12 10:40
本帖最后由 D5Power 于 2017-11-16 16:45 编辑 ! L6 d! B$ F3 U( [

! Q  S3 M5 p: `4 e  E7 _2 ]
" F6 e9 g& p# I. {& G7 v2 H
总结下这几天踩过的坑

7 W) J" R; q  U8 W' n% E1 Q6 N
一、第一个坑,中断设置

& [/ _' ^1 X$ a* l  [* p
一直天真的以为,串口的中断是可以“无需人工设置,自主自发自动”进行的。结果自然是被打脸了。无论如何调试,也进不到中断里去。查阅资料后发现,依然是需要在STM32CubeMX中设置好。设置的位置就在Configuration中的USART2设置(对应你自己要用的串口),如下图所示,将NVIC Setting中的USART2 global interrupt 勾选Enabled,启用中断。英语学习时间:NVIC=
Nested Vectored Interrupt Controller ,即嵌套中断向量控制器。
0.jpg

& Z; W$ s* S& q
二、第二个坑 波特率

, p3 h/ }  z! Y
如笔记五所记录的内容,在使用开发板发数据到电脑的时候(通过printf方法),数据完全正常,没有任何问题。而当我试着把电脑发送过来的数据进行解析时,却发现开发板收到的数据一直和接收的数据不一致。猜测是波特率不符的原因。但是从表面上看,开发板和SSCOM设置的波特率都是115200,应该没错。想起自己没有设置时钟频率,又跑去STM32CubeMX中,把时钟频率设置成了80MHz,依旧无效。最后考虑是不是达不到这么高的波特率,在把波特率降低到4800后,终于成功了。

! E0 N) r$ q4 _
根据网上查到的资料,波特率和时钟频率是有关系的,至于具体的关系是怎样的,现在没有去深究。或许不久就会回过头来继续研究这个问题。
$ O, V8 }5 i8 ^1 C5 a: X' Q3 W7 E8 b
三、波特率和HAL_UART_Transmit
; z! |# y/ g7 o
HAL_UART_Transmit的第三个参数,用来指定最大的发送时间。如果超过这个发送时间还没有发送成功,那么就会返回发送超时。更郁闷的是,如果产生了发送超时,那么后面连接收中断都不会触发了(本问题有待深究)。
, j* {% B, M4 t
由于我设置的波特率是4800,也就是说,每秒可以发送4800Bit数据,也就是600字节(Byte)。那么,发送1个字节所需要的时间即为1000/600,大约为1.6毫秒。所以,如果我的传送代码直接复制网上的代码:
5 Z6 P) F. a, W& B# b: n+ ~. ?8 X
HAL_UART_Transmit(&huart,(uint8_t *)p,1);

& ~2 S; J/ n) U4 [
给定1毫秒的最大发送时间,那么必然会进入超时。结果就是数据发送出去了,但不会再触发接收中断。因此,需要针对波特率进行调整。代码如下:

: a3 q5 A2 t( x% p
#define BAUDRATE 4800
#define SEND_TIME_PER_BYTE 2

" Z( {$ ?+ T5 p$ ?2 {$ `$ u
定义波特率和发送1个字节所需要的最小时间(2毫秒)

4 `/ U0 s0 ]6 V
void send(uint8_t *p,uint8_t size)
{
        HAL_UART_Transmit(&huart2,p,size,size*SEND_TIME_PER_BYTE);
}

  z) U2 e7 s- g! B% ]
定义一个发送方法,自动根据发送的数据尺寸来计算最小发送时间。但是我觉得这只能算是个临时的方法,最终还是要解决超时而导致接收中断不能触发的问题。这笔暂且记下。

2 ^* L, W; _1 U" D
4 Q+ D: H( x) X. X

& Q5 ]2 T* ?. z3 I( t% b
----------------我是淫荡的分割线----------------
' z& z3 g9 f$ |
编写中的笔记会在我个人的公众号进行,请各位高手斧正。

9 h$ f6 ?$ N3 k: h2 x# {  D# n 083956bwddhh6ankua6poh.jpg 2 Y: t' s4 J! f3 x& I# h0 X
关于单片机、H5游戏开发和微信小程序
- N* Y" S3 D9 X
收藏 1 评论2 发布时间:2017-11-12 10:40

举报

2个回答
joezhuang007 回答时间:2018-7-29 08:24:24
学习
熊猫仙 回答时间:2019-7-2 09:19:20
设置串口全局中断后,资源占用一下多了3.4k,导致FLASH不够用了,有解吗?
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版