STM32单通道ADC连续采集
前面介绍了关于ADC单通道单次采样软件触发的方式《STM32 软件触发ADC采集》,这回同样是单通道但是连续采样的方式。
对于连续采样,就不得不采用中断的方式,因为如果仍然采用阻塞查询方式的话,那单片机就别干其他的事了,永远处于等待采样完成。单次采样不需要考虑是因为能够控制何时进行采样,而连续采样是一开始就一直采样,直到关闭ADC。
这里依然是用ADC1的0通道。
与单次采样不同的地方就是中断的设置和连续采样的设置。
其他的不多说,直接放源码。
对于GPIO的初始化没什么改变
void gpio_init()
{
RCC->CFGR|=(2<<14);
RCC->APB2ENR|=(1<<2)|(1<<9);//GPIOA时钟使能
GPIOA->CRL&=~(0X0F<<0);//PA0 模拟输入模式
}
接下来是ADC的初始化
void adc_init()
{
ADC1->CR2|=(1<<0);
ADC1->CR1&=~(0X0F<<16);//independent mode
ADC1->CR1&=~(1<<8);//扫描模式关闭
ADC1->CR1|=(1<<5);//
ADC1->CR2|=(1<<20);
ADC1->CR2|=(7<<17);
ADC1->CR2&=~(1<<11);//right align
ADC1->CR2|=(1<<3);
while(ADC1->CR2&(1<<3));
ADC1->CR2|=(1<<2);
while(ADC1->CR2&(1<<2));
ADC1->CR2|=(1<<1);
ADC1->SMPR2&=~(7<<0);
ADC1->SQR3&=~(0X1F<<0);
NVIC->ISER[0]|=1<<ADC1_2_IRQn; //18
NVIC->IP[18]=(2<<4)|(2<<0);
ADC1->CR2|=(1<<22);//开始转换
}
然后是ADC中断处理函数
float adc_value;
void ADC1_2_IRQHandler()
{
if(ADC1->SR&(1<<1))
{
adc_value=ADC1->DR;
ADC1->SR&=~(1<<1);
}
}
以上就是核心代码,经过试验,效果如下
原文地址:https://blog.csdn.net/longgyue/article/details/142505054
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!