前言
今天总结“STM32F103DMA_USART”,DMA学习过计算机人都明白它是什么意思,就是直接存储器存取(Direct Memory Access),很多人都知道它的意思,但基本上不知道的怎么用,或者不知道它的用途。其实DMA在计算机里面是非常重要的,它可以减少CPU的资源。大家都用U盘拷贝过数据,这就是很常见的DMA应用。假如不适用DMA传输数据,我们拷贝大文件的时候,我们的电脑操作其他应用程序的时候估计会把电脑卡死。
今天就总结一下DMA常用于串口通信的例子,实例源代码请自行下载。由于时间有限,只讲解了DMA发送及中断,接收这一块还没有来得及整理,后期我将以实例讲解,请持续关注。
下载
提供下载的“软件工程”都是在硬件板子上进行多次测试、并保证没问题才上传至360云盘。
今天的软件工程下载地址(360云盘):
https://yunpan.cn/cSdzWimMT8v7S访问密码 4a02
STM32F10x的资料可以在我360云盘下载:
https://yunpan.cn/crBUdUGdYKam2访问密码 ca90
内容讲解
工程概要说明: 今天使用DMA1通道4(这里是重点,下面讲解)传输串口发送的数据。工程配置串口使能DMA传输,DMA按要求发送完成会响应DMA中断,这时在中断里变化一次LED,以提示的作用。关于串口使用DMA接收的原理类似,后期我会举例讲解。
提供的工程以简单为原则,详细中文注释,方便自己方便大家。
关于“STM32F103 DMA_USART”我把重要的几点在下面分别讲述:
一、RCC时钟
该函数位于bsp.c文件下面;
注意:
这里是使用RCC_AHBPeriphClockCmd,我开始调试的时候,使用RCC_APB1PeriphClockCmd,怎么都不行,结果我才发现时钟错了。
二、DMA的NVIC配置
该函数位于bsp.c文件下面;
由于使用DMA中断,这里必须配置才能响应中断。
三、DMA输出配置
该函数位于main.c文件下面;
主要就是我框出来的两点比较重要,串口发送数据寄存器地址,中断需要配置。
这里我封装成一个发送函数接口,所以下面是直接调用这个函数。
四、DMA中断
该函数位于stm32f10x_it.c文件下面;
提出来说,有两点:1、函数必须有。2、需要清除标志位。
五、今天的重点
为什么是“DMA1_Channel4”,开始学习的人很纳闷,其实这里是规定的(定的要求,见手册)。
说明
今天提供的软件工程基于STM32F103大容量芯片,其实只要适当修改工程的部分配置,STM32F1的芯片都适用。
关键字:STM32F1 DMA USART
引用地址:
STM32F1 _DMA_USART
推荐阅读最新更新时间:2024-11-14 08:15
stm32 多路ADC+DMA 在内存中各路ADC的数据是如何界定的
#define N 50 //每通道采50次 #define M 7 //为7个通道 uint32_t ADC_ConvertedValue ; 其中 DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue; DMA_InitStructure.DMA_BufferSize = N*M; //DMA通道的DMA缓存的大小 这里DMA 知道往 ADC_ConvertedValue 放数据以及缓存的SIZE, 当把七个通道的ADC 数据通过DMA传送完了, DMA 是怎样界定ADC_ConvertedValue 为一个通道的数据?ADC_ConvertedValu
[单片机]
定时器DMA Burst传输无法实现
有人使用STM32F4系列开发产品,程序运行过程中需要不时地对外输出一串驱动脉冲,并要求这几串脉冲的频率可变、占空比固定。他想到使用基于STM32定时器的DMA BURST传输。具体点说,他期望不时地通过TIM3的CH1输出一串频率可变、占空比固定的脉冲然后停下来。这个思路在原理上是没问题的,可是他在测试过程中发现怎么也折腾不出预期的效果。 他目前使用的芯片是STM32F401,虽有点老旧,但我查看了手册,确认该芯片的TIM3是支持基于TIMER事件实现TIME寄存器与内存间的DMABURST传输的。即每个TIMER事件可以申请多个DMA请求从而实现定时器寄存器与内存间的批量数据传输。要知某个STM32 TIMER是否支持上述
[单片机]
基于STM32Cubemx HAL 库实现 DMA 驱动 GPIO 高速翻转
说明:本文主要内容是从简单介绍有关STM32的DMAMUX模块-电子发烧友网 (elecfans.com)这篇文章摘录。我是小白,在索引HAL DMA GPIO 翻转时,没有找到本文,而在所有DMAMUX才索引到此文。为了方便后续小白能够及时找到此文。我重新做了编译。并做了相关程序的验证。对相关数据做了说明。感谢本文应用的3片文章的作者! 目前STM32家族中的很多系列,比如STM32G0/STM32G4/STM32L4+/STM32H7等都内置了DMAMUX模块。有了它一方面使得DMA请求与DMA控制器之间的映射关系更为灵活方便,另一方面也大大拓展了DMA请求事件,不再局限于外设事件,比方基于GPIO的外部中断事件、或者DM
[单片机]
STM32F4 UART1 DMA发送和接收不定长度数据
STM32F4 串口收发使用DMA还是很方便的。但是配置DMA时需要配置数据长度,这一点对于发送来说可以预估计自己发送的长度来配置DMA发送数据长度,但是对于接收不是很好解决,因为如果使用DMA接收中断是要配置的数据长度减到0才能出发中断。但是我们无法判断接受数据的长度,导致无法判断数据接收完成。网上有提出的解决方法是用定时器固定周期的读DMA接收的长度来判断是否接收完成,也有使用UART的空闲中断来处理的。在这里我使用UART的空闲中断来处理接收不定长数据。当然也要打开DMA接收完成中断,处理数据接收超过DMA配置的长度导致的DMA接收中断。 1.使用DMA发送时每次发送数据前需要配置发送的数据长度,此时要注意应先关闭DMA,然
[单片机]
AVR的_USART
USART数据寄存器UDR: 当对此寄存器进行读的时候,实际就是接收数据缓冲寄存器(RXB)。 当对此寄存器进行写的时候,实际就是发送数据缓冲寄存器(TXB)。 USART控制和状态寄存器A:UCSRA(RXC,TXC,UDRE,FE,DOR,PE,U2X,MPCM) RXC:USART接受结束。接受缓冲器中仍然有未读出的数据时,RXC置位。如果没有任何需要读的数据时,RXC清零。当接收器禁止时,接收缓冲器刷新,导致RXC清零,RXC标志也可以用来产生接收结束中断。 TXC:USART发送结束。发送移位寄存器中的数据被送出,且当发送缓冲器(UDR/TXB)为空时,TXC置位。执行发送结束中断时TXC标志自动清零。 UDRE:USA
[单片机]
MSP430学习笔记-USART
Note: Initializing or Re-Configuring the USART Module The required USART initialization/re-configuration process is: 1) Set SWRST (BIS.B #SWRST,&UxCTL) 2) Initialize all USART registers with SWRST = 1 (including UxCTL) 3) Enable USART module via the MEx SFRs (URXEx and/or UTXEx) 4) Clear SWRST via software (BIC.B #SWR
[单片机]
STM32F051 SPI slave mode DMA接收
用STM32F051的SPI从模式接收主机发送的实时数据。 Eclips 环境,gcc编译器,相关源码如下: #ifdef DEBUG_SPI_EN #define DEBUG_SPI(...) printf(__VA_ARGS__) #else #define DEBUG_SPI(...) #endif void SPI1_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE
[单片机]
关于STM32 ADC时采用DMA的一点疑问
手册上有这样的话:只有ADC1能够产生DMA请求,似乎是只有ADC通道1能采用DMA方式传输数据。 但是万利的开发板上的ADC例子,用的是ADC通道10,还用了DMA 方式传数据。 所以我猜测 “只有ADC1能够产生DMA请求”中提到的ADC1 并不是指ADC 通道1, 而是软件可配置的 ADC 通道的分类形式,可分为ADC1和ADC2. 我们可将 通道10(或其他)配置成ADC1 “模式”。通过函数 /* ADC1 regular channel10 configuration */ ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_5
[单片机]