STM32-寄存器DMA配置指南

配置步骤

在STM32F0xx中文参考手册中的DMA部分在开头给出了配置步骤

每个通道都可以在外设寄存器固定地址和存储器地址之间执行 DMA 传输。DMA 传输的数据

量是可编程的,最大达到 65535。每次传输之后相应的计数寄存器都做一次递减操作,直到

计数为0。

DMA的请求映像如下

设置外设寄存器地址

这里使用DMA传输ADC1的数据,查看ADC1的数据地址为(uint32_t)(ADC1->DR)

所以赋值为

cpp 复制代码
 DMA1_Channel1->CPAR=(uint32_t)(ADC1->DR);

设置存储器地址

填写需要被传输到的存储器地址,注意这里ADC使用了3个通道,所以存储的数据类型应该是在数组里,所以需要填的是数组的第一个数据的指针,并且需要在DMA传输过程中存储器地址自增。

cpp 复制代码
uint16_tadc_dat[3]={0};//ADC数据传输到的位置 全局 因为选择的ADC为12为数据宽度所以用uint16_t
DMA1_Channel1->CMAR=(uint32_t)adc_dat;

传输的数据量

当前传输的为3个数据,最大为65535

cpp 复制代码
DMA1_Channel1->CNDTR |= 3;

其他配置

在 DMA_CCRx 中配置数据的传输方向、循环模式、外设和存储器的增量模式、外设和存

储器的数据宽度和传输一半产生中断或传输完成产生中断的设置。

cpp 复制代码
DMA1_Channel1->CCR |= 0x00002561; 
//DMA优先级高 非存储器到存储器模式 存储器数据宽度16位 外设数 
//据宽度16位 存储器地址不自增 外设地址自增 循环模式 从外设读到存储器 开启DMA通道

所以延续上篇博客最终配置为

cpp 复制代码
uint16_t adc_dat[3]={0};
/*要求如下:配置ADC1IN1,ADC1IN2,ADC1IN3,使用内部专用14Mhz振荡器,过采样为7.5个ADC周期,由TIM1中断作为触发信号,DMA搬运
并且开启模拟看门狗监控ADC1IN1,阈值为3.3v~3.0v并且开启模拟看门狗中断。ADC分辨率为默认的12位*/
void Demo(void){
      //打开HSI14时钟
      RCC->CR2 |=  0x00000001;//开启HSI14
      while(!(RCC->CR2 |= 0x00000002));//等待HSI14稳定
      RCC->CR2 |= 0x00000004;//允许ADC打开HSI14       
      //ADC自校准
      ADC1->CR |= 0x80000001; //开启自校准 ADC禁用
      while((ADC1->CR |= 0x80000000)); //等待自校准完成
      //ADC通道选择
      ADC1->CHSELR |= 0x0000000E; //选择通道1 2 3
      //ADC采样时间选择
      ADC1->SMPR |= 0x00000001; //7.5个采样周期
      //转换模式选择
      ADC1->CFGR1 |= 0x4C00003;//使用TIM1_TRGO作为触发事件源 外部触发禁止 单次转换模式  模拟看门狗监视通道1 模拟看门狗使能 在单一通道上使能模拟看门狗  使能 循环模式 使能DMA DMA循环模式 前向扫描
      //开启模拟看门狗
      ADC1->ISR |= 0x00000080;//开启模拟看门狗中断
      ADC1->IER |= 0x00000080;//模拟看门狗中断使能
      ADC1->TR |=0xE8C0FFF;//阈值为 4095~3723 即3.3v~3.0v
      //开始转换
      ADC1->CR &= 0xFFFFFFFE; //ADC解除禁用
      ADC1->CR |= 0x00000004; //开始转换
      //DMA配置
      DMA1_Channel1->CPAR=(uint32_t)(ADC1->DR); //源地址
      DMA1_Channel1->CMAR=(uint32_t)adc_dat;    //目标地址
      DMA1_Channel1->CNDTR |= 3;  //传输数目3
      DMA1_Channel1->CCR |= 0x00002561; //DMA优先级高 非存储器到存储器模式 存储器数据宽度16位 外设数据宽度16位 存储器地址不自增 外设地址自增 循环模式 从外设读到存储器 开启DMA通道
}
相关推荐
小李不困还能学24 分钟前
基于 51 单片机的8 路抢答器设计教程
单片机·嵌入式硬件·mongodb·抢答器
萌动的小火苗1 小时前
嵌入式开发中的栈与队列:任务调度为什么依赖数据结构
数据结构·c++·单片机·嵌入式硬件
振浩微433射频芯片2 小时前
工业遥控器总在关键时刻“掉链子”?——433MHz芯片方案如何破局
网络·单片机·嵌入式硬件·物联网·工业遥控
blevoice2 小时前
抖抖燃脂机单 AC6966B 主控调试踩坑:Type-C 整机供电喇叭无声排障
c语言·开发语言·单片机
三易串口屏3 小时前
三易串口屏开发教程:如何使用键盘控件输入参数并发送给单片机
单片机·嵌入式硬件·串口屏·三易串口屏·键盘控件
十月的皮皮4 小时前
STM32从零到量产开发:四路继电器工业控制模块开发实战笔记(小白视角)
c语言·笔记·stm32·stm32cubemx·hal库
2CM_Embed4 小时前
F28379D 下载后 VOFA+ 无数据、Reset 后恢复:一次 TZ 中断误触发排查记录
笔记·单片机·sci·c2000·f28379d·vofa·tz
国科安芯4 小时前
空间机电一体化:AS32S601型抗辐射MCU在卫星推进与执行机构控制中的关键技术研究
单片机·嵌入式硬件·物联网·机器人·云计算
国科安芯5 小时前
AS32S601型抗辐射MCU在分布式太空算力架构中的技术演进与应用前景
人工智能·分布式·单片机·嵌入式硬件·架构·边缘计算
国科安芯5 小时前
在轨能源中枢:AS32S601型抗辐射MCU在卫星电源管理与配电系统中的控制策略研究
嵌入式硬件·架构·能源·risc-v·sps·电源管理·卫星