相关库函数
恢复缺省配置
void DMA_DeInit(DMA_Channel_TypeDef* DMAy_Channelx);
初始化DMA
void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDef* DMA_InitStruct);
结构体初始化
void DMA_StructInit(DMA_InitTypeDef* DMA_InitStruct);
DMA使能
void DMA_Cmd(DMA_Channel_TypeDef* DMAy_Channelx, FunctionalState NewState);
中断输出使能
void DMA_ITConfig(DMA_Channel_TypeDef* DMAy_Channelx, uint32_t DMA_IT, FunctionalState NewState);
DMA设置当前数据寄存器
void DMA_SetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx, uint16_t DataNumber);
DMA获取当前数据寄存器
uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx);
获取DMA标志位状态
FlagStatus DMA_GetFlagStatus(uint32_t DMAy_FLAG);
清除DMA标志位
void DMA_ClearFlag(uint32_t DMAy_FLAG);
获取DMA中断标志位状态
ITStatus DMA_GetITStatus(uint32_t DMAy_IT);
清除DMA中断标志位
void DMA_ClearITPendingBit(uint32_t DMAy_IT);
开启ADC DMA触发信号
void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState);
-
DMA是AHB总线的设备
-
DMA软件触发和硬件触发不能同时使用,如果同时使用DMA就会连续触发
-
DMA转运有三个条件:1.传输计数器大于0 2.触发源有触发信号 3.DMA使能
一、DMA数据转运
1.stm32单片机RAM和ROM
不加const修饰
加上const修饰
代码部分
1 |
|
现象
flash里面编译的代码部分,地址位于flah最前面,所以这里变量的显示在靠后的地址
const关键字节省SRAM空间
1 | /*OLED字模库,宽8像素,高16像素*/ |
结构体访问寄存器RAM地址
1 | OLED_ShowHexNum(2,1,(uint32_t)&ADC1->DR,8); |
外设的起始地址+寄存器的偏移地址=指定寄存器的地址
使用结构体访问,指定地址对应寄存器,这样,结构体访问就是寄存器的地址
2.DMA转运数组
软件触发代码部分
1 |
|
3.DMA软件触发
DMA传输计数器软件重装
1 |
|
main.c
1 |
|
将DataA用const修饰
DataA此时为flash里面的变量,所以地址为08开头
ADC+ DMA转运
ADC单次扫描,DMA单次转运+软件触发
1 |
|
ADC连续扫描+DMA循环转运模式
1 | void AD_DMA_Init() |
思考:
- 定时器触发ADC单词转换后通过DMA转运?
- 串口发送的数据使用DMA进行存储器到外设的转运