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; iDMA 循環發送 5000 字節,CPU 同時閃燈,實現並行。
常見問題
- 通道映射: 各外設固定掛載通道,需查數據手冊。
- Keil 鏈接錯誤 L6218E: 需將
stm32f10x_dma.c加入工程編譯。- 觸發方式: STM32 僅支援軟件觸發,部分芯片支援外部脈衝觸發。