很荣幸获得最后一批申请者的试用资格,最近工作比较忙,在收到板卡玩了几天之后就没仔细看了,今天开贴写出我的试用过程:
1. 实现STM32L053串口DMA接收不定长数据的功能
2. 详细介绍Yeelink物联网免费开发平台
3. 实现手机可以通过Yeelink远程获取到STM32L053的传感器数据以及实现控制
4. STM32L053与MSP430功耗对比
串口一直是一个MCU比较重要的部分,以前用STM32F1结合3.5的标准外设库开发起开觉得也很方便,可以很快上手,在ST推出HAL库之后,初次感觉比之前的库好复杂,其实主要还是教程少,不过看官方技术人员介绍HAL库以后是趋势,HAL很大的一个优点就是通用性好,在不同系列之间移植比较方便。串口发送数据简单,这里不多说,主要说下接收部分:
串口通讯一般有3中方式比较常用,轮询、中断和DMA,轮询方式为堵塞模式,在规定的时间内接收到指定的长度才行,这种用的比较少;中断模式为非堵塞模式,在接到数据进入中断就存入相应的缓冲区,可以设置相应的开始结束帧来判断数据的正确性,但在接收不定长数据的时候还要加多一个定时器来判断数据接收完成,在标准库还好,在HAL库中在每次接收完还要重新开启接收中断,还要指定长度,没有收到指定长度就一直等待,这样在接收不定长数据就不好处理;最后说下用DMA实现的方式,STM32有一个串口中断叫空闲中断,就是收到一帧数据结束后才进入空闲中断,配合串口DMA通道,可以将串口的接收特别是在数据很多的时候效果非常好。下面详细介绍
STM32Cube的介绍就不多说了,大家已经介绍很多了
1. 进入Pinout界面,选择为异步通讯方式
2. 时钟配置界面,这个感觉是最好的,完完全全让大家领悟的L053的时钟树,这里选择HIS RC,主频设为最高32MHz
3. 进入串口配置界面,首先是基本设置
4. 然后是开启串口DMA
5. 然后开启中断
6. 最后配置中断优先级
7. 然后配置工程设置
建议每个外设生成独立的源文件和头文件,自己看的也舒心,也方便管理
自动配置的就这么多了,下面打开自动生成的工程
有一点大家首先要注意,就是自己添加的代码一定要在USER CODE BEGIN和USER CODE END之间在重新更行工程之后才不会被删掉,首先定义变量,定义了接收缓冲大小,接收到数据的长度,一帧数据接收完标志,缓冲。
初始化代码都自动做好了,然后开启串口空闲中断,这里不要再开启串口其它串口中断了,
然后在主循环中在接收完标志位置位后,将接收到的数据原本的发送回去,重新开启下一次串口DMA接收
下面在中断函数中写入下面代码
主要是在串口发完一帧数据之后就进入这个中断函数,是发完一帧才会进入一次哦,是不是比直接用中断频繁进入效率高很多,在判断空闲中断标志位置位后,清楚中断标志,停止DMA,读出还有多少没传完,然后总长度减去没传完的就是本次接收的数据长度,然后置位接收完成标志位,等待在主函数中进行处理。这样,就可以接收任意长度的数据了,而且效率极高,在中断完之后,数据已经在缓冲区了,只要在主循环中查出此次接收到多长的数据帧就可以进行相应的处理了,个人感觉这是串口接收的最好方式,今天就先写这么多。