這是我使用標準庫寫的,通過定時器觸發ADC采樣,然后通過DMA進行傳輸的例程。例程已在STM32F407上驗證通過
單片機源程序如下:
- /*需要按下復位鍵才能正常打印數據,原因不明
- 定時器1s觸發一次ADC轉換,然后通過DMA將ADC轉換的數據搬運到內存中,然后在dma中斷中判斷搬運是否完成,在main
- 的循環中不斷讀取轉換的值-----取采樣數據的平均值的代碼可以參考原子的
- 要注意的是,這里采用的是定時器1通道1上升沿觸發,而數據有8個,若每1s觸發一次,則需要每8s才能顯示一次轉換的數據,因此將定時器觸發時間改為了1/8s*/
- //#include "stm32f4xx.h"
- #include "usart_printf.h"
- #include "bsp_systick.h"
- #include "bsp_led.h"
- #include "ADC.h"
- #include "DMA.h"
- #include "Timer.h"
- RCC_ClocksTypeDef get_rcc_clock;
- __IO uint16_t ADC_RegularConvertedValueTab[8] = {0};
- //這里可以使用兩種定時器觸發模式,一種是TIM2 CH2對應PA1,一種是TIM_CH1對應PA8
- u8 flag=0;
- /*軟件復位*/
- //void mcuRestart(void)
- //{
- //__set_FAULTMASK(1); //關閉所有中斷
- //NVIC_SystemReset(); //復位
- //}
- int main(void)
- {
- // mcuRestart();
- usart_Init ();
- delay_init(); //延時函數初始化
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
- TIM1_PWM_Init();
- ADC_Configuration();
- DMA2_Init();
- printf("這是一個測試\r\n");
- RCC_GetClocksFreq(&get_rcc_clock);
- while (1)
- {
- if(flag)
- {
- flag=0;
- for(int i=0;i<8;i++)
- {
- printf("%d ",ADC_RegularConvertedValueTab[i]);
- }
- }
- }
- }
復制代碼
所有資料51hei提供下載:
TIM+ADC+DMA實驗.7z
(592.7 KB, 下載次數: 330)
2019-7-23 03:53 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|