有人使用STM32U5系列MCU開發產品,在用到ADC結合DMA傳輸時遇到點障礙,這里針對片內ADC1和ADC4基于DMA標準請求模式和鏈表模式演示下實現過程,以供參考。
先對ADC1基于DMA標準請求模式做演示。
隨意選擇ADC1的4個通道,掃描模式,連續轉換,DMA傳輸轉換結果并令DMA工作在外設字到內存字的循環傳輸模式。使用CubeMx進行配置。其中DMA通道使用Channel 1。
相關代碼:
#defineADC_BUFFRER_SIZE((uint32_t)8)
uint32_t ADC1_Result[ADC_BUFFRER_SIZE];
ADC_HandleTypeDef hadc1;
DMA_HandleTypeDef handle_GPDMA1_Channel1; //For ADC1
/*USERCODEBEGIN2*/
HAL_PWREx_EnableVddA();//additmanuallywithlowercubeMxversion
__HAL_LINKDMA(&hadc1,DMA_Handle,handle_GPDMA1_Channel1);
if(HAL_ADC_Start_DMA(&hadc1,(uint32_t*)ADC1_Result,
(ADC_BUFFRER_SIZE)
) != HAL_OK)
{
Error_Handler();
}
/* USER CODE END 2 */
運行結果如下圖所示:【目前4個通道我是懸空的】
現在對ADC4基于DMA鏈表模式做演示,其實就一個節點。
選擇ADC4的4個內部信號通道,掃描模式,連續轉換,DMA傳輸轉換結果,并令DMA工作在外設字到內存字的循環模式。使用CubeMx進行配置。其中DMA通道使用Channel 0。對于內部信號的采樣,往往有最小采樣時間要求,我這里的演示隨便選了個參數,具體應用時請參考數據手冊及當時ADC時鐘具體擬定。特此提醒!
關于DMA鏈表模式的配置在CubeMx界面里的Utility菜單下。
相關用戶代碼:
/*Privatevariables---------------------------------------------------------*/
ADC_HandleTypeDef hadc4;
DMA_NodeTypeDef Node_GPDMA1_Channel1;
DMA_QListTypeDef List_GPDMA1_Channel1;
DMA_HandleTypeDef handle_GPDMA1_Channel0;
/* USER CODE BEGIN PV */
/* USER CODE BEGIN 2 */
HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version
MX_ADC4Queue_Config();
__HAL_LINKDMA(&hadc4,DMA_Handle,handle_GPDMA1_Channel0);
HAL_DMAEx_List_SetCircularMode(&ADC4Queue);
if (HAL_DMAEx_List_LinkQ(&handle_GPDMA1_Channel0, &ADC4Queue) != HAL_OK)
{
Error_Handler();
}
if (HAL_ADC_Start_DMA(&hadc4,
(uint32_t *)ADC4_Result,
(ADC_BUFFRER_SIZE)
) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN WHILE */
結果驗證【顯示了2組數據】:
最后還提醒下,如果CubeMx版本比較低時,HAL_PWREx_EnableVddA()函數需要自己手動添加。我目前CubeMx 6.9.0版本已經不用手動添加了,創建工程時會將其自動生成于相應位置。
-
adc
+關注
關注
99文章
6608瀏覽量
547673 -
dma
+關注
關注
3文章
569瀏覽量
101991
原文標題:STM32U5 ADC+DMA配置演示
文章出處:【微信號:stmcu832,微信公眾號:茶話MCU】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
STM32U5系列TIMER+DMA+DAC應用演示

怎樣去解決STM32多通道ADC+DMA無法進入中斷的問題
請問STM32U5的USB如何在STM32CubeMX上直接配置?
STM32項目實戰:基于STM32U5的火災報警系統(LVGL),附項目教程/源碼

評論