STM32 总线空闲 + DMA 方式接收

发布者:RadiantDreams最新更新时间:2018-06-07 来源: eefocus关键字:STM32  总线空闲  DMA 手机看文章 扫描二维码
随时随地手机看文章

STM32 的 USART 支持一个总线空闲中断,如果这个中断和DMA配合,能够较好的实现接收不定长数据的功能。

总线空闲中断是在检测到在接收数据后,数据总线上一个字节的时间内,没有再接到数据后发生。也就是RXNE位被置位之后,才开始检测,只被置位一次,除非再次检测到RXNE位被置位,然后才开始检测下一次的总线空闲。

函数

// 配置串口3

void USART3_Init(void)

{

// 使能PORTB口时钟

RCC->APB2ENR |= APB2_IOPB_EN;

// 使能串口3时钟                                            

RCC->APB1ENR |= APB1_USART3_EN;                                         

// IO口模式设置

GPIOB->CRH &= 0xFFFF00FF;

// IO状态设置

GPIOB->CRH |= 0x00008B00;                                               

// 复位串口3

RCC->APB1RSTR |= APB1_USART3_EN;                                        

// 停止复位

RCC->APB1RSTR &= ~(APB1_USART3_EN);                                      

// 波特率

USART3->BRR = (ulMantissa << 4) + ulFraction;                           

// 收发允许,1位停止,无校验位.

USART3->CR1 = (0x200C | ulParity | ulData);                             

// 停止位

USART3->CR2 |= ulStop;                                                  

// 设置DMA

DMA_Config(DMA1_Channel2, 1, (ulong)&USART3->DR,(ulong)NULL, 256);      

// 发送dma使能

USART3->CR3 |= 1 << 7;

// 设置DMA                                                  

DMA_Config(DMA1_Channel3, 0, (ulong)&USART3->DR,(ulong)NULL, 256);       

// 接收dma使能 

USART3->CR3 |= 1 << 6;

// 开启DMA                                                   

DMA_Enable(DMA1_Channel3,(u32)l_ucRecvBuf[2],256);

//

USART3->CR1|=1<<8;     //PE中断使能

USART3->CR1|=1<<4;     //空闲中断使能

NVIC_SetPriority(USART3_IRQn, 0);

NVIC_EnableIRQ(USART3_IRQn);


// 串口3的中断服务函数

void USART3_IRQHandler(void)

{

u8 tmp;

u8 len;

// 响应空闲中断

if( USART3->SR & (1<<4) )

{

// 清除状态标志

tmp = USART3->DR;

// 获取本次传输数据长度

len = DMA1_Channel3->CNTR;

len = 256 - len;

// do 

}

}

无论帧是否等长、无论帧中是否包含长度信息、无论是否包含同步位 都能有较好的效果。

必须保证单个数据帧是连续的发送过来的,发送端最好是DMA控制的。如果帧数据被间隔,将被拆为两个帧。


关键字:STM32  总线空闲  DMA 引用地址:STM32 总线空闲 + DMA 方式接收

上一篇:STM32单线串口对总线舵机的控制
下一篇:STM32空闲中断+DMA解决接收不定长数据问题

推荐阅读最新更新时间:2024-03-16 16:05

STM32小白入门(第12天)---I2C协议
一、概述 二、信号概念 三、AT24C02(EEPROM电可擦除ROM)--配合单片机存贮掉电前需要保存的数据,类似单片机的硬盘 1、写时序 2、读时序 思考题2:在24c02控制时钟的时候,为什么要进行5us的延时,小于5us延时或许大于5us的延时是否可以,示例代码如下: //设置SCL高电平 SCL=1; delay_us(5); //设置SCL低电平 SCL=0; delay_us(5); 回答:大于5us是可以的,如果使用5ms是可以的。但是延时是不能低于1.2us,详细描述如下图。 3、起始信号和停止信号 //sda输入输出模式切换函数 v
[单片机]
<font color='red'>STM32</font>小白入门(第12天)---I2C协议
stm32引脚的VCC与VDD如何连接
stm32单片机作为一种常见的嵌入式设备,是许多电子设备和系统中必不可少的一部分。而在单片机的设计和应用中,电源电压是一个非常重要的参数,其中VCC和VDD作为单片机中的电源引脚,是最为关键的两个引脚之一。本文将介绍VCC和VDD的区别及其在单片机中的应用。 一、VCC与VDD的区别 在单片机中,VCC是最常见的电源引脚,通常用于提供数字电路中需要的正向电压。VCC的电压通常是3.3V或5V,但也有其他电压等级的单片机。 而VDD是一种特殊类型的电源电压,它是指在CMOS电路中使用的电源电压。在CMOS电路中,晶体管使用的是MOSFET,其工作需要两种类型的电压:正向电压和反向电压。VDD是指MOSFET工作时需要的正向电压,
[单片机]
<font color='red'>stm32</font>引脚的VCC与VDD如何连接
STM32用串口(USB串口)下载程序的方法
一、 STM32串口下载程序步骤 1)安装《CH340驱动(USB串口驱动)_XP_WIN7共用》 2)打开串口下载软件《STM32F4串口下载软件(FLYMCU)》 3)开发板USB接口连接到电脑USB口,给开发板供电 4)下载软件设置如下;点搜索串口,选择正确的串口号,波特率不用管,选择HEX文件,点开始编程就可以下载了。 二、 硬件连接 USB转串口CH340接线图如下。 ARM串口TXD连接到CH340G的RXD脚,RXD连接到CH340G的TXD脚; CH340是5V供电,可以由USB供电。boot0置1(接到3.3V) ,boot1置0(接地)。 三、说明:对于已加密的STM32芯片可以通过串口下载程序来解锁下
[单片机]
STM32串口发送数据和接收数据方式总结
之前写了篇关于ESP8266使用AT指令进行互相通讯的实验,在写STM32串口接发数据的程序中,觉得有必要将之前学的有关于串口方面的使用经历加以总结。 串口发送数据: 1. 串口发送数据最直接的方式就是标准调用库函数 。 void USART_SendData(USART_TypeDef* USARTx, uint16_t Data); 第一个参数是发送的串口号,第二个参数是要发送的数据了。但是用过的朋友应该觉得不好用,一次只能发送单个字符,所以我们有必要根据这个函数加以扩展。 void Send_data(u8 *s) { while(*s!='') { while(USART_GetFlagS
[单片机]
<font color='red'>STM32</font>串口发送数据和接收数据方式总结
STM32单片机和51单片机区别
单片机简介 单片微型计算机简称单片机,简单来说就是集CPU(运算、控制)、RAM(数据存储-内存)、ROM(程序存储)、输入输出设备(串口、并口等)和中断系统处于同一芯片的器件,在我们自己的个人电脑中,CPU、RAM、ROM、I/O这些都是单独的芯片,然后这些芯片被安装在一个主板上,这样就构成了我们的PC主板,进而组装成电脑,而单片机只是将这所有的集中在了一个芯片上而已。 51单片机和STM32单片机 51单片机是对所有兼容Intel8031指令系统的单片机的统称,这一系列的单片机的始祖是Intel的8031单片机,后来随着flash ROM技术的发展,8031单片机取得了长足的进展成为了应用最广泛的8bit单片机之一,他的代表型
[单片机]
创建第一个stm32项目工程常见错误警告
.ObjectsLightOneLed.axf: Error: L6218E: Undefined symbol SystemInit (referred from startup_stm32f10x_hd.o). 意思是SystemInit这个函数未定义(在startup_stm32f10x_hd.o引用)。 在外部(其他任何.c文件里面)定义SystemInit这个函数,哪怕是个空函数也可以。 void SystemInit() { } usermain.c(26): warning: #1-D: last line of file ends without a newline int main() {
[单片机]
基于stm32、0.96寸OLED实现的俄罗斯方块小游戏(详细源码注释
概述:本实验基于stm32最小系统、0.96寸OLED(68*128)和摇杆实现一个经典的俄罗斯方块小游戏。 硬件要求: 普通摇杆,两个电位器和一个开关组成,左右摇动控制一个电位的电压,上下摇动控制另一个电位的电压,并可垂直按下实现一个普通的按键。 0.96寸OLED 单色屏幕,通过spi协议与单片机通信。 stc32f103c8t6最小系统开发板。 上面所用到的器件都可以在淘宝上买到,价格不贵。 器件齐全后,用杜邦线将摇杆和oled正确地连接到stm32开发板上,注意各个器件的电源需要接到同一电压,下图是接线说明: 接好线之后,将源码编译下载,进入调试,正常运行如下图所示,如果屏幕出现花屏,那么将res引
[单片机]
基于<font color='red'>stm32</font>、0.96寸OLED实现的俄罗斯方块小游戏(详细源码注释
stm32烧录的程序为什么会丢失呢
第一次用stm32烧录程序的时候还是很正常的,但没过多久,我又按照以前的步骤再去烧录程序,发现stm32一但按复位,就会莫名其妙的消失,这是怎么回事啊? 小编最近看到有网友在疑惑stm32烧录的程序为什么会丢失呢?在此,小编将给大家分析一下stm32烧录程序丢失的原因。 首先,你要弄清楚自己的在线烧录是通过什么方法烧录的,只有先搞明白这个问题,你才好对症下药。 1、检查一下是不是光盘的质量或者是刻录软件出了问题。毕竟这个问题说大不大,说小不小,还是会影响到stm32烧录程序的。质量好一点的光盘是能够保证程序的稳定运行的。 2、如果你的程序烧写在flash中,那么stm32烧录的程序遇到复位或者掉电是都不会消失的。 3、stm3
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved