串口通讯是常常运用到的功用,在STM32中UART具有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的利用率会更高。