今天要做的是ADC單通道DMA采集實驗
MCU : STM32F429
開發工具:STM32CubeMx 版本號 5.0.0
實驗目的:實現ADC1 13通道 DMA采集
一 :簡介
首先,我們來看一下STM32F4XX參考手冊里關於該芯片的ADC功能介紹


二:STM32CubeMx 配置
配置RCC

配置時鍾,硬件使用了25MHz無源晶振

配置ADC

數據對齊方式 為 右對齊

使能 連續轉換模式,DMA連續請求

設置采樣次數 為 3個周期

配置 DMA

Mode設置為Circular模式,數據寬度設置為Half Word 2個字節
配置Project Manager

設置好之后,點擊GENERATE CODE 生成代碼
定義變量
__IO uint16_t ADC_ConvertedValue[20];
__IO float ADC_Volt;
啟動DMA數據傳輸
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&ADC_ConvertedValue[0], 20);
讀取ADC數據
unsigned int i = 0, ADC_Value = 0;
for(i = 0; i < 20; ++i)
{
ADC_Value += ADC_ConvertedValue[i];
}
ADC_Value = ADC_Value / 20;
printf("ADC Value %d\r\n",ADC_Value);
printf("vol %f\r\n", ADC_Value * 3.3 / 4096);
三 :實驗結果
串口輸出結果

四: 實驗中遇到的問題
1

最后一個參數一開始的時候寫1,程序就出現了阻塞的現象。我分析可能是因為DMA選擇的是Circular模式,會一直產生中斷,從而使得CPU都被中斷搶占了,因此將數據傳輸長度改為了20,每次對20個數據進行求均值計算,然后測試沒有問題。
2 關於采樣周期
采樣周期 是否是越大越精准呢? 我把采樣周期改大了之后,再進行測試,實驗有待驗證
