历史上的今天
返回首页

历史上的今天

今天是:2025年01月26日(星期日)

2019年01月26日 | STM32->DMA

2019-01-26 来源:eefocus

直接存储器存取DMA(Direct Memory Access):


    允许CPU内部的硬体子系统(外设)可以独立地直接读写系统存储器,它允许不同速度的硬件装置来传递数据而不依赖于CPU。单片机采用DMA提供外设和存储器之间或者存储器之间的高速数据传输。当CPU初始化这个传输动作后,数据的传输动作由DMA控制器来实行和完成。STM32有有两个DMA控制器,DMA1有7个通道,DMA2有5个通道,每个通道专门用来管理一个或多个外设对存储器访问的请求,一个仲裁器来协调各个DMA请求的优先权。起到通信“桥梁”的作用,快速是其应用的主要价值。


    I2C/UART等外设寄存器数据送到SRAM;


    SRAM的两个区域之间传输;


    外设寄存器到外设寄存器;


    SRAM到外设寄存器。


    DMA控制器和Cortex-M3核共享系统数据总线执行直接存储器数据传输。当CPU和DMA同时访问相同的目标(RAM或外设)时,DMA请求可能会停止 CPU访问系统总线达若干个周期,总线仲裁器执行循环调度。外设发送一个请求信号到DMA控制器后,DMA控制器根据通道的优先权处理请求。


使用ADC1-DMA的初始化过程:


  DMA_InitTypeDef DMA_InitStructure;


  /* DMA channel1 configuration ----------------------------------------------*/

  DMA_DeInit(DMA1_Channel1);

  DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;         //数据来源,对应的寄存器地址

  DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;    //数据保存位置,通过读该变量获得AD值

  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                  //DMA的传输方向,此处单向传输

  DMA_InitStructure.DMA_BufferSize = 1;                               //缓存的区域大小

  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;    //在对应多个来源时使能以递增获取

  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;            //对应多个存放处使能以递增放置

  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;

  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                     //连续循环工作或者只工作一次

  DMA_InitStructure.DMA_Priority = DMA_Priority_High;                 //DMA的优先级,以便分级管理调度

  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                        //两个变量间是否互相访问

  DMA_Init(DMA1_Channel1, &DMA_InitStructure); 


HAL库中设置:


    hdma_adc1.Instance = DMA1_Channel1;                    

    hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;

    hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;

    hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;

    hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;

    hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;

    hdma_adc1.Init.Mode = DMA_CIRCULAR;

    hdma_adc1.Init.Priority = DMA_PRIORITY_LOW;

    if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)

    {

      _Error_Handler(__FILE__, __LINE__);

    }


    __HAL_LINKDMA(hadc,DMA_Handle,hdma_adc1);


    通过直接取用定义的在RAM中用于保存ADC值得数据进行调用,在一些场合比使能然后等待读取寄存器数据更方便点。DMA初始化后就没有多少需要管理的处理了,十分方便。

上一篇:STM32->RTC

下一篇:STM32->ADC

推荐阅读

史海拾趣

Cristek Interconnects Inc公司的发展小趣事

Cristek Interconnects Inc公司自成立以来,一直致力于电子连接器技术的研发与创新。在早期的发展阶段,公司凭借其出色的研发团队,成功开发出一种新型的高性能连接器,这种连接器具有更高的导电性和更低的信号衰减,极大地提高了电子设备的性能。这一技术突破为公司赢得了市场的广泛认可,也奠定了Cristek在电子行业中的重要地位。

Advanced Milliwave Laboratories Inc公司的发展小趣事

AML深知技术创新是企业发展的核心动力。因此,公司始终坚持自主研发和技术创新,不断推出新的微波产品和技术。这些新产品不仅具有更高的性能和更广泛的应用范围,还进一步提升了AML在微波技术领域的竞争力。同时,AML还注重与高校和研究机构的合作,共同开展技术研发和人才培养,为公司的长远发展提供了有力支持。

Advanced Analog公司的发展小趣事

随着公司的不断发展和壮大,Advanced Analog开始积极拓展国际市场。公司在全球范围内设立了多个分支机构和销售网络,与众多国际知名企业和品牌建立了长期稳定的合作关系。通过参与国际电子展会和交流活动,Advanced Analog的产品和技术得到了更广泛的认可和赞誉,进一步提升了公司在国际市场的知名度和影响力。

Grayhill公司的发展小趣事
为防止过流和短路情况对电路造成损害,应设置合适的限流电阻和过流保护电路。
Advanced Components Industries Inc公司的发展小趣事

在快速发展的过程中,ACI始终注重品质管理。公司建立了严格的质量检测体系,确保每一件产品都符合高标准的质量要求。同时,ACI还积极推行持续改进的理念,不断优化生产流程,提高生产效率。

这些努力使得ACI的产品在市场上赢得了良好的口碑。客户对公司的产品和服务给予了高度评价,纷纷表示愿意与ACI建立长期合作关系。这些正面的反馈进一步推动了ACI的发展。

广东长利光电(Changli Optoelectronic)公司的发展小趣事

在广东长利光电的发展历程中,公司始终注重企业文化建设和社会责任履行。公司倡导“以人为本、诚信务实、创新进取”的价值观,为员工提供了良好的工作环境和培训机会。同时,公司还积极参与社会公益事业,为社区的发展和环境保护做出了贡献。这些举措不仅提升了公司的品牌形象,还增强了员工的归属感和凝聚力。

以上五个故事,展现了广东长利光电在电子行业的发展历程和取得的成就。从初创时期的坚持与创新,到质量管理的突破,再到市场拓展与全球化布局,以及技术升级与产品创新,最后到企业文化建设与社会责任履行,每一个阶段都充满了挑战与机遇。广东长利光电正是凭借着对LED技术的深刻理解和市场需求的敏锐洞察,不断创新和发展,成为了电子行业中的佼佼者。

问答坊 | AI 解惑

[资料]基于单片机的四位BCD编码器电路设计

基于单片机的四位BCD编码器电路设计 来源:现代电子技术 作者:刘静波 1 引言 BCD码又称二/十进制码,即二进制编码的十进制码,在设计、测试数字电路硬件过程或是面对带有BCD码接口的集成电路时,常常希望方便、快速地产生BCD码来完成当前的 ...…

查看全部问答>

AD603完整资料!!!

本帖最后由 paulhyde 于 2014-9-15 09:02 编辑 我这里有AD603的完整资料,和大家分享~~~~  …

查看全部问答>

拜求MATLAB仿真与DSP的问题

我做电机控制的仿真,在MATLAB的SINULIN中有电机的模块,可是没有DSP的模块,问能不能在simulik用一个DSP的模块和电机的模块搭建起控制系统的仿真模型? 求解答…

查看全部问答>

很有用,有点不舍的 数控电源

数控电源.rar 数控电源全部资料…

查看全部问答>

基于Windows程序设计的一个小问题

#include LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); //---------以下初始化窗口类------------ int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow) {         HWND ...…

查看全部问答>

如何让电动十字滑架移动?

请教各位: 计算机输出信号(偏差量)怎么可以带动电动十字滑架移动?之间需要怎么一个具体的原理,我不懂.需要什么设备,器件请教. 非常感谢! …

查看全部问答>

2011年国赛控制大推测!

本帖最后由 paulhyde 于 2014-9-15 09:29 编辑 …

查看全部问答>

msp430 adc12 可以转换负电压吗

如果把参考电压设置成负的可以吗…

查看全部问答>

win8系统下如何安装eZ430-RF2500驱动?

RT,win8 系统下插上去后不能自动安装,请教如何手动安装? …

查看全部问答>