【江科大】STM32:DMA转运

DMA

  • 直接存储器存取(协助CPU完成数据转运,可以直接访问32位内部存储器,内存SRAM,程序存储器Flash,寄存器等)

  • DMA可以提供外设和存储器或者存储器和存储器之间的高速数据传输,无须CPU干预,节省了CPU的资源

  • 12个独立可配置的通道: DMA1(7个通道(C8T6只有这个)), DMA2(5个通道)

  • 每个通道都支持软件触发和特定的硬件触发

  • (如存储器-》存储器如SRAM-》Flash)

  • 硬件触发:外设-》存储器如ADC的数据,只有转换完成,触发DMA,DMA才完成一次转运。

  • STM32F103C8T6 DMA资源:DMA1(7个通道)

  • 计算机的5的部分:(运算器,控制器)CPU,存储器,输入和输出设备

    虽然各个通道之间独立工作,但DMA总线只有一条,所以所有的通道只能分时复用这条DMA总线,如果产生冲突就会由仲裁器,根据通道的优先级,设置谁先用,谁后用

    如果DMA和CPU访问同一个目标,~~~~~~~~

    DMA就会暂CPU的访问,防止冲突。

    不过总线仲裁器仍然保证CPU得到一半的总线带宽

  • DMA总线:用于访问各个存储器,内部多个通道可以独立的进行数据转运

  • 仲裁器:用于调度各个通道,防止冲突:

  • AHB从设备:用于配置DMA参数

  • DMA请求:用于硬件触发DMA的数据转运
    Flash :是ROM的一种,不论哪个总线访问,都是只读不写

  • 如果DMA的目的地址写了Flash,那么转运的时候就会出错。

    可以配置Flash,才可以写们很复杂

    数据寄存器可以正常读写

DMA框图


自动重装和(存储器到-》存储器)软件触发不能同时使用,因为会导致一直转运停不下来。

数据宽度

数据转运+DMA

ADC扫描模式+DMA

const 修饰的变量会存放在flash里

尽可能将比较大,无需修改的数组,常量,常变量存放在flash

临时变量会被存储在SRAM

想要查找某个寄存器的地址

1,先查一下这个寄存器所在外设的地址(映像),再去查对应外设的寄存器的映像

DMA中断

就配置DMA_ITconfig()

然后配置NVIC

DMA转运的三个条件

开启DMA

1.传输计数器>0

2.触发源有信号

3.DMA使能

给传输计数器写值,必须关闭DMA(规定c)

修改传输计数器的值的条件

c 复制代码
必须给DMA失能,让DMA停止转运
void DMA_DeInit(DMA_Channel_TypeDef* DMAy_Channelx);
void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDef* DMA_InitStruct);

void DMA_StructInit(DMA_InitTypeDef* DMA_InitStruct);

void DMA_Cmd(DMA_Channel_TypeDef* DMAy_Channelx, FunctionalState NewState);
//中断
void DMA_ITConfig(DMA_Channel_TypeDef* DMAy_Channelx, uint32_t DMA_IT, FunctionalState NewState);

//传输计数器
void DMA_SetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx, uint16_t DataNumber); 

uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx);
//获取标志位 (判断是否转运完成)
FlagStatus DMA_GetFlagStatus(uint32_t DMAy_FLAG);

void DMA_ClearFlag(uint32_t DMAy_FLAG);
//获取中断标志位
ITStatus DMA_GetITStatus(uint32_t DMAy_IT);
void DMA_ClearITPendingBit(uint32_t DMAy_IT);

DMA数据转运程序

main.c

ADC多通道+DMA


相关推荐
意法半导体STM3228 分钟前
【官方原创】LAT1724 STM32CubeIDE for VSCode 修改链接文件中的起始地址无效?
vscode·stm32·单片机·嵌入式硬件·mcu·stm32cube
BSD_HY1 小时前
嵌入式薄膜开关中断去抖:中断优先级分层实战策略
单片机·嵌入式硬件·薄膜开关·源头工厂·薄膜按键
Zw-awa12 小时前
八路循迹模块的 DO:先让小车沿着线跑起来
stm32
黑妹天下第一乖13 小时前
第09讲 · 多媒体与音频 SDK:硬件编解码与端侧语音
人工智能·嵌入式硬件·深度学习·机器人·音视频·iot
comyccccc14 小时前
LM2596电源PCB布局布线全解析学习笔记
单片机·嵌入式硬件
恒锐丰科技林技术员15 小时前
EG2122 半桥栅极驱动芯片原理与工程应用解析
经验分享·嵌入式硬件·硬件工程
qq_4017004116 小时前
FreeRTOS 堆内存管理源码剖析:释放一块内存,空闲块数量反而变少了?
单片机·freertos
新晨单片机设计17 小时前
S017C-基于STM32汽车防酒驾系统(心率、血氧、短信)【Proteus仿真+Keil程序+原理图】
stm32·单片机·proteus·防酒驾报警系统
fly_sunnn18 小时前
STM32-GPIO输出以及按键控制LED&光敏传感器控制蜂鸣器
stm32·单片机·嵌入式硬件
数字新视界18 小时前
U位资产管理系统发布全面数字化监控解决方案
嵌入式硬件·物联网·系统架构·机房管理·动力与环境监控系统