STM32f103的数电采集电路的DMA设计和使用优化程序

DMA,全称为:Direct Memory Access,即直接存储器访问。DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为RAM与I/O设备开辟一条直接传送数据的通路,能使CPU的效率大为提高。

DMA设置的一般步骤可以总结为如下几个步骤:

1.DMA时钟使能

2.DMA设置复位

3.设置DMA基地址,内存地址,输出方向参数

4.设置DMA数据大小,优先级,使用通道参数

5.DMA工作方式初始化

6.使能DMA

7.编写中断处理函数

前端采集模块的DMA使用主要用于ADC采集结果的传输和USART串口的数据发送传输。根据《stm32中文参考手册》的DMA请求一览表,选用了DMA1的通道1作为ADC1的数据传输通道,以及DMA1通道4作为和USART串口的数据发送传输通道。此处采用了单个DMA复用多通道的设计,是因为DMA速度足以完成这些任务,而且留下其他DMA资源以便项目以后可以扩展,达到节省资源的目的。

USART使用DMA发送数据配置和使能代码

[cpp] view plain copy

  1. //DMA1的各通道配置
  2. //这里的传输形式是固定的,这点要根据不同的情况来修改
  3. //从存储器->外设模式/8位数据宽度/存储器增量模式
  4. //DMA_CHx:DMA通道CHx
  5. //cpar:外设地址
  6. //cmar:存储器地址
  7. //cndtr:数据传输量
  8. void DMA_USART_Config(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
  9. {
  10. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);  //使能DMA传输
  11. DMA_DeInit(DMA_CHx);   //将DMA的通道1寄存器重设为缺省值
  12. DMA1_MEM_LEN=cndtr;
  13. DMA_InitStructure.DMA_PeripheralBaseAddr = cpar;  //DMA外设ADC基地址
  14. DMA_InitStructure.DMA_MemoryBaseAddr = cmar;  //DMA内存基地址
  15. DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;  //数据传输方向,从内存读取发送到外设
  16. DMA_InitStructure.DMA_BufferSize = cndtr;  //DMA通道的DMA缓存的大小
  17. DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  //外设地址寄存器不变
  18. DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  //内存地址寄存器递增
  19. DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;  //数据宽度为8位
  20. DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //数据宽度为8位
  21. DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;  //工作在正常缓存模式
  22. DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA通道 x拥有中优先级
  23. DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  //DMA通道x没有设置为内存到内存传输
  24. DMA_Init(DMA_CHx, &DMA_InitStructure);  //根据DMA_InitStruct中指定的参数初始化DMA的通道USART1_Tx_DMA_Channel所标识的寄存器
  25. }
  26. //开启一次DMA传输
  27. void DMA_USART_Enable(DMA_Channel_TypeDef*DMA_CHx)
  28. {
  29. DMA_Cmd(DMA_CHx, DISABLE );  //关闭USART1 TX DMA1 所指示的通道
  30. DMA_SetCurrDataCounter(DMA_CHx, DMA1_MEM_LEN);//DMA通道的DMA缓存的大小
  31. DMA_Cmd(DMA_CHx, ENABLE);  //使能USART1 TX DMA1 所指示的通道
  32. }

ADC使用DMA传送多通道数据配置和使能代码

[cpp] view plain copy

  1. //DMA1的各通道配置
  2. //这里的传输形式是固定的,这点要根据不同的情况来修改
  3. //从存储器->外设模式/8位数据宽度/存储器增量模式
  4. //DMA_CHx:DMA通道CHx
  5. //cpar:外设地址
  6. //cmar:存储器地址
  7. //cndtr:数据传输量
  8. void DMA_ADC_Config(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
  9. {
  10. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);  //使能DMA传输
  11. DMA_DeInit(DMA_CHx); //将DMA的通道1寄存器重设为缺省值
  12. DMA_InitStructure.DMA_PeripheralBaseAddr = cpar; //DMA外设ADC基地址
  13. DMA_InitStructure.DMA_MemoryBaseAddr = cmar; //DMA内存基地址
  14. DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //内存作为数据传输的目的地
  15. DMA_InitStructure.DMA_BufferSize = cndtr; //DMA通道的DMA缓存的大小
  16. DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址寄存器不变
  17. DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址寄存器递增
  18. DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //数据宽度为16位
  19. DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //数据宽度为16位
  20. DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //工作在循环缓存模式
  21. DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMA通道 x拥有高优先级
  22. DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA通道x没有设置为内存到内存传输
  23. DMA_Init(DMA_CHx, &DMA_InitStructure); //根据DMA_InitStruct中指定的参数初始化DMA的通道
  24. }
  25. //开启一次DMA传输
  26. void DMA_ADC_Enable(DMA_Channel_TypeDef*DMA_CHx)
  27. {
  28. DMA_Cmd(DMA_CHx, DISABLE );  //关闭USART1 TX DMA1 所指示的通道
  29. DMA_Cmd(DMA_CHx, ENABLE);  //使能USART1 TX DMA1 所指示的通道
  30. }

这里需要注意的是USART使用DMA发送数据需要每一次都重新使能,即每发送一次数据使能一下。

而ADC使用DMA传送多通道数据则只需要使能一次就可以自动循环工作,只需从数组空间读取ADC数据。

时间: 2024-10-08 12:47:24

STM32f103的数电采集电路的DMA设计和使用优化程序的相关文章

74LS160 笔记 数电实验

74LS160 The LS160A / 161A / 162A / 163A are high-speed 4-bit synchronous counters. 74LS160是4位同步计数器...不废话了 74LS160 datasheet 个人感觉,数电其实是模电的衍生学科,两者都是IC工业的核心学科,模电关注芯片里面的细节,而数电更多的是关注芯片外部特性. 学数电有种感觉,芯片会用就是了,亦或说,有点数电基础,能看懂datasheet什么都不是问题,但是模电不同...心中对模电有种说不

数电基础 第四章

数电基础 第四章 组合逻辑电路 组合逻辑电路的特点 1.从功能上 :任意时刻的输出仅取决于该时刻的输入 2.从电路结构上:不含记忆(存储)元件 逻辑功能的描述 组合逻辑电路的设计方法 1.逻辑抽象 分析因果关系,确定输入/输出变量 定义逻辑状态的含意(赋值) 列出真值表 2.写出函数式 3.选定器件类型 4.根据所选器件:对逻辑式化简,变换,或进行相应的描述 5.画出逻辑电路图 设计举例 设计一个监视交通信号灯状态的逻辑电路 1.抽象 输入变量:红(R).黄(A).绿(G) 输出变量:故障信号(

模电&数电知识整理(不定期更新)

模电总复习之爱课堂题目概念整理 Chapter 1 1) 设室温情况下某二极管的反偏电压绝对值为1V,则当其反偏电压值减少100mV时,反向电流的变化是基本不发生变化. 2) 二极管发生击穿后,在击穿区的曲线很陡,反向电流变化很大,但两端的电压降却几乎不变. 3) 二极管的反向击穿分为雪崩击穿和齐纳击穿两类. 4) 齐纳击穿的反向击穿电压小于6V. 5) 二极管电击穿是可逆的,热击穿不可逆. 6) 在P型半导体中,多子是空穴,少子是自由电子. 7) 在P型半导体中:在室温下,当温度升高时,空穴的

STM32F103频率和AD采集项目总结

刚刚做了我的第一个嵌入式项目----基于STM32F103的频率和AD采集系统. 是一个大系统的一个部分,没用操作系统,使用库函数编写,虽然东西很简单,但是对于我这个还没入门的菜鸟来说还是有点难度的.前后断断续续已经两周多了,到目前为止系统已经完成了接近90%,在这个过程中犯了很多错误,也走了很多的弯路,在这里记录下来,让自己以后不要再犯同样的错误,也给那些和我一样刚入门的朋友一点提示. 1.USART初始化问题: STM32F103启动文件默认有两个入口,一个是systemInit(),另一个

数电基础 第二章

数电基础 第二章 逻辑代数中三种基本运算:与.或.非 与:?条件同时具备,结果发生 ?Y=A AND B = A&B=A·B=AB A B Y 0 0 0 0 1 0 1 0 0 1 1 1 或:条件之一具备,结果发生 Y= A OR B = A+B A B Y 0 0 0 0 1 1 1 0 1 1 1 1 非:条件不具备,结果发生 Y=A`=NOT A A Y 0 1 1 0 几种常用的复合逻辑运算 与非: 或非: 与或非: 异或: A B Y 0 0 0 0 1 1 1 0 1 1 1 0

电商峰值系统架构设计--转载

1.1 系统架构设计目录 摘要:双11来临之际,<程序员>以“电商峰值系统架构设计”为主题,力邀京东.当当.小米.1号店.海尔商城.唯品会.蘑菇街.麦包包等电商企业,及商派.基调网络等服务公司,分享电商峰值系统架构设计的最佳技术实践. 自2009年11月11日,淘宝商城(现名天猫)拉开网购狂欢节的序幕,各大电商的促销浪潮此起彼伏.此时的电商大战不仅是价格之争,更是技术的较量.如何设计电商峰值系统来更好地满足用户蜂拥而至的访问,如何在海量数据处理中实时发现有效信息并转化为商机,成为众多电商企业密

DMA设计

目录 DMA设计 DMA框架 手册请看英文手册 芯片特性 请求来源 协议简述 基本时序 模式 协议 数据大小的描述 具体完整的实例时序 代码设计 驱动程序 测试程序 测试 参考链接 title: DMA设计 tags: linux date: 2019年1月5日 17:27:08 toc: true --- DMA设计 DMA框架 一个简单的DMA框图如下DREQ→HOLD→HLDA→DACK DMAC的一些必备特性: 能发出地址信息,对存储器寻址,并修改地址指针,DMAC内部必须有能自动加1或

32、生鲜电商平台-商品价格的设计与架构

说明:Java开源生鲜电商平台-商品价格的设计与架构,主要是对商品的价格进行研究与系统架构. 一.常见的电商价格 市场价(List Price):这个价格仅是用于显示,用于衬托网站销售价格的优惠程度: 销售价(Sales Price):亦称我们的价格.零售价等,如果没有任何优惠的(包括促销优惠.会员等级优惠等), 就按这个价格进行销售.所有的优惠规则均是基于这个价格进行计算. 特价(Special Price):优先级最高的定价,忽略所有的价格规则. SKU价格(SKU Price):同一个产品

海尔电商峰值系统架构设计最佳实践

多数电商平台都会经历相似的过程,流量和业绩每年以几倍至十几倍的速度增长,每年都要接受几次大规模.全方位的系统检阅,例如双11.周年庆等购物狂欢节,期间流量和订单可能是日常的十几倍甚至几十倍,产生的峰值对平台形成极其强烈的冲击,对电商平台的架构带来巨大的考验.因此,对电商平台的规划和架构工作不仅要高瞻远瞩,而且要细致入微,否则将导致平台无法满足高速增长的业务发展,细微处的失误也可能造成严重后果,不仅影响业务指标的实现,还可能导致对系统进行重新架构,劳时费力又伤钱. 从2012年开始,海尔进入了网络