不知道程序哪里有问题,2个ADC一个是PA1另一个是内部温度传感器,想实现连续扫描,通过DMA存储在一个2维数组里面
然后在LCD上面显示,弄了一个下午了,显示的值依然是0.麻烦帮忙看看,谢谢。
void ADC1_Config(void)
{
RCC->APB2ENR |= (1 << 2); /* PA1模拟输入 */
GPIOA->CRL &= 0XFFFFFF0F;
RCC->APB2ENR |= (1 << 9); /* 复位ADC1 */
RCC->APB2RSTR |= (1 << 9);
RCC->APB2RSTR &= ~(1 << 9);
RCC->CFGR |= (1 << 15); /* ADC时钟6分频,12MHz */
ADC1->SMPR2 |= (7 << 3); /* 通道1采样时间为239.5个周期 */
ADC1->SMPR1 |= (7 << 18); /* 通道16采样时间为239.5个周期 */
ADC1->SQR1 |= (1 << 20); /* 2个转换通道 */
ADC1->CR1 &= ~(0XF << 16); /* 独立模式 */
ADC1->CR1 |= (1 << 8); /* 扫描模式 */
ADC1->CR2 |= (1 << 23); /* 启用温度传感器 */
ADC1->CR2 &= ~(1 << 11); /* 数据右对齐 */
ADC1->CR2 |= (1 << 8); /* 使用DMA模式 */
ADC1->CR2 |= (1 << 1); /* 连续转换 */
ADC1->CR2 |= (7 << 17); /* 软件开启转换 */
ADC1->CR2 |= (1 << 0); /* 开启ADC转换器 */
ADC1->CR2 |= (1 << 3); /* 初始化校准寄存器 */
while((ADC1->CR2 & (1 << 3))); /* 等待初始化完成 */
ADC1->CR2 |= (1 << 2); /* ADC校准 */
while((ADC1->CR2 & (1 << 2))); /* 等待校准完成 */
ADC1->SQR3 &= 0XFFFFFC00;
ADC1->SQR3 |= 1; /* CH1第一个转换 */
ADC1->SQR3 |= (16 << 5); /* CH16第二个转换 */
ADC1->CR2 |= (1 << 22); /* 开始转换 */
}
vu16 AD_Filter_Value[];
vu16 AD_Value[8][2];
void Get_ADC_Value(void)
{
u32 temp = 0;
u8 i = 0;
u8 j = 0;
for(i = 0;i < 2;i ++)
{
for(j = 0;j < 8;j ++)
temp += AD_Value[j];
AD_Filter_Value = temp >> 3;
}
}
void Show_ADC(void)
{
float temp = 0;
if(ADCFlag)
{
temp = AD_Filter_Value[1];
LCD_ShowxNum(156,130,temp,4,16,0);
temp = temp * 3.3 / 4096;
LCD_ShowxNum(156,150,(u16) temp,1,16,0);
temp -= (u16) temp;
LCD_ShowxNum(172,150,temp * 1000,3,16,0X80);
ADCFlag = 0;
}
}
void DMA_Config(DMA_Channel_TypeDef *DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{
RCC->AHBENR |= (1 << 0); /* 使能DMA1时钟 */
delay_ms(5);
DMA_CHx->CPAR = (u32) cpar;
DMA_CHx->CMAR = (u32) cmar;
DMA_CHx->CNDTR = cndtr;
DMA_CHx->CCR &= 0x0; /* 初始化CCR寄存器 */
DMA_CHx->CCR |= (1 << 12); /* 中优先级 */
DMA_CHx->CCR |= (1 << 10); /* 外设数据宽度为16位 */
DMA_CHx->CCR |= (1 << 8); /* 存储器数据宽度为16位 */
DMA_CHx->CCR |= (1 << 7); /* 存储器地址增量模式,外设地址非增量模式 */
DMA_CHx->CCR |= (1 << 5); /* 循环模式,从外设读,存储到存储器 */
DMA_CHx->CCR |= (1 << 0); /* 开启DMA */
}
void DMA_ADC1_Config(void)
{
DMA_Config(DMA1_Channel1,(u32) &ADC1->DR,(u32) &AD_Value,16);
}
|