欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: [零基礎學習STM32]第十一講:DMA實驗—存儲器到存儲器的傳輸 [打印本頁]

作者: kkhkbb    時間: 2018-4-3 15:21
標題: [零基礎學習STM32]第十一講:DMA實驗—存儲器到存儲器的傳輸
本帖最后由 kkhkbb 于 2018-4-3 21:21 編輯

一、概述:
1、DMA簡介
     DMA的英文拼寫是"Direct Memory Access",漢語的意思就是直接內存訪問,是一種不經過CPU而直接從內存存取數據的數據交換模式。在DMA模式下,CPU只須向DMA控制器下達指令,讓DMA控制器來處理數據的傳送,數據傳送完畢再把信息反饋給CPU,這樣就很大程度上減輕了CPU資源占有率,可以大大節省系統資源。DMA模式又可以分為Single-Word DMA(單字節DMA)Multi-Word DMA(多字節DMA)兩種。
2、DMA工作原理
     DMA 允許不同速度的硬件裝置來溝通,而不需要依于 CPU 的大量中斷負載。否則,CPU 需要從來源把每一片段的資料復制到暫存器,然后把他們再次寫回到新的地方。在這個時間中,CPU 對于其他的工作來說就無法使用。
     DMA 傳輸主要地將一個內存區從一個裝置復制到另外一個。當 CPU 初始化這個傳輸動作,傳輸動作本身是由 DMA 控制器來實行和完成。典型的例子就是移動一個外部內存的區塊到芯片內部更快的內存去。像是這樣的操作并沒有讓處理器工作拖延,反而可以被重新排程去處理其他的工作。所以,DMA傳輸對于高效能嵌入式系統算法和網絡是很重要的。
3、DMA類別
     按鍵主要有兩種類型:單字節DMA、多字節DMA
       單字節DMA:一次傳送一個字節,效率較低,但它會保證在兩次DMA傳送之間,CPU有機會獲得總線控制權,執行一次CPU總線周期。
      多字節DMA:一次請求傳送一個數據塊,效率高,但在整個DMA傳送期間,CPU長時間無法控制總線(無法響應其他DMA請求,無法處理其他中斷等)。
二、實驗原理:
      DMA(直接存儲器訪問)傳輸不需要占用CPU,可以在存儲器至實現高速的數據傳輸。本實驗采用DMA2控制器的數據流0,選用通道0進行數據傳輸。通過LED的顏色來判斷傳輸是否成功。
三、源代碼
1.主函數及DMA設置
  1. /*
  2. * Name                : main
  3. * Description         : ---
  4. * Author              : ysloveivy.
  5. *
  6. * History
  7. * --------------------
  8. * Rev                 : 0.00
  9. * Date                : 11/21/2015
  10. *
  11. * create.
  12. * --------------------
  13. */
  14. int main(void)
  15. {
  16.         int i,k;
  17.         DMA_InitTypeDef  DMA_InitStructure;

  18.         led.initialize();
  19.         dma.initialize();

  20.         //測試DMA,測試成功藍燈閃爍,測試失敗,紅燈閃爍
  21.         DMA_InitStructure.DMA_Channel = DMA_Channel_0;               //選擇通道0
  22.         DMA_InitStructure.DMA_PeripheralBaseAddr = (unsigned long int)src_buffer;  //DMA外設基地址
  23.         DMA_InitStructure.DMA_Memory0BaseAddr = (unsigned long int)dst_buffer;   //DMA存儲器地址
  24.         DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToMemory;              //方向為存儲器到存儲器
  25.         DMA_InitStructure.DMA_BufferSize = (unsigned long int)BUFFER_SIZE;   //數據傳輸量
  26.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;    //外設增量模式
  27.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;        //存儲器增量模式
  28.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; //設置外設數據寬度
  29.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;    //設置存儲器數據寬度
  30.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;            //運行模式為普通模式
  31.         DMA_InitStructure.DMA_Priority = DMA_Priority_High;        //優先級級別為高
  32.         DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;    //FIFO模式禁止
  33.         DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;     //FIFO閾值
  34.         DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;      //存儲器突發單次傳輸
  35.         DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;   //外設突發單次傳輸
  36.         DMA_Init(DMA2_Stream0, &DMA_InitStructure);
  37.         DMA_Cmd(DMA2_Stream0, ENABLE);       //使能DMA2_Stream0                                      

  38.         while(DMA_GetCmdStatus(DMA2_Stream0) != DISABLE);

  39.         for(i = 0;i < BUFFER_SIZE;i++){
  40.                 if(dst_buffer[i] != src_buffer[i]){
  41.                         //測試失敗
  42.                         while(1){
  43.                                         for(k = 0;k < 10000000;k++);
  44.                                         LED_RED_ON;
  45.                                         for(k = 0;k < 10000000;k++);
  46.                                         LED_RED_OFF;
  47.                         }
  48.                 }
  49. }
  50.         //測試成功
  51.         while(1){
  52.                 for(k = 0;k < 10000000;k++);
  53.                 LED_BLUE_ON;
  54.                 for(k = 0;k < 10000000;k++);
  55.                 LED_BLUE_OFF;
  56.         }
  57. }
復制代碼
2DMA初始化函數
  1. /*
  2. * Name                : initialize
  3. * Description         : ---
  4. * Author              : ysloveivy.
  5. *
  6. * History
  7. * --------------------
  8. * Rev                 : 0.00
  9. * Date                : 11/29/2015
  10. *
  11. * create.
  12. * --------------------
  13. */

  14. static int initialize(void)
  15. {
  16.   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);                             //使能DMA2時鐘
  17.   DMA_DeInit(DMA2_Stream0);                                                        //配置DMA2
  18.   while (DMA_GetCmdStatus(DMA2_Stream0) != DISABLE)                                //等待DMA可配置
  19.   {
  20.   }

  21.         return 0;
  22. }
復制代碼
3、小知識
     在DMA的設置中我們遇到了關于DMA設置的結構體,我們通過配置其相關參數,以實現我們想要的功能,其解釋如下:
  1. typedef struct
  2. {
  3.     uint32_t DMA_Channel;                   //選擇通道
  4.     uint32_t DMA_PeripheralBaseAddr;     //DMA外設基地址
  5.     uint32_t DMA_Memory0BaseAddr;         //DMA存儲器地址                     
  6.     uint32_t DMA_DIR;                       //DMA傳輸方向
  7.     uint32_t DMA_BufferSize;               //數據傳輸量
  8.     uint32_t DMA_PeripheralInc;           //外設增量模式選擇
  9.     uint32_t DMA_MemoryInc;                //存儲器增量模式
  10.     uint32_t DMA_PeripheralDataSize;     //設置外設數據寬度
  11.     uint32_t DMA_MemoryDataSize;          //設置存儲器數據寬度
  12.     uint32_t DMA_Mode;                      //運行模式選擇
  13.     uint32_t DMA_Priority;                 //優先級選擇
  14.     uint32_t DMA_FIFOMode;                 //FIFO模式選擇
  15.     uint32_t DMA_FIFOThreshold;           //FIFO閥值
  16.     uint32_t DMA_MemoryBurst;             //存儲器突發單次傳輸
  17.     uint32_t DMA_PeripheralBurst;        //外設突發單次傳輸                        
  18. }DMA_InitTypeDef;
復制代碼
四、實驗現象
      試驗成功藍色LED燈閃爍,試驗反敗紅色LED燈閃爍。
五、代碼包下載連接
      網盤:http://pan.baidu.com/s/1bcY5JK




作者: frog108    時間: 2021-10-10 19:49
這個不是stm32f1吧




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1