您的位置 首页 方案

STM32 UART DMA完成不知道数据长度接纳

串口通信是经常使用到的功能,在STM32中UART具有DMA功能,并且收发都可以使用DMA,使用DMA发送基本上大家不会遇到什么问题,因为发送的时候…

串口通讯是常常运用到的功用,在STM32UART具有DMA功用,而且收发都能够运用DMA,运用DMA发送基本上咱们不会遇到什么问题,我们发送的时分会奉告DMA发送的数据长度,DMA依照发送的长度直接发送就OK了,可是运用DMA接纳时分就不同了,我们有时分数据接纳并不是每一次都是定长的,可是DMA只在接纳数据长度和设定数据长度相同的时分才能够触发中止,告知MCU数据接纳完毕,针对这个问题,解决办法如下,有一点杂乱,可是很管用。

UART在传输一个字节的时分,首要拉低,传输开端位,然后在是LSB –MSB,最终是中止位,中止位是高电平

超时时刻
搞过串口通讯的都知道,假如串口有协议,一般都是有个超时时刻的,超时时刻是界说两个帧之间的距离的,假如串口接纳到一个字节后,在规则的超时时刻内没有接纳到其他数据,咱们则以为前面接纳的数据位一帧。

守时器复位复位形式
STM32守时器功用比较强壮,其中有一种形式为复位形式,TI1的输入上升沿会复位守时器的计数器

全体的思路是这样的,一开端设置好DMA接纳,能够把缓冲区长度设置为帧最大长度,咱们能够把RX衔接到守时器的管脚输入端,而且一开端设置输入而且使能引脚下降沿中止,当帧的第一个字节发送时,我们开端位为低电平,空闲时UART为高电平,分量条件,进入中止,制止中止,而且在中止中舱位守时器,该守时器作业在复位形式,上升沿复位,而且设置好守时器输出比较值为超时时刻,比方20ms,这样,在传输后边字节时,必定会有凹凸电平呈现,即便是传输的是0x00,0xFF,尽管UART数据区不变,可是都为1,或都为0,可是我们开端位为低电平,中止位是高电平,所以必定会有上升沿,守时器会一向复位,输出守时器的计数器一向抵达不了输出比较值,当一帧传输完毕后,守时在最终一个字节复位后,我们没有数据持续抵达,无法复位,则计数器就能计到输出比较值,这时宣布中止,在守时器中止中能够核算出接纳数据的长度,而且告诉外部数据现已接纳完毕。

功用完成
完成的进程:
1、硬件衔接:UART的RX线在衔接外部的一起,还需求衔接到一个守时器的输入端TIMx_CHx,守时器能够为恣意守时器,可是CHx,只能为CH1或CH2

软件设置
a) IO、中止设置:在把UART功用口设置好后,还需求设置TIM4_CH2为输入上拉,而且使能该引脚外部中止

把DMA接纳的数据缓冲区设置为你以为最大的帧长度,(假如最长不能确认,也能够随意指定一个长度,后边再讲怎样完成)。
b) 守时器设置
我们运用的是TIM4_CH2,所以需求装备TIM4,而且装备为复位形式,把超时时刻定为20ms,为了便利TIM4时钟定输入为1KHZ

作业进程如下
在串口传输开端位的时分,首要发生外部中止,在外部中止中舱位守时器,制止外部中止,只需串口上一向有数据,守时器必定会不断的复位,抵达不了守时时刻,当串口上没有数据的时分,到超时时刻后,守时器发生中止,此刻能够读出接纳的数据长度,然后舱位外部中止,进入下一个周期。

总结:本办法的缺陷是程序开端的初始化费事些,可是长处是十分显着的,完全解放了CPU,这样在核算串口超时的时分,就不需求守时器不断的中止,而且串口接纳数据运用DMA方法,也不需求CPU参加,只是在接纳完毕的时分告诉CPU取数据,CPU的利用率会更高。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/265278.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部