DMA的初始化:
void STM32LLDMAInit(void)
{
LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_DMA1);
NVIC_SetPriority(DMA1_Channel1_IRQn, 0); //開DMA通道1中斷
NVIC_EnableIRQ(DMA1_Channel1_IRQn);
LL_DMA_ConfigTransfer(DMA1, LL_DMA_CHANNEL_1, //設置的DMA和通道
LL_DMA_DIRECTION_PERIPH_TO_MEMORY | //設置數據方向從外設到內存
LL_DMA_PRIORITY_HIGH | //設置優先級爲高
LL_DMA_MODE_CIRCULAR | //設置DMA爲循環存儲模式
LL_DMA_PERIPH_NOINCREMENT | //外設地址保持不變
LL_DMA_MEMORY_INCREMENT | //內存地址遞增
LL_DMA_PDATAALIGN_BYTE | //外設數據對齊方式爲字節對齊,若數據爲整字節的選擇字節對齊,數據超過一個字節則選擇其他。如12bit的ADC需要選擇HALFWORD
LL_DMA_MDATAALIGN_BYTE); //緩存數據對齊方式爲字節
LL_DMA_SetPeriphAddress(DMA1,LL_DMA_CHANNEL_1,LL_ADC_DMA_GetRegAddr(USART1,LL_USART_DMA_REG_DATA_RECEIVE)); //使用當前DMA通道的外設地址
LL_DMA_SetPeriphRequest(DMA1, LL_DMA_CHANNEL_1, LL_DMAMUX_REQ_USART1_RX); //設置DMA通道數據請求來源
LL_DMA_SetMemoryAddress(DMA1,LL_DMA_CHANNEL_1,(uint32_t)USER_Uart1_Rx_Buffer); //當前DMA通道對應的數據保存地址
LL_DMA_SetDataLength(DMA1,LL_DMA_CHANNEL_1,MAX_USER_UART1_DMA_SIZE); //設置DMA內存大小
//以上是DMA的配置,以下是相關的使能,可放到其他地方操作
LL_DMA_EnableIT_TC(DMA1, LL_DMA_CHANNEL_1); //使能DMA完成中斷
LL_DMA_EnableIT_TE(DMA1, LL_DMA_CHANNEL_1); //使能DMA錯誤中斷
LL_USART_EnableDMAReq_RX(USART1); //使能串口1DMA接收模式
LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_1); //使能DMA通道1
}
以上DMA配置需根據外設進行相應的調整,正確配置後相關外設的數據會保存在設置的地址中,使用時從此地址中獲取數據即可。