stm32cubemx教程之DMA的MemToMem例子,即數(shù)據(jù)從flash到sram的DMA操作 關(guān)于DMA的使用,先來測試m2m的操作, 官方有這樣的例子,我是拿來參照的. 咱們用stm32cubemx來設(shè)置并自動生成DMA的代碼,稍加修改就可以用了. 先來說下什么是從flash到sram.... 首先比如一個數(shù)據(jù)變量, 當你定義它為不可修改屬性的時候,它就會保存在flash中, 即flash中存儲的是不可修改的數(shù)據(jù).......可以理解為你燒寫進去的數(shù)據(jù)...嗯 而sram是可更改變量,即你寫的代碼中的那些運行中要修改數(shù)值的變量,可以理解為 這個變量保存在內(nèi)存中,嗯,電腦的內(nèi)存,你想啊,你關(guān)機之后內(nèi)存里面的東西就沒了..... 好了,程序中不可修改屬性一般用 const 來修飾. 我們的例子就是基于這個 . 首先,設(shè)置stm32cubemx的RCC,然后設(shè)置其中的DMA項. 你設(shè)置完RCC啥也別管,直接打開軟件的第三個選項卡,里面有DMA, 就點ADD,添加一個類似下圖的 還有記得返回NVIC開啟DMA的中斷. 生成代碼. 打開dma.c文件添加 hdma_memtomem_dma2_stream0 .XferCpltCallback = TransferComplete; hdma_memtomem_dma2_stream0 .XferErrorCallback = TransferError; 意思是,產(chǎn)生中斷的調(diào)用函數(shù)定義,第一個是dma傳輸完成調(diào)用名為TransferComplete的函數(shù) 第二個是傳輸出錯則調(diào)用名字為TransferError的函數(shù), 然后再文件末尾添加這兩個函數(shù) / 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文件能夠調(diào)用dma. 在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屬性的數(shù)據(jù),我們準備把它寫入到aDST_Buffer的sram里面 然后再main()主函數(shù)中添加 HAL_DMA_Start_IT(&hdma_memtomem_dma2_stream0,(uint32_t)&aSRC_Const_Buffer, (uint32_t)&aDST_Buffer, 32); 開啟dma中斷傳輸,你可以看到我用了幾個led指示傳輸?shù)臓顟B(tài),你也可以在線調(diào)試debug查看 看到aSRC_Const_Buffer這個變量的地址是: 0x8001D8C ,這個地址在flash中,屬于flash的地址 而我們接受變量aDST_Buffer的地址:0x20000068 ,這個地址在sram地址范圍中, 說明我們傳輸數(shù)據(jù)正確,從flash通過DMA傳輸?shù)搅藄ram中 |
|