我使用ADC開啟DMA功能,把ADC采集到的數(shù)據(jù)存入數(shù)組中,數(shù)組中確實(shí)有數(shù)據(jù),但是不會(huì)刷新,相似只運(yùn)行了一次。有沒有大佬指導(dǎo)一下,是什么原因.
會(huì)不會(huì)把這個(gè)連續(xù)轉(zhuǎn)換功能打開就可以了
ADC這里的轉(zhuǎn)換模式都已經(jīng)設(shè)置了,
這個(gè)是DMA的配置代碼
數(shù)組里面的數(shù)據(jù)不會(huì)變化
你好。這個(gè)是我的使用的工程代碼,是成功檢測2路ADC電壓的。
#include "adc.h"
u16 ADC_ConvertedValue[2]={0,0};
//ADC對(duì)應(yīng)GPIO初始化配置以及ADC初始化配置
void adc_Init(void)
{
? ? GPIO_InitTypeDef GPIO_InitStructure={0};
? ? ADC_InitTypeDef? ADC_InitStructure={0};
? ? RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 , ENABLE); //使能GPIOA時(shí)鐘和ADC
? ? RCC_ADCCLKConfig(RCC_PCLK2_Div6); //設(shè)置ADC時(shí)鐘分頻為6分頻
? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;? //配置2個(gè)檢測腳
? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;? ? ? ? ? ?//GPIO模式為模擬輸入
? ? GPIO_Init(GPIOA, &GPIO_InitStructure);
? ? ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;? //配置ADC為獨(dú)立模式
? ? ADC_InitStructure.ADC_ScanConvMode = ENABLE;? ? ? ? //多通道模式下開啟掃描模式
? ? ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;? //設(shè)置開啟連續(xù)轉(zhuǎn)換模式
? ? ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //設(shè)置轉(zhuǎn)換不是由外部觸發(fā)啟動(dòng),軟件觸發(fā)啟動(dòng)
? ? ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //設(shè)置ADC數(shù)據(jù)右對(duì)齊
? ? ADC_InitStructure.ADC_NbrOfChannel = 2;? ? ? ? ? ? ? ? //規(guī)則轉(zhuǎn)換的ADC通道的數(shù)目
? ? ADC_Init(ADC1, &ADC_InitStructure);? ? ? ? ? ? ? ? ? ? //根據(jù)ADC_InitStructure中指定的參數(shù)初始化ADC1寄存器
? ? ADC_Cmd(ADC1, ENABLE);? ? ? //使能ADC1
? ? ADC_ResetCalibration(ADC1); //重置ADC1校準(zhǔn)寄存器。
? ? while(ADC_GetResetCalibrationStatus(ADC1)); //等待復(fù)位校準(zhǔn)結(jié)束
? ? ADC_StartCalibration(ADC1); //開啟AD校準(zhǔn)
while(ADC_GetCalibrationStatus(ADC1));? //等待校準(zhǔn)結(jié)束
}
//ADC DMA模式配置
void DMA_Tx_Init( void )
{
? ? DMA_InitTypeDef DMA_InitStructure={0};
? ? RCC_AHBPeriphClockCmd( RCC_AHBPeriph_DMA1, ENABLE );? ? ? ? ? ? //使能開啟DMA時(shí)鐘
? ? DMA_DeInit(DMA1_Channel1);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //復(fù)位DMA控制器
? ? DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->RDATAR;? //配置外設(shè)地址為ADC數(shù)據(jù)寄存器地址
? ? DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_ConvertedValue; //配置存儲(chǔ)器地址為讀取ADC值地址
? ? DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;? ? ? ? ? ? ? //配置數(shù)據(jù)源為外設(shè),即DMA傳輸方式為外設(shè)到存儲(chǔ)器
? ? DMA_InitStructure.DMA_BufferSize = 2;? ? ? ? ? ? ? ? ? ? ? //設(shè)置DMA數(shù)據(jù)緩沖區(qū)大小,此處設(shè)置為length
? ? DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//設(shè)置DMA外設(shè)遞增模式關(guān)閉
? ? DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;? ? ? ? ?//設(shè)置DMA存儲(chǔ)器遞增模式開啟
? ? DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //設(shè)置外設(shè)數(shù)據(jù)大小為半字,即兩個(gè)字節(jié)
? ? DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;? ? ? ? ?//設(shè)置存儲(chǔ)器數(shù)據(jù)大小為半字,即兩個(gè)字節(jié)
? ? DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;? ? ?//設(shè)置DMA模式為循環(huán)傳輸模式
? ? DMA_InitStructure.DMA_Priority = DMA_Priority_High; //設(shè)置DMA傳輸通道優(yōu)先級(jí)為高,當(dāng)使用一 DMA通道時(shí),優(yōu)先級(jí)設(shè)置不影響
? ? DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;? ? ? ? //因?yàn)榇薉MA傳輸方式為外設(shè)到存儲(chǔ)器,因此禁用存儲(chǔ)器到存儲(chǔ)器傳輸方式
? ? DMA_Init(DMA1_Channel1, &DMA_InitStructure );? ? ? ?//初始化DMA
? ? DMA_Cmd(DMA1_Channel1 , ENABLE);? //使能DMA
}
void ADC_CONF(void)
{
? ? adc_Init();
? ? DMA_Tx_Init();
? ? // 配置 ADC 通道轉(zhuǎn)換順序?yàn)?,第一個(gè)轉(zhuǎn)換,采樣時(shí)間為55.5個(gè)時(shí)鐘周期
? ? ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
? ? ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_55Cycles5);
? ? // 使能ADC DMA 請(qǐng)求
? ? ADC_DMACmd(ADC1, ENABLE);
? ? // 由于沒有采用外部觸發(fā),所以使用軟件觸發(fā)ADC轉(zhuǎn)換
? ? ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}
--------------------------
main.c 里面?
頭引用聲明:
extern u16 ADC_ConvertedValue[2];
main函里里面
上電后 初始化?ADC_CONF();
使用就可以直接使用?ADC_ConvertedValue
感謝樓上的大佬,出來的結(jié)果還是和我先前寫的代碼一樣只有前幾次數(shù)據(jù)有略微的波動(dòng),后續(xù)數(shù)據(jù)就不會(huì)更新了
在這里添加啟動(dòng)函數(shù),因?yàn)槭褂肔SI,藍(lán)牙庫中會(huì)啟用ADC測量溫度進(jìn)行校準(zhǔn)LSI,導(dǎo)致ADC的啟動(dòng)被暫停。
感謝大佬,這個(gè)ADC被暫停的問題解決了,但是DMA數(shù)據(jù)錯(cuò)位的問題有沒有什么好的解決辦法?
這邊關(guān)閉DMA使能,重新寫內(nèi)存地址與傳輸數(shù)量,然后再使能DMA即可。
這里安裝圖上的寫法進(jìn)行更改后,DMA依然會(huì)出現(xiàn)數(shù)據(jù)錯(cuò)位的問題,? 例如? temp = buf【0】? 實(shí)際打印出來的有 buf 【1】 和 buf【2】的數(shù)據(jù)
那你直接在這里重新對(duì)DMA與ADC初始化。然后先開DMA使能 ,再開ADC軟件啟動(dòng)嘍,這里藍(lán)牙的庫處理有點(diǎn)不完善,因?yàn)橛械募拇嫫鲗懞髸?huì)由硬件清除。