历史上的今天
返回首页

历史上的今天

今天是:2025年03月13日(星期四)

正在发生

2020年03月13日 | stm32 DMA初始化选项研究

2020-03-13 来源:eefocus

DMA比较好用,也比较简单,今天在做多通道ADC“连续”“扫描”采样时,对DMA有了更深一点的认识,今天给大家分享下:


#define ADC1_DR_Address    ((uint32_t)0x4001244C)


unsigned short Buff[3];


......


  DMA_DeInit(DMA1_Channel1);

  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_Address;

  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)Buff;

  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;

  DMA_InitStructure.DMA_BufferSize = 3;

  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

  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_InitStructure.DMA_M2M = DMA_M2M_Disable;

  DMA_Init(DMA1_Channel1, &DMA_InitStructure);

  DMA_Cmd(DMA1_Channel1, ENABLE); 


初始化时,要先用DMA_DeInit将DMA的通道初始化成缺省值。


外设地址设置,内存基地址设置,设置外设的传输属性(输入/输出),这些都容易理解;


  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;


#define DMA_DIR_PeripheralDST              ((uint32_t)0x00000010)

#define DMA_DIR_PeripheralSRC              ((uint32_t)0x00000000)


这里是设置谁为数据传输源;


DMA_InitStructure.DMA_BufferSize = 3;


如果是获取一组数值,像ADC,USART,我们可以用一个缓冲区,如果不用,像ADC数据更新快的,马上就被刷新了。我这里的DMA_Buffersize 是 Buff的大小;


DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;


#define DMA_PeripheralInc_Enable           ((uint32_t)0x00000040)

#define DMA_PeripheralInc_Disable          ((uint32_t)0x00000000)


#define DMA_MemoryInc_Enable               ((uint32_t)0x00000080)

#define DMA_MemoryInc_Disable              ((uint32_t)0x00000000)


这个根据需要进行设置;


DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;

DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;


#define DMA_PeripheralDataSize_Byte        ((uint32_t)0x00000000)

#define DMA_PeripheralDataSize_HalfWord    ((uint32_t)0x00000100)

#define DMA_PeripheralDataSize_Word        ((uint32_t)0x00000200)


#define DMA_MemoryDataSize_Byte            ((uint32_t)0x00000000)

#define DMA_MemoryDataSize_HalfWord        ((uint32_t)0x00000400)

#define DMA_MemoryDataSize_Word            ((uint32_t)0x00000800)


这个设置获取数据的大小;


DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;


#define DMA_Mode_Circular                  ((uint32_t)0x00000020)

#define DMA_Mode_Normal                    ((uint32_t)0x00000000)


这个要强调下,像我这里,要不断更新Buff[0],Buff[1],Buff[2],我上面设置的缓冲区正好也是3,我们可以用Circular属性来设置!他就不停的刷新这段地址!


他还有一种属性是Normal,这种属性一般用在Point 2 Point时使用;


DMA_InitStructure.DMA_Priority = DMA_Priority_High;


#define DMA_Priority_VeryHigh              ((uint32_t)0x00003000)

#define DMA_Priority_High                  ((uint32_t)0x00002000)

#define DMA_Priority_Medium                ((uint32_t)0x00001000)

#define DMA_Priority_Low                   ((uint32_t)0x00000000)


因为DMA有多路,所以我们要规定先传哪路数据,所以我们就要规定一个优先级;


DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;


#define DMA_M2M_Enable                     ((uint32_t)0x00004000)

#define DMA_M2M_Disable                    ((uint32_t)0x00000000)


这个是设置是不是Memary to Memary的!

推荐阅读

史海拾趣

场效应半导体(Cmos)公司的发展小趣事

台湾积体电路制造股份有限公司(TSMC)在CMOS技术的发展中也有着不可忽视的贡献。作为一家专业的半导体制造企业,TSMC凭借其在生产工艺和质量控制方面的优势,成功地为全球众多知名半导体企业提供了优质的CMOS芯片制造服务。通过不断的技术创新和生产优化,TSMC的CMOS芯片品质得到了业界的广泛认可,使其在全球半导体制造市场上占据了重要地位。

DURAKOOL公司的发展小趣事

在1935年,DURAKOOL公司在Durakool成立,由几位电子工程师和发明家共同创立。他们的初衷是为电气和电子市场提供高质量的组件和系统。起初,公司面临着资金短缺和市场竞争激烈的挑战,但他们凭借对技术的热情和不懈的努力,逐渐开发出了一系列具有竞争力的产品,如Durakool水银继电器和功率继电器,赢得了客户的认可。

Greenwich Instruments Ltd公司的发展小趣事

随着全球对环境保护和可持续发展的重视,Greenconn Corp积极响应号召,将绿色理念融入产品设计和生产全过程。公司致力于开发环保型连接器产品,采用可回收材料、减少能源消耗和废弃物排放等措施,努力实现生产过程的绿色化。同时,Greenconn Corp还积极参与行业内的绿色标准制定和认证工作,为推动整个电子行业的绿色发展贡献了自己的力量。

General Electric Solid State公司的发展小趣事

面对日益激烈的市场竞争和不断变化的客户需求,Greenconn Corp积极推动智能制造转型。公司引进先进的生产设备和技术,优化生产流程和管理模式,提高生产效率和产品质量。同时,公司还加强与高校、科研机构的合作,共同研发智能制造关键技术,推动智能制造技术在连接器生产领域的应用。这些努力不仅提升了Greenconn Corp的竞争力,还为公司的可持续发展奠定了坚实基础。

Cramer公司的发展小趣事

在早期的发展阶段,Cramer公司推出了一款革命性的智能手机。这款手机采用了最新的芯片技术和高分辨率显示屏,为用户提供了出色的使用体验。为了满足市场需求,Cramer公司加大了研发投入,不断优化产品性能。最终,这款手机在市场上取得了巨大的成功,为Cramer公司带来了可观的收益,并奠定了其在电子行业中的地位。

CommScope Inc公司的发展小趣事

在通信行业,技术的不断创新和产品的持续升级是企业保持竞争力的关键。康普公司一直注重研发和创新,不断推出具有竞争力的新产品和解决方案。例如,在2004年,康普成立了CCS(连接解决方案)工厂,主要生产宽带同轴电缆、网络对绞线缆以及铜和光纤连接器系列产品。这些产品不仅满足了市场对于高速、高质量网络连接的需求,也进一步巩固了康普在通信行业的领先地位。

问答坊 | AI 解惑

矢量控制,电机定子磁路初始值计算

工程上,怎样计算,有做低压变频器的吗?…

查看全部问答>

有关PLL的小问题

QUARTUS II里面锁相环PLL怎么不能设为10M以下的,而且11M,13M为什么也不能啊。。。…

查看全部问答>

这两句打印信息是什么搞的,查找不到啊?

DeviceFolder::LoadDevice!Enumerate Found deprecated load instructions at (Drivers\\BuiltIn\\AFD). Driver cannot be unloaded. USB enable interrutp DeviceFolder::LoadDevice!Enumerate Found deprecated load instructions at (Drivers\ ...…

查看全部问答>

系统挂起问题

我有两个问题想请教各位 1.为何我点击‘开始’-‘挂起’后,屏幕的背景灯一直不灭?如何才能使屏幕在点击‘挂起’后就能关闭? 2.我在外部设置了一个按键,按下它则系统进入挂起,再按则被唤醒,该功能已做通,为何我点‘开始’中的‘挂起’后无 ...…

查看全部问答>

ARM裸板编程时要实现snmp,mib文件是不是必须的?

MIB是代理保存的设备状态信息,那么如果设备自身信息以其他方式组织,比如共享内存、全局变量、结构体,那么只要发包时包含自身信息不是就可以了,是不是就可以不要什么mib文件,不必非得按照MIB文件的格式组织吧? 现在我想裸板编程,移植lwip,在 ...…

查看全部问答>

在CE下ISA驱动封装的DLL用注册吗?

我使的是PC104是威盛的芯片组在上面做的ISA卡的驱动DLL我已经把它加载进NK了,问下ISA驱动的DLL用修改platform.reg才能使用吗?…

查看全部问答>

如何在WinCE上播放midi文件

定制系统后,用WinCE上自带的播放器只能播放mp3,wma等格式的音频,但是我需要在WinCE上播放出midi格式的文件来。求教高手们,应该怎么办呢?…

查看全部问答>

CAN总线的分布式运动控制

                                        ...…

查看全部问答>

关于CAN数据包的接收处理

我的应用是这样的,使用CAN中断接收数据包,如果第一个数据包发来后进入了中断,但我的程序还没来得急把数据包里的8字节读出来,第二个数据包又来了,把第一个数据包冲掉怎么办? 有什么好的办法处理这个问题?     ...…

查看全部问答>

傻傻的问一句,是否可用汇编语言来对STM32103编程?

                                 我暂时不需要OS,不需要界面,纯粹为了通信和控制之用,是否可用汇编语言来对STM30F103编程呢?…

查看全部问答>