我想要設定成ADC1通道10到13 (PC0~PC3) 掃描模式 DMA
不知道哪裡有問題 數值都不會變
//=============================================================
void ADC1_DMA_Init(void)
{
/***********ADC1初始化***********/
RCC->APB2ENR|=1<<4; //使能PC時鐘
RCC->APB2ENR|=1<<9; //使能ADC1時鐘
GPIOC->CRL&=0xFFFF0000; //PC0~PC3 類比輸入模式
RCC->APB2RSTR|=1<<9; //復位ADC1
RCC->APB2RSTR|=~(1<<9); //復位結束
RCC->CFGR&=~(3<<14); //ADC分頻因子清零
RCC->CFGR|=2<<14; //PCLK2/6=12MHz (ADC時鐘不得超過14M, 反則將導致ADC準確度下降)
ADC1->CR1&=0xF0FFFF; //工作模式清零 CR1[24:31]為保留位,必須保持0
ADC1->CR1|=0<<16; //獨立工作模式
ADC1->CR1|=1<<8; //掃描模式
ADC1->CR2|=1<<1; //連續轉換模式
ADC1->CR2|=1<<8; //使用DMA模式
ADC1->CR2&=~(7<<17);
ADC1->CR2|=7<<17; //軟體控制轉換
ADC1->CR2|=1<<20; //使用外部觸發(SWSTART) 必須使用一個事件來處發
ADC1->CR2&=~(1<<11); //右對齊
ADC1->SQR1&=~(0xF<<20);
ADC1->SQR1|=3<<20; //4個轉換在規則序列
ADC1->SQR3=0x00000000;
ADC1->SQR3|=10<<0; //PC0 1st
ADC1->SQR3|=11<<5; //PC1 2nd
ADC1->SQR3|=12<<10; //PC2 3rd
ADC1->SQR3|=13<<15; //PC3 4th
ADC1->SMPR1&=0xFFFFF000; //清空通道10~13採樣時間
ADC1->SMPR1|=7<<0; //通道10 239.5週期 轉換時間=(採樣時間239.5+轉和時間12.5)*ADC時脈(14M^-1)=180us
ADC1->SMPR1|=7<<3; //通道11 239.5週期
ADC1->SMPR1|=7<<6; //通道12 239.5週期
ADC1->SMPR1|=7<<9; //通道13 239.5週期
ADC1->CR2|=1<<0; //開啟ADC並啟動轉換
ADC1->CR2|=1<<3; //始能復位校準初始化校準寄存器
while(ADC1->CR2&1<<3); //等待校准結束,該位由軟件設置當校準器存器被初始化後該位由硬件清除
ADC1->CR2|=1<<2; //開始AD校準
while(ADC1->CR2&1<<2); //等待校准結束,該位由軟件設置開始校準並在校準結束時由硬件清除
/************DMA1_1初始化***********/
RCC->AHBENR|=1<<0; //使能DMA1時鐘
DMA1_Channel1->CCR &=0x00000000; //復位
DMA1_Channel1->CCR|= 0<<14; //非內存到內存模式
DMA1_Channel1->CCR|= 1<<13; //通道優先度 最高
DMA1_Channel1->CCR|= 1<<12;
DMA1_Channel1->CCR|=1<<8; //外設數據寬度16位
DMA1_Channel1->CCR|=1<<10; //儲存器數據寬度16位
DMA1_Channel1->CCR|= 1<<7; //執行儲存器地址增量
DMA1_Channel1->CCR|= 0<<6; //不執行外設地址增量
DMA1_Channel1->CCR|= 0<<5; //不執行循環
DMA1_Channel1->CCR|= 0<<4; //外設->內存
DMA1_Channel1->CPAR = (u32)(&(ADC1->DR)); //外設位址
DMA1_Channel1->CMAR = (u32)ADC_Value; //內存地址
}
void Get_ADC1_Value(void)
{
/*轉換電壓值*/
ADC_PC0=(float)ADC_Value[0]*(3.3/4096);
ADC_PC1=(float)ADC_Value[1]*(3.3/4096);
ADC_PC2=(float)ADC_Value[2]*(3.3/4096);
ADC_PC3=(float)ADC_Value[3]*(3.3/4096);
ADC1->CR2|=1<<1; //連續轉換模式
ADC1->CR2|=1<<22; //啟動規則轉換通道
DMA1->IFCR |= 1<<1; //清除通道完成標誌
DMA1_Channel1->CCR&=~(1<<0); //關閉DMA傳輸
DMA1_Channel1->CNDTR=4; //傳輸數量4
DMA1_Channel1->CCR|=1<<0; //開始DMA傳輸
} |