写一个STM32 BootLoader-2

1.概述

本篇文章主要介绍利用STM32的串口空闲中断和DMA来进行变帧长数据接收。

2. 空闲中断介绍

STM32串口空闲中断是指STM32的串口由数据接收状态转入空闲状态时产生的一个中断。在某些处理器(AT91系列的ARM9)中,该中断也被称为超时中断,并且超时的时间是可以设置的。但是在STM32这个超时的时间是不能设置。

空闲中断对于数据的接收是有十分重要的意义。例如在一些时序控制保证得比较好的场景,它可以用来作为一帧数据接收完成的标志。这样相对于DMA 接收满中断,可以更方便地去获取一帧完整的数据,并且减小MCU中断的次数。

当串口产生出现空闲时,串口的状态寄存器(USART_SR)中的IDLE位会由硬件置1。

在这里插入图片描述
在这里插入图片描述

这里要注意的是该标志位如果清零的话,需要通过软件读取USART_SR和USART_DR两个寄存器中的数据。

在这里插入图片描述
在这里插入图片描述

串口的控制寄存器1(USART_CR1),将BIT4 IDLEIE位置1使能中断,则如果USART_SR中的IDLE=1时,系统将产生一个空闲中断。

3. 空闲中断接收串口数据

利用串口的DMA功能和空闲中断功能,可以对不等长的数据进行接收,流程如下:
在这里插入图片描述
初始化时,将DMA的CNDTR寄存器的长度设置为LEN,LEN的长度要大于接收最长帧的长度。利用CNDTR接收到一个数据减1的原理,当空间中断发生时,LEN-CNDTR就可以得到当时接收到的数据长度了。

代码如下:

// UART1_RxDMA 初始化
void UART1_RxDMA_Init
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值