STM32F407 單通道ADC采樣,DMA傳輸
最近在研究STM32F4的ADC采樣功能,中間遇到了一些問題,寫下來以備后用。
F4和F1有很多庫函數(shù)是不一樣的,在參照F1的教程的時(shí)候,不能直接抄他的實(shí)驗(yàn)代碼,否則會(huì)出錯(cuò)。
因?yàn)橐肈MA將ADC轉(zhuǎn)換得到的值快速傳遞到SRAM中,所以就需要對(duì)ADC相關(guān)的DMA進(jìn)行設(shè)置,這一步很重要。在寫ADC1的DMA初始化函數(shù)前,一定要查Reference Manual的DMA request mapping,搞清楚是某一個(gè)具體的peripheral對(duì)應(yīng)的是DMA1還是DMA2,用到的是哪一個(gè)stream和channel。例如這次實(shí)驗(yàn)要用到的外設(shè)ADC1,可以查到,ADC1歸DMA2 Stream0或者Stream4的Channel0管理,不能用其他的。
相關(guān)程序就是設(shè)置ADC相關(guān)的GPIO口,這里提一下,F(xiàn)4里面設(shè)置GPIO為模擬輸入,用到的庫函數(shù)是GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN這與F1是不一樣的。
注意這一條語句
DMA_InitStructure.DMA_PeripheralBaseAddr=(uint32_t)(&ADC1->DR);//ADC地址
在教程中是這樣寫的
#defineADC1_DR_Address((uint32_t)0x4001204C)
DMA_InitStructure.DMA_PeripheralBaseAddr=ADC1_DR_Address;//ADC地址
這個(gè) ADC1_DR_Address是宏定義的,其數(shù)值(基地址)是差參考手冊的memory map的register boundary addresses得到的(如下圖所示)
STM32F407 單通道ADC采樣,DMA傳輸基地址+ADC_DR的偏置地址,直接用(uint32_t)(&ADC1->DR)這樣很簡潔,也不用去查手冊了,我覺得這樣比較好用