CH32V208CBU6的單片機(jī)使用多通道ADC配合DMA怎么樣讓內(nèi)存中的數(shù)據(jù)自動(dòng)更新。

我使用ADC開啟DMA功能,把ADC采集到的數(shù)據(jù)存入數(shù)組中,數(shù)組中確實(shí)有數(shù)據(jù),但是不會(huì)刷新,相似只運(yùn)行了一次。有沒有大佬指導(dǎo)一下,是什么原因.


熱門產(chǎn)品 : USB3.0 HUB控制器:CH634

Snipaste_2024-08-14_13-37-43.png會(huì)不會(huì)把這個(gè)連續(xù)轉(zhuǎn)換功能打開就可以了


image.pngADC這里的轉(zhuǎn)換模式都已經(jīng)設(shè)置了,


這個(gè)是DMA的配置代碼image.png


數(shù)組里面的數(shù)據(jù)不會(huì)變化image.png


你好。這個(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é)果還是和我先前寫的代碼一樣image.png只有前幾次數(shù)據(jù)有略微的波動(dòng),后續(xù)數(shù)據(jù)就不會(huì)更新了


image.png在這里添加啟動(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ò)位的問題有沒有什么好的解決辦法?


image.png這邊關(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ì)由硬件清除。


只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频