嵌入式 > 技术百科 > 详情

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

发布时间:2023-03-23 发布时间:
|

近日调试了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);//重设最大通道

}


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



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
汽轮机旁路控制策略的研制与应用