stm32的DMA1通道一览表,stm32使用DMA的相关操作

dma(direct memory access)常译为“存储器直接存取”。早在intel的8086平台上就有了dma应用了。
一个完整的微控制器通常由cpu、存储器和外设等组件构成。这些组件一般在结构和功能上都是独立的,而各个组件的协调和交互就由cpu完成。如此一来,cpu作为整个芯片的核心,其处理的工作量是很大的。如果cpu先从a外设拿到一个数据送给b外设使用,同时c外设又需要d外设提供一个数据。。。这样的数据搬运工作将使cpu的负荷显得相当繁重。
严格的说,搬运数据只是cpu的比较不重要的一种工作。cpu最重要的工作室进行数据运算,从加减乘除到一些高级的运算,包括浮点、积分、微分、fft等。cpu还需要负责复杂的中断申请和响应,以保证芯片的实时性能。
理论上常见的控制外设,比如usart、i2c、spi甚至是usb等通信接口,单纯的利用cpu进行协议模拟也是可以实现的,比如51单片机经常使用i/o口模拟i2c协议通信。但这样既浪费了cpu的资源,同时实现后的性能表现往往和使用专门的硬件模块实现的效果相差甚远。从这个角度来看,各个外设控制器的存在,无疑降低了cpu的负担,解放了cpu的资源。
数据搬运这一工作占用了大部分的cpu资源,成为了降低cpu的工作效率的主要原因之一。于是需要一种硬件结构分担cpu这一职能——dma。
从数据搬运的角度看,如果要把存储地址a的数值赋给另外一个地址上b的变量,cpu实现过程为首先读出a地址上的数据存储在一个中间变量,然后再转送到b地址的变量上。使用dma则不需要中间变量,直接将a地址的数值传送到b地址的变量里。无疑减轻了cpu的负担,也提高了数据搬运的效率。
stm32中dma1有7个通道,dma2有5个通道。dma挂载的时钟为ahb总线,其时钟为72mhz,所以可以实现高速数据搬运。
stm32的dma1通道一览表
stm32使用dma的相关操作:
1、dma的配置
void dma_configuration(void){ dma_inittypedefdma_initstructure; //dma设置: //设置dma源:内存地址&串口数据寄存器地址 //方向:内存-->外设 //每次传输位:8bit //传输大小dma_buffersize=sendbuff_size //地址自增模式:外设地址不增,内存地址自增1 //dma模式:一次传输,非循环 //优先级:中 dma_deinit(dma1_channel4);//串口1的dma传输通道是通道4 dma_initstructure.dma_peripheralbaseaddr = usart1_dr_base; dma_initstructure.dma_memorybaseaddr = (u32)sendbuff; dma_initstructure.dma_dir = dma_dir_peripheraldst;//外设作为dma的目的端 dma_initstructure.dma_buffersize = sendbuff_size;//传输大小 dma_initstructure.dma_peripheralinc = dma_peripheralinc_disable;//外设地址不增加 dma_initstructure.dma_memoryinc = dma_memoryinc_enable;//内存地址自增1 dma_initstructure.dma_peripheraldatasize = dma_peripheraldatasize_byte; dma_initstructure.dma_memorydatasize = dma_memorydatasize_byte; dma_initstructure.dma_mode = dma_mode_circular;
//dma_mode_normal(只传送一次), dma_mode_circular(不停地传送) dma_initstructure.dma_priority = dma_priority_medium;//(dma传送优先级为中等) dma_initstructure.dma_m2m = dma_m2m_disable; dma_init(dma1_channel4, &dma_initstructure);}
注:
1、传输通道:
通过查表,串口1的发送对应的是dma的通道4,所以此处选择通道4.
2、dma传输方式:
(1)dma_mode_normal,正常模式,当一次dma数据传输完后,停止dma传送,对于上例而言,就是dma_peripheraldatasize_byte个字节的传送完成后,就停止传送。
(2)dma_mode_circular
循环模式,当传输完一次后,重新接着传送,永不停息。
2、外设的dma方式设置
将串口1设置成dma模式:
usart_dmacmd(usart1, usart_dmareq_tx, enable);
3、待传输数据的定义和初始化
#define sendbuff_size 10240vu8 sendbuff[sendbuff_size];
for(i=0;i 4、开始dma传输(使能对应的dma通道)dma_cmd(dma1_channel4, enable);
5、dma传输的完成
while(dma_getflagstatus(dma1_flag_tc4) == reset) { led_1_rev; //led翻转 delay(); //浪费时间 }
当传输完成后,就会跳出上面的死循环。

云丁科技智能纽扣钥匙介绍
2023岳麓峰会 · 媒体关注丨拓维信息瞄准国产软硬一体化行业第一
数智·沿公路而至|开鸿智谷作为OpenHarmony生态代表参加中国高速公路信息化大会
汉思化学BGA芯片底部填充胶助力打造最强AI芯片
基于嵌入式系统的公交车停站时间监控系统
stm32的DMA1通道一览表,stm32使用DMA的相关操作
半导体产业链三巨头看旺下半年市场
北醒高性能激光雷达相关技术得到量产的乘用车客户的认可
无人数据中心实现还需时间 仍然无法摆脱人类的控制
广和通斩获2023 AIoT新维奖·行业先锋榜
特斯拉变卦!中国造Model3将销往欧洲
CCD投影测径仪的基本原理和有什么作用
亚洲服务器有哪些,亚洲服务器的优势是什么
薄膜表面瑕疵在线检测设备的原理及功能
供应链大脑:企业的核心竞争所在
重庆布局亚洲集成电路旗舰基地
无人驾驶公司中智行(Allride.ai)宣布已完成数亿元天使轮融资
超声波液位传感器-MB7052_中国传感器技术发展
新一代PSR拓朴架构高集成适配器电源设计方案
听懂一句AI实话,做成一件零售实事