使用STM32的DMA来处理USART3的RX的多数据
DMA_ClearFlag(DMA1_FLAG_TC4); //清DMA发送完成标志
DMA_Cmd(DMA1_Channel4, DISABLE); //停止DMA
DMA1_Channel4->CNDTR = sizeof(TxBuffer1) / sizeof(TxBuffer1[0]);//重设传输长度
DMA_Cmd(DMA1_Channel4, ENABLE); //启动DMA
关键字:STM32 USART DMA
引用地址:STM32的USART使用DMA--操作
注意:DMA的中断产生条件中,TC=transfer complete interrupt产生,需要DMA的buffer满才会产生。
只有当DMA内存中的数据个数达到20个时候才能产生中断。定义如下。DMA_InitStructure.DMA_BufferSize = 20;//sizeof(Ch3DMABuffer);
static usart3_dma_config(void)
{
DMA_InitTypeDef DMA_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
/* DMA1 Channel3 (triggered by USART1 Rx event) Config */
DMA_DeInit(DMA1_Channel3);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART3->DR;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)Ch3DMABuffer;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = 20;//sizeof(Ch3DMABuffer);
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_Low;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel3, &DMA_InitStructure);
/* Enable the End of Transfer Interrupt after */
DMA_ITConfig( DMA1_Channel3, DMA_IT_TC, ENABLE );
DMA_ITConfig(DMA1_Channel3,DMA_IT_TE,ENABLE);
USART_DMACmd(USART3,USART_DMAReq_Rx,ENABLE);
/* Enable DMA Channel3 */
DMA_Cmd(DMA1_Channel3, ENABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
注意在中断中,更新buffersize时,先关闭dma,设置好buffersize后,再开启dma
void DMA1_Channel3_IRQHandler(void)
{
uint16_t dma_len;
//static uint16_t rDMARear = sizeof(Ch3DMABuffer);
DMA_ClearITPendingBit(DMA1_IT_TC3);
DMA_ClearITPendingBit(DMA1_IT_TE3);
DMA_Cmd(DMA1_Channel3,DISABLE);
dma_len = DMA_GetCurrDataCounter(DMA1_Channel3);
//if(dma_len
usart3_rxbuff.len = dma_len;
DMA_SetCurrDataCounter(DMA1_Channel3,50);
DMA_Cmd(DMA1_Channel3,ENABLE);
usart3_rxbuff.rxend = 1;
}
------------------------部分理解参考如下内容-----------------------
USART1的DMA发送比较简单,在要发送之前,重新设置好DMA_BufferSize的大小,然后启动DMA就行了。不过在设置这一值时,得先关闭DMA通道。代码如下:
USART1的DMA接收:如果向USART1发送了数据,则数据会通过DMA传输至初始化DMA接收通道时设置好的内存地址处。据说数据的解析会比较麻烦,因为你不知道什么时候一条完整的指令传输完了,怎么做可以参考这两处:http://bbs.21ic.com/viewthread.php?tid=124248&highlight=USART+DMA
试了一下接收通道DMA1_Channel5的DMA1_IT_TC5中断,有一点和我预料的不一样,初始化该通道时不是也设置过一个DMA_BufferSize值吗,只有接收满了这个DMA_BufferSize大小的数据后,才会产生DMA1_IT_TC5中断,而不是接收一个字节的数据就会产生一个DMA1_IT_TC5中断。
上一篇:stm32中出现的hard_fault问题 如何解决
下一篇:STM32 USB-HID的调试记录
推荐阅读最新更新时间:2024-03-16 15:05
stm32用什么软件编程 stm32的32指什么 stm32单片机的基本组成
stm32用什么软件编程 STM32可以使用多种软件进行编程,包括: Keil MDK-ARM:Keil是一种非常流行的ARM Cortex-M微控制器编程软件。它包含了一个完整的开发环境,包括代码编辑器、编译器、调试器和仿真器等。Keil MDK-ARM支持C/C++语言编程,可用于快速开发STM32应用程序。 STM32CubeIDE:STM32CubeIDE是STMicroelectronics推出的一个免费的集成开发环境,支持STM32微控制器的开发。它包含了一个基于Eclipse的IDE、编译器、调试器和STM32软件库等。STM32CubeIDE支持C/C++语言编程,具有丰富的工具和功能,可以大大提高
[单片机]
stm32-学习经验总结 ———UCOSIII-软件定时器
一、软件定时器简介 UC/OS-III提供了软件定时器服务,定时器的本质就是一个递减的计数器,当计数器减到0的时候可以触发某种动作的执行,这个动作通过回调函数来实现,回调函数是用户自己定义的,可以是简单的打开一个LED灯,或者开启电机等。当定时器计时完成时,定义的回调函数就会被立即调用,应用程序可以有任意数量的定时器。 注意!一定不要在回调函数中使用阻塞调用或者可以阻塞或删除定时器任务的函数,比如:OSTimeDly() OSTimeDlyHMSM() 等等一些函数。 UCOSIII的软件定时器服务的相关代码是在OS_TIMR.c文件中,当设置OS_CFG.H中的OS_CFG_TMR_EN置为1的时候软件定时器服务被使能。 UCO
[单片机]
STM32使用systick定时器定义硬件精准延时函数
前言 博文基于STM32F103ZET6和标准固件库V3.5.0在MDK5环境下开发; 本博文讨论的是芯片不运行操作系统的情况下完成1s的延时功能; 如有不足之处还请多多指教; SysTick—系统滴答定时器是什么? 是一个24位的硬件倒计数定时器; SysTick的功能是什么?(分两种情况) 芯片运行操作系统(UCOS)情况下做:为操作系统(例如UCOS)提供硬件上的定时中断(滴答中断),作为整个系统的时基,为多个任务分配不同的时间片,确保不会出现一个任务霸占系统的情况;或者把每个定时器周期的某个时间范围赐予特定的任务等;还有操作系统提供的各种定时功能; 不运行操作系统,单纯做定时器:提供精准的定时功能; SysTick的特
[单片机]
stm32中的错误以及排除方法
1、error: #256: invalid redeclaration of type name s32 (declared at line 470 of C:\Keil_STM32\ARM\INC\ST\STM32F10x\stm32f10x.h ) 解决方法:打开stm32f10x_conf.h文件,将第21行的“#include stm32f10x_type.h ”注释掉,再保存stm32f10x_conf.h文件,重新编译即可。 2、 warning: #47-D: incompatible redefinition of macro HSE_Value (declared at line 511 of C:\K
[单片机]
STM32标准库编程之LED闪烁
【1】工程截图 【2】代码解读 有了前面文章的基础,工程建立我不再赘述,我们来看主函数所在的源文件(这里完全可以把开头的宏定义和函数声明放到同名的头文件中)。 这里我只引用了delay.h和sys.h 可以看到这三个文件放到一个文件夹里,说明他们三个比较特殊,这里就详细介绍一下(辅助编程文件夹里的开发指南里说的很详细)。SYSTEM 文件夹下包含了 delay、 sys、 usart 等三个文件夹。分别包含了 delay.c、 sys.c、 usart.c及其头文件。通过这 3 个 c 文件,可以快速的给任何一款 STM32F1 构建最基本的框架。使用起来是很方便的。 delay 延时的编程思想: CM3 内核的处理
[单片机]
STM32标准库和HAL库有什么不同 我们怎么用
摘要:通常新手在入门STM32的时候,首先都要先选择一种要用的开发方式,不同的开发方式会导致你编程的架构是完全不一样的。一般大多数都会选用标准库和HAL库,而极少部分人会通过直接配置寄存器进行开发。 网上关于标准库、HAL库的描述相信是数不胜数。可是一个对于很多刚入门的朋友还是没法很直观的去真正了解这些不同开发发方式彼此之间的区别,所以笔者想以一种非常直白的方式,用自己的理解去将这些东西表述出来,如果有描述的不对的地方或者是不同意见的也可以大家提出。 一、配置寄存器不少先学了51的朋友可能会知道,会有一小部分人或是教程是通过汇编语言直接操作寄存器实现功能的,这种方法到了STM32就变得不太容易行得通了。 因为STM32的
[单片机]
CRC校验 、STM32中CRC计算单元、 CRC应用
从这一段时间后台反馈的问题可以看得出来,好些朋友对CRC没有什么概念,今天就在这里讲述一下关于CRC校验、STM32中CRC计算单元相关内容。 1关于CRC校验 CRC:Cyclic Redundancy Check,即循环冗余校验码。 CRC是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。 循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。 ---来自百度百科 学电子、计算机相关专业的同学都应该学习过CRC的基础原理。其原理说难不难,可以说就是一个公式。同时,说简单也不简单,这个公
[单片机]
基于ARM处理器的HDLC通信的DMA实现
摘要: 以ARM7TDMI为内核的Samsung公司S3C4510B网络微控制器(Networking MCU)为基础,重点论述如何通过DMA(直接内存访问)方式实现HDLC通信。对软件设计中缓冲描述符、DMA状态配置和控制、ISR服务程序设计以及相关的硬件配置进行详细的描述,并讨论如何编写在操作系统下的驱动程序。
关键词: HDLC 缓冲描述符 循环链表 中断服务程序 DMA
目前在嵌入式产品开发设计中,通常是在OS(Operating System)厂商提供的BSP基础上进行开发工作;对于底层硬件的操作,程序设计人员很少关注或只是少量的修改。实际上很多产品,我们完全可以
[工业控制]
小广播
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐
最新单片机文章
更多精选电路图
更多热门文章
更多每日新闻
更多往期活动
11月13日历史上的今天
厂商技术中心