STM8 ADC 多个通道连续扫描缓冲区数据带中断模式的正确写法

时间:2023-03-09 16:01:55
STM8 ADC 多个通道连续扫描缓冲区数据带中断模式的正确写法

近日调试了STM8S的ADC采集多通道数据的程序,按照之前的立即,将ADC1设置为:扫描模式,连续采集,数据缓存模式,中断使能后应该可以在中断后读取到数值了,可是无论怎样都只能读取到第一个缓冲器的数据,其它的都是0

经过认真研究文档,看到如下:在连续扫描模式中正确清除EOC标志位的方法是从一个RAM变量中载入一个字节到ADC_CSR寄存器,这样来清除EOC标志位的同时还重新载入扫描系列新的最后通道编号。

IC是STM8S003,很低端的芯片。

不多说了,看代码。

ADC1的配置部分:

void Init_ADC(void)
{
GPIO_Init(GPIOD, (GPIO_Pin_TypeDef)(GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_5|GPIO_PIN_6), GPIO_MODE_IN_FL_NO_IT);
ADC1_DeInit();
ADC1_Cmd(ENABLE);//放在前面
ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_CHANNEL_3, ADC1_PRESSEL_FCPU_D8, ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL3,DISABLE);
ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_CHANNEL_4, ADC1_PRESSEL_FCPU_D8, ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL4, DISABLE);
ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_CHANNEL_5, ADC1_PRESSEL_FCPU_D8, ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL5,DISABLE);
ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_CHANNEL_6, ADC1_PRESSEL_FCPU_D8, ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL6,DISABLE);
ADC1_ScanModeCmd(ENABLE);//扫描模式
ADC1_DataBufferCmd(ENABLE);//缓存模式
ADC1_ITConfig(ADC1_IT_EOCIE,ENABLE);//中断
ADC1_StartConversion();//开始转换
} 中断部分

INTERRUPT_HANDLER(ADC1_IRQHandler, 22)
{
ADCValue[0]=ADC1_GetBufferValue(3);
ADCValue[1]=ADC1_GetBufferValue(4);
ADCValue[2]=ADC1_GetBufferValue(5);
ADCValue[3]=ADC1_GetBufferValue(6);
ADC1_ClearITPendingBit(ADC1_IT_EOC);
// ADC1_ClearFlag(ADC1_FLAG_EOC); 这个根本不需要

//注意以下是重点
ADC1_ConversionConfig(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_CHANNEL_6, ADC1_ALIGN_RIGHT);//就把 ADC1_CHANNEL_6重新设置一下就OK了,如果嫌慢可以省略设置部分的,直接用下面两行
// ADC1->CSR &= (uint8_t)(~ADC1_CSR_CH);//清通道号
// ADC1->CSR |= (uint8_t)(ADC1_CHANNEL_6);//重设最大通道
}

以上这部分内容很多人都没调出来,在此献上。