老俗话说:不想写好代码的厨子都不是好业务,老俗是谁?老俗是我的又一个外号。本人技校毕业,水平有限,发现问题还请批评指正,还有就是轻点喷。
言归正传,这次写个代码,没办法客户指定了STM32L053的MCU,之前确实没有用过,不过我一直坚信,所有的芯片制造出来,都是给大家使用的,而不是炫耀我们公司生产的多高科技,需要费死洋劲才能使用,这样的厂家肯定也快倒闭了。所以,放平心态,不急不躁,没有啥问题是解决不了的。
说着说着又扯远了,这次的项目使用LPUART连接传感器进行通讯,好在传感器的通讯也是自己写的,通讯协议采用定长数据,10个byte,本想着直接用DMA的定长接收,无奈现场总线上有N多传感器,这要是串了数据,是一个错,个个错,就永远回不了头了。然后就想着用DMA做个不固定长度的接收。多年前用STM32F1系列做过,想着也不算太难,无奈找了找资料,STM32L053已经不支持标准库了。(此时内心略有波动,我不想告诉你们其实是万马奔腾),然后看了看资料,下载cubeMX,网上看了看,大部分是HAL库,然后用HAL库试了试串口中断,效果不是很理想。看了看代码,还是决定转战LL库。
首先要感谢songrsp先生的《基于STM32CubeMX的LL库学习记录(五)USART_DMA_IDLE 串口接收空闲中断接收数据》
文章链接:https://www.pianshen.com/source/36308857364027/
其实DMA接受不定长数据大部分思路就是使用DMA+串口空闲中断,因为我确实水平有限,也想不出什么更好的办法。至于DMA是个啥?手册里是这样说的:
这就好比你买了个房子要装修,DMA就像是那个上料的师傅(不知道DMA有思维的话这么说他会不会痛扁我),你去买了水泥,沙子,油漆啥的,我只告诉师傅从哪里搬到哪里就可以了,至于师傅是扛着,推着,还是背着,就和你没太大关系了,你只是在需要的时候去看下东西的状况就可以了,看看到没到,到了多少。当然,如果你买了很多种类,有些是急需的,你就得告诉师傅先上哪部分料,那么怎么告诉我们的“师傅”呢?
写的有点啰嗦了,开整:
首先是打开cubeMX配置
个人习惯,先把调试勾选上,不然忘了这一步下次程序就下不进去了,需要重新搞BOOT脚。
配置时钟,使用外部时钟