首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

STM32 DMA 詳解:配置流程、通道映射與串口發送實例

     編輯:關於C語言

DMA 基礎概念

  • 全稱 Direct Memory Access,搬運數據無需 CPU 干預。
  • 三種傳輸模式:記憶體→外設、記憶體→記憶體、外設→外設。
  • STM32 擁有兩個 DMA 控制器(DMA1/DMA2),各 7 通道,對應不同外設。

串口 1 TX DMA 配置實例

void USART1_DMA_Config(void) {
    DMA_InitTypeDef DMA_InitStructure;
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); // 開啟時鐘

    DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base; // 外設地址:USART1_DR
    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff;      // 記憶體緩衝區
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;         // 方向:記憶體→外設
    DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE;          // 傳輸大小
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // 外設地址不增
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;    // 記憶體地址自增
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;            // 循環模式
    DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

    DMA_Init(DMA1_Channel4, &DMA_InitStructure); // USART1_TX 掛載於 DMA1_Channel4
    DMA_Cmd(DMA1_Channel4, ENABLE);
}

地址計算詳解

USART1 基址 0x40013800,數據寄存器偏移 0x04,故 USART1_DR_Base = 0x40013804。查閱《STM32 參考手冊》外設地址映射表可得。

主程序流程

for (i=0; i

DMA 循環發送 5000 字節,CPU 同時閃燈,實現並行。

常見問題

  • 通道映射: 各外設固定掛載通道,需查數據手冊。
  • Keil 鏈接錯誤 L6218E: 需將 stm32f10x_dma.c 加入工程編譯。
  • 觸發方式: STM32 僅支援軟件觸發,部分芯片支援外部脈衝觸發。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved