基于STM32 F401 Discovery板:
DMA2在AHB1总线上
步骤一:使能DMA
#define DMA_STREAM_CLOCK RCC_AHB1Periph_DMA2
RCC_AHB1PeriphClockCmd(DMA_STREAM_CLOCK, ENABLE);
步骤二:reset DMA Stream register:
/* Reset DMA Stream registers (for debug purpose) */
DMA_DeInit(DMA_STREAM);
步骤三:
/* Check if the DMA Stream is disabled before enabling it.
Note that this step is useful when the same Stream is used multiple times:
enabled, then disabled then re-enabled... In this case, the DMA Stream disable
will be effective only at the end of the ongoing data transfer and it will
not be possible to re-configure it before making sure that the Enable bit
has been cleared by hardware. If the Stream is used only once, this step might
be bypassed. */
while (DMA_GetCmdStatus(DMA_STREAM) != DISABLE)
{
}
步骤四:初始化DMA 结构体
/* Configure DMA Stream */
DMA_InitStructure.DMA_Channel = DMA_CHANNEL;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SRC_Const_Buffer;
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)DST_Buffer;
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToMemory;
DMA_InitStructure.DMA_BufferSize = (uint32_t)BUFFER_SIZE;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_Init(DMA_STREAM, &DMA_InitStructure);
其中:
DMA_PeripheralBaseAddr--》外设地址,可以选择USART,I2C,ADC等
DMA_Memory0BaseAddr-》memory地址,用于外设和内存的数据传输
DMA_DIR -》传送方向,分别有外设到内存,内存到外设,内存到内存
DMA_BufferSize -》传输的buffer size
DMA_PeripheralInc -》外设地址是否自加
DMA_MemoryInc -》内存地址是否自加
DMA_PeripheralDataSize -》外设每个data的size,分别有1byte,半字,全字
DMA_MemoryDataSize -》内存的每个data的size,如上
DMA_Mode -》DMA mode,分别是传输完了是否循环还是正常
步骤四:DMA使能中断:
DMA_ITConfig(DMA_STREAM, DMA_IT_TC, ENABLE);
其中DMA有发送完成中断,完成一半中断,和错误中断等
步骤五:开始传输
/* DMA Stream enable */
DMA_Cmd(DMA_STREAM, ENABLE);
关键字:STM32 DMA 内存
引用地址:
STM32 DMA->内存到内存
推荐阅读最新更新时间:2024-03-16 15:37
单片机数据存储器RAM的扩展实例
RAM是用来存放各种数据的,MCS-51系列8位单片机内部有128 B RAM存储器,CPU对内部RAM具有丰富的操作指令。但是,当单片机用于实时数据采集或处理大批量数据时,仅靠片内提供的RAM是远远不够的。此时,我们可以利用单片机的扩展功能,扩展外部数据存储器。 常用的外部数据存储器有静态RAM(Static Random Access Memory—SRAM)和动态RAM(Dynamic Random Access Memory—DRAM)两种。前者读/写速度高,一般都是8位宽度,易于扩展,且大多数与相同容量的EPROM引脚兼容,有利于印刷板电路设计,使用方便;缺点是集成度低,成本高,功耗大。后者集成度高,成本低,功耗相对较
[单片机]
STM32中断过程详解
对于 STM32 讲(还是以Timer2例),外部中断通道位置 28(35 号优先级)是给外部设备 TIME2 的,但 TIME2本身能够引起中断的中断源或事件有好多个,比如更新事件(上溢/下溢) 、输入捕获、输出匹配、DMA 申请等。所有TIME2 的中断事件都是通过一个 TIME2 的中断通道向 STM32 内核提出中断申请,那么 STM32 中如何处理和控制 TIME2 和它众多的、不同的、中断申请呢? 1.因为cortex_m3 内核对于每一个外部中断通道都有相应的控制字和控制位,用于单独的和总的控制该中断通道。它们包括有: 中断优先级控制字:PRI_n(前面有提到过) 中断允许设置位:在 ISER 寄存器中 中断允许
[单片机]
轻松掌握stm32直流电机驱动与测速
说实话就现在的市场应用中stm32已经占到了绝对住到的地位,51已经成为过去式,32的功能更加强大,虽然相应的难度有所增加,但是依然阻止不了大家学习32的脚步,不说大话了这些大家都懂要不然也不会学习stm32的人那么多!!! 进入我们今天的主题,今天给大家介绍的是stm32中一个很小但是比较实用的stm32直流电机驱动与测速,话不多说先给大家上一段直流电机控制的代码。 void pwm_ARRPreloadConfig(void) { PrescalerValue = (uint16_t) (SystemCoreClock /TIM2_rate) - 1; //设定的是定时器的频率,要设定pwm的频率为50hz
[单片机]
STM32低功耗模式---停机和待机模式
已经在STM32F103下测试: 进入低功耗模式先执行: RCC_APB2PeriphResetCmd(0X01FC,DISABLE); //复位所有IO口, 端口全设置为高阻态,最好外设时钟也关闭 停机模式: RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //使能PWR外设时钟 /*进入停机模式, 停机模式还有两个选择模式,一个是调节器电压,可选常规或低压,低压在停机模式下功耗会更低,但是唤醒响应速度会慢一些;令一个唤醒方式的选择,可选事件唤醒、外部中断唤醒, 其实两者均可。*/ PWR_EnterSTOPMode(PWR_Regulator
[单片机]
关于STM32的计数与延时
Ⅰ关于STM32的计数和延时 在STM32中,具有计数(或计时)功能的模块基本都能实现延时功能。如:系统滴答SysTick、定时器TIM、实时时钟RTC、看门狗WDG。 精确延时一般使用定时器TIM即可实现。当然,是否精确,取决于你的主频(也就是晶振)是否准确,如果主频精确,那么实现的延时也一定精确。 一般来说,常温下实现us微秒级的延时,误差还是挺小的(应该说挺精确)。拿F407,主频168M来说,可以实现几十ns纳秒的延时,如果选用高精度的晶振,误差还是很小的。 总结:想要TIM定时器实现高精确的延时,就需要高精度的晶振。主频精确,那么延时就精确。 ⅡSTM32的TIM定时器 STM32的定时器有3类: 高级定
[单片机]
STM32--MDK仿真调试:逻辑分析仪的使用
在调试Debug环境下: 1.view--Analysis Windows--Logic Analyzer //调用逻辑分析仪 2.单击逻辑分析仪窗口右上角的“Setup…(setup logic analyzer)”进行设置:设置监视分析的引脚。 例:我想看看PORTB.5引脚的仿真情况: 在“current logic analyzer signals”--插入“PORTB.5”,然后它会自动转换成(PORTB &0x00000020) 5形式,即:只保留第5引脚的值,其他引脚清零; 在signal Display--Display Type:设置为bit/color:设置显示的颜色。 3.run运行一
[单片机]
STM32输入捕获--“PWM输入模式”(可拓展多路同时捕获)
前言 博文基于STM32F103ZET6和标准固件库V3.5.0在MDK5环境下开发; 本博文只讨论输入捕获的PWM输入模式,这个模式是STM32输入捕获检测脉宽和频率的一种硬件处理机制,说白了就是STM32芯片专门用来进行对PWM进行捕获的一个功能;此方法相比较于传统的PWM的捕获方法,大大减小了代码量,提高了检测效率,而实际上对于PWM信号的检测还有其他方法(下面我会介绍,就是原子教程提供的方法),并且关于繁琐的寄存器的介绍这里就不多说了,有兴趣的话可以直接去我的另外一个博客里去看: https://blog.csdn.net/wuyuzun/article/details/73135662 ;(备注:此链接里的博客里有一个配
[单片机]
韩国2015年前将非内存芯片份额提高一倍
韩国知识经济部上星期四称,韩国将在未来五年投资1.7万亿韩元(14.5亿美元)帮助韩国芯片厂商找出进入快速增长的非内存芯片市场的道路。 三星电子和海力士半导体等韩国芯片厂商目前拥有全球内存芯片市场50%以上的份额。但是,在非内存芯片市场,韩国厂商的市场份额只有大约3%。韩国政府正是在这个背景之下采取这个行动的。 根据这个计划,韩国芯片厂商在2015年要取得全球非内存芯片市场7.5%的份额。2009年全球非内存芯片市场的规模是1858亿美元。这个市场预计将以平均15%的年增长率继续增长。 韩国知识经济部信息和通讯标准局负责人Jung Man-ki说,我们目前在内存芯片市场排名第一。但是,我们在非内存芯片市场却非
[半导体设计/制造]