欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
STM32 ADC多通道連續采集 +DMA 寄存器版本程序問題
[打印本頁]
作者:
ouyangshishi
時間:
2020-6-29 14:04
標題:
STM32 ADC多通道連續采集 +DMA 寄存器版本程序問題
//這是部分代碼,剛剛帖子不全,這是下面的代碼部分,
//ADC多通道連續采集,采用DMA模式,寄存器版本寫的程序。但是結果卻是只能初始化時候傳遞一個數據,本來應該采集50次的,只采集一次,用串口顯示結果是0.38,這是一次采集的電壓除以50的結果,也就是說DMA只傳遞了一個數據,找了很久無果,請教大家!!!
#include "sys.h"
#include "delay.h"
#include "LED.h"
#include "usart.h"
#define N 50
#define M 3
void filter(void);
void ADC_Init(void); //ADC通道初始化
void DMA_Init(DMA_Channel_TypeDef*DMA_CHx);//配置DMA1_CHx
vu16 ADC_Value[N][M];//用來存放ADC轉換結果,也是DMA的目標地址 define a N line and M row
u16 filterADC[M];//用來存放平均值
int main(void)
{
float V1;
float V2;
float V3;
Stm32_Clock_Init(9); //系統時鐘設置
delay_init(72); //延時初始化
uart_init(72,115200);
LED_Init(); //初始化與LED連接的硬件接口
ADC_Init();
DMA_Init(DMA1_Channel1);
while(1)
{
delay_ms(10);
filter();
V1=filterADC[0]*3.3/4095;printf("V1=%f\r\n",V1);
V2=filterADC[1]*3.3/4095;printf("V2=%f\r\n",V2);
V3=filterADC[2]*3.3/4095;printf("V3=%f\r\n\r\n\r\n",V3);
delay_ms(500);
LED0=!LED0;
}
}
void filter(void)
{
vu32 sum=0; //必須初始化為0,否則初值將保持上次調用值。
vu8 i=0,j=0;
for(i=0;i<M;i++) //M row
{
for(j=0;j<N;j++) //N line
{
sum+=ADC_Value[j][i];
}
filterADC[i]=sum/N;
sum=0;
}
}
//初始化ADC1
//以規則通道為例
//開啟ADC1通道1 ADC1通道2 ADC1通道3 開啟連續掃描模式 使能DMA
void ADC_Init(void)
{
//先初始化IO口
RCC->APB2ENR|=1<<2; //使能PORTA口時鐘
RCC->APB2ENR|=1<<9; //ADC1時鐘使能
RCC->CFGR&=~(3<<14); //分頻因子清零
//SYSCLK/DIV2=12M ADC時鐘設置為12M,ADC最大時鐘不能超過14M!
//否則將導致ADC準確度下降!
RCC->CFGR|=2<<14; //ADC 分頻系數為6 adcclock為12M
GPIOA->CRL&=0XFFFF000F;//PA1 PA2 PA3 anolog輸入
RCC->APB2RSTR|=1<<9; //ADC1復位
RCC->APB2RSTR&=~(1<<9);//復位結束
ADC1->CR1&=0XF0FFFF; //工作模式清零
ADC1->CR1|=0<<16; //獨立工作模式
ADC1->CR1&=1<<8; //掃描模式
ADC1->CR2&=1<<1; //連續轉換模式
ADC1->CR2&=~(7<<17);
ADC1->CR2|=7<<17; //不使用外部觸發模式
ADC1->CR2&=~(1<<11); //右對齊
ADC1->SQR1&=0xFF0FFFFF;
ADC1->SQR1|=2<<20; //3個轉換在規則序列中 也就是只轉換規則序列1~3
ADC1->SMPR2&=~(7<<(3*1)); //通道1采樣時間清空
ADC1->SMPR2|=7<<(3*1); //通道1 239.5周期,提高采樣時間可以提高精確度
ADC1->SQR3&=~(0X0000001F<<(5*0));//規則序列1 ADC1通道1
ADC1->SQR3|=1<<(5*0);
ADC1->SMPR2&=~(7<<(3*2)); //通道2采樣時間清空
ADC1->SMPR2|=7<<(3*2); //通道2 239.5周期,提高采樣時間可以提高精確度
ADC1->SQR3&=~(0X0000001F<<(5*1));//規則序列1 ADC1通道1
ADC1->SQR3|=2<<(5*1);
ADC1->SMPR2&=~(7<<(3*3)); //通道3采樣時間清空
ADC1->SMPR2|=7<<(3*3); //通道3 239.5周期,提高采樣時間可以提高精確度
ADC1->SQR3&=~(0X0000001F<<(5*2));//規則序列1 ADC1通道1
ADC1->SQR3|=3<<(5*2);
ADC1->CR2|=1<<8; //使能DMA
ADC1->CR2|=1<<0; //開啟AD轉換器
ADC1->CR2|=1<<3; //使能復位校準
while(ADC1->CR2&1<<3); //等待復位結束
//該位由軟件設置并由硬件清除。在校準寄存器被初始化后該位將被清除。
ADC1->CR2|=1<<2; //開啟AD校準
while(ADC1->CR2&1<<2); //等待校準結束
//該位由軟件設置以開始校準,并在校準結束時由硬件清除
ADC1->CR2|=1<<20; //使用SWSTART觸發 必須使用一個事件來觸發
ADC1->CR2|=1<<22; //啟動規則轉換通道
}
//DMA1的各通道配置
//這里的傳輸形式是固定的,這點要根據不同的情況來修改
//從存儲器->外設模式/16位數據寬度/存儲器增量模式
//DMA_CHx:DMA通道CHx
//cpar:外設地址
//cmar:存儲器地址
//cndtr:數據傳輸量
void DMA_Init(DMA_Channel_TypeDef*DMA_CHx)
{
RCC->AHBENR|=1<<0; //開啟DMA1時鐘
delay_ms(5); //等待DMA時鐘穩定
DMA_CHx->CCR&=~0x0001;
DMA_CHx->CCR=0;
DMA_CHx->CPAR=0;
DMA_CHx->CMAR=0;
DMA_CHx->CNDTR=0;
DMA1->IFCR=0x0000000F;
DMA_CHx->CPAR=(u32)&ADC1->DR; //DMA1 外設地址
DMA_CHx->CMAR=(u32)&ADC_Value; //DMA1,存儲器地址
DMA_CHx->CNDTR=N*M; //DMA1,傳輸數據量
DMA_CHx->CCR|=0<<4; //從外設讀 DIR數據傳輸方向
DMA_CHx->CCR|=1<<5; //循環模式 CIRC=1
DMA_CHx->CCR|=0<<6; //外設地址非增量模式
DMA_CHx->CCR|=1<<7; //存儲器增量模式
DMA_CHx->CCR|=1<<8; //外設數據寬度為16位
DMA_CHx->CCR|=1<<10; //存儲器數據寬度16位
DMA_CHx->CCR|=3<<12; //高優先級
DMA_CHx->CCR|=0<<14; //非存儲器到存儲器模式
DMA_CHx->CCR|=1<<0; //開啟DMA傳輸
}
復制代碼
多通道ADC檢測+DMA(寄存器版本正在調試).7z
2020-6-29 14:29 上傳
點擊文件名下載附件
88.92 KB, 下載次數: 14
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1