DMA

stm32cubemx教程之DMA的MemToMem例子,即数据从flash到sram的DMA操作

stm32cubemx教程之DMA的MemToMem例子,即数据从flash到sram的DMA操作
关于DMA的使用,先来测试m2m的操作,
官方有这样的例子,我是拿来参照的.
咱们用stm32cubemx来设置并自动生成DMA的代码,稍加修改就可以用了.
先来说下什么是从flash到sram....
首先比如一个数据变量, 当你定义它为不可修改属性的时候,它就会保存在flash中,
即flash中存储的是不可修改的数据.......可以理解为你烧写进去的数据...嗯
而sram是可更改变量,即你写的代码中的那些运行中要修改数值的变量,可以理解为
这个变量保存在内存中,嗯,电脑的内存,你想啊,你关机之后内存里面的东西就没了.....
好了,程序中不可修改属性一般用 const 来修饰.
我们的例子就是基于这个 .
首先,设置stm32cubemx的RCC,然后设置其中的DMA项.
你设置完RCC啥也别管,直接打开软件的第三个选项卡,里面有DMA,
就点ADD,添加一个类似下图的

4.png

还有记得返回NVIC开启DMA的中断.
生成代码.
打开dma.c文件添加
hdma_memtomem_dma2_stream0 .XferCpltCallback = TransferComplete;
hdma_memtomem_dma2_stream0 .XferErrorCallback = TransferError;
意思是,产生中断的调用函数定义,第一个是dma传输完成调用名为TransferComplete的函数
第二个是传输出错则调用名字为TransferError的函数,
然后再文件末尾添加这两个函数
/ USER CODE BEGIN 2 /
static void TransferComplete(DMA_HandleTypeDef *DmaHandle)
{
/ Turn LED4 on: Transfer correct /
HAL_GPIO_WritePin (GPIOD,GPIO_PIN_12,GPIO_PIN_RESET );
}

/**
* @brief DMA conversion error callback
* @note This function is executed when the transfer error interrupt
* is generated during DMA transfer
* @retval None
*/
static void TransferError(DMA_HandleTypeDef *DmaHandle)
{
/ Turn LED5 on: Transfer Error /
HAL_GPIO_WritePin (GPIOD,GPIO_PIN_13,GPIO_PIN_RESET );
}

/ USER CODE END 2 /
意思就不写了.
哦,对了,还要打开dma.h文件
在里面添加 extern DMA_HandleTypeDef hdma_memtomem_dma2_stream0;
意思是为了使main.c文件能够调用dma.

2.png


3.png



在main.c文件头部用户代码输入0处添加
/ USER CODE BEGIN 0 /
static const uint32_t aSRC_Const_Buffer= {
0x01020304,0x05060708,0x090A0B0C,0x0D0E0F10,
0x11121314,0x15161718,0x191A1B1C,0x1D1E1F20,
0x21222324,0x25262728,0x292A2B2C,0x2D2E2F30,
0x31323334,0x35363738,0x393A3B3C,0x3D3E3F40,
0x41424344,0x45464748,0x494A4B4C,0x4D4E4F50,
0x51525354,0x55565758,0x595A5B5C,0x5D5E5F60,
0x61626364,0x65666768,0x696A6B6C,0x6D6E6F70,
0x71727374,0x75767778,0x797A7B7C,0x7D7E7F80};

static uint32_t aDST_Buffer;
/ USER CODE END 0 /
意思是定义一个const属性的数据,我们准备把它写入到aDST_Buffer的sram里面
然后再main()主函数中添加
HAL_DMA_Start_IT(&hdma_memtomem_dma2_stream0,(uint32_t)&aSRC_Const_Buffer, (uint32_t)&aDST_Buffer, 32);
开启dma中断传输,你可以看到我用了几个led指示传输的状态,你也可以在线调试debug查看

1.png

看到aSRC_Const_Buffer这个变量的地址是: 0x8001D8C ,这个地址在flash中,属于flash的地址
而我们接受变量aDST_Buffer的地址:0x20000068 ,这个地址在sram地址范围中,
说明我们传输数据正确,从flash通过DMA传输到了sram中

已邀请:

admin

赞同来自:

额,有人也许会问了: 你怎么知道那两个地址一个是在flash中一个在sram中????
额,其实你去看看手册最好,..
给你个最简单明了的办法,你用keil的话,打开工程的option target,额,就是工程配置那个
里面就有.如下图

5.png

烙印→잊다

赞同来自:

lihai

夜中行舟

赞同来自:

#include<studio.h>


l1w1w1

赞同来自:

用HAL_DMA_RegisterCallback比较好。

要回复问题请先登录注册