STM32复习笔记(七) —— DMA传输(MTM)
1.DMA传输方向
1)存储器到外设 2)外设到存储器 3)存储器到存储器
2.DMA框图 (STM32F10xxx参考手册 图21 DMA框图) 注:大容量产品和互联型产品 3.不同外设可能对应不同通道 (STM32F10xxx参考手册 表59 各个通道的DMA1请求一览) 对于存储器到存储器传输模式,需借用外设端口,当使用外设通道代表存储器时,通道可随意选择
4.本例程软件设计思路 (实现存储器到存储器传输)
1)于内存中开辟两个数组空间 mData_Buffer and pData_Buffer 2)向 mData_Buffer 中存入数据 3)使用 DMA 将 mData_Buffer 中数据移动到 pData_Buffer 中
5.代码编写
于 main.c 中编写代码
#include "stm32f10x.h"
#define DATA_LENGTH 4
uint8_t mData_Buffer[DATA_LENGTH] = {0x01,0x00,0x00,0x05};
uint8_t pData_Buffer[DATA_LENGTH] = {0x00,0x00,0x00,0x00};
int main(void)
{
RCC->AHBENR |= (uint32_t)0x01 << 0;
DMA1_Channel1->CCR &= (uint32_t)0xffff8000;
DMA1_Channel1->CCR |= (uint32_t)0x01 << 4;
DMA1_Channel1->CCR |= (uint32_t)0x00 << 5;
DMA1_Channel1->CCR |= (uint32_t)0x01 << 6;
DMA1_Channel1->CCR |= (uint32_t)0x01 << 7;
DMA1_Channel1->CCR |= (uint32_t)0x00 << 8;
DMA1_Channel1->CCR |= (uint32_t)0x00 << 10;
DMA1_Channel1->CCR |= (uint32_t)0x01 << 12;
DMA1_Channel1->CCR |= (uint32_t)0x01 << 14;
DMA1_Channel1->CNDTR = (uint32_t)DATA_LENGTH;
DMA1_Channel1->CPAR = (uint32_t)pData_Buffer;
DMA1_Channel1->CMAR = (uint32_t)mData_Buffer;
DMA1_Channel1->CCR |= (uint32_t)0x01 << 0;
while(DMA1->ISR & ((uint32_t)0x01 << 1));
while(1);
}
6.编译及仿真
点击编译,如无错误可进入仿真界面 分别找到 mData_Buffer and pData_Buffer,右击添加至 Watch1 窗口 可以看出,程序运行前 mData_Buffer and pData_Buffer 均为我们设定的初始内容 也可查看 DMA 各个寄存器值在程序运行前后的状态 (Peripherals - System Viewer - DMA) 点击运行 不难看出,mData_Buffer 值已经传输到 pData_Buffer 中,与预想结果一致
|