×
单片机 > 单片机程序设计 > 详情

STM32中的一些小坑-ADC通道设置-写FLASH

发布时间:2020-08-28 发布时间:
|

最近做项目用到STM32F051的片子,遇到了两个小坑。


我的一个项目,需要ADC采集。两路ADC输入通道。PA0-ADCIn0; PA1-ADCIn1.


一开始想使用最简单的方式,单次转换。第一次采In0, 第2次采集In1.


STM32F0 的ADC库里面提供了ADC转换的函数:如下:


ADC_StartOfConversion(ADC1);


while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);


AdcProValRig[AdcLoopId] =ADC_GetConversionValue(ADC1);


ADC_StopOfConversion(ADC1);



解释:ADC_StartOfConversion 开始连续转换,也可以配置为,不是连续转换。在ADC初始化结构体中配置。


然后等待ADC转换结束,然后读取ADC的转换结果(同时会自动清空EOC标识)。


然后停止转换。  


接下来采集In1 , 理所当然,在采集前配置ADC的通道指向In1.


ADC_ChannelConfig(ADC1, ADC_Channel_1 , ADC_SampleTime_71_5Cycles);


但是设置完了之后,发现,根本没有鸟用啊。 采集的数据还是 之前IN0的通道。WHAT???


最后去看了一下原函数:居然是或运算!!!! 我的理解是,STM32 的ADC库设计,让你尽量使用规则或者注入模式去使用ADC。如下:


void ADC_ChannelConfig(ADC_TypeDef* ADCx, uint32_t ADC_Channel, uint32_t ADC_SampleTime)

{

  uint32_t tmpreg = 0;


  /* Check the parameters */

  assert_param(IS_ADC_ALL_PERIPH(ADCx));

  assert_param(IS_ADC_CHANNEL(ADC_Channel));

  assert_param(IS_ADC_SAMPLE_TIME(ADC_SampleTime));


  /* Configure the ADC Channel */

  ADCx->CHSELR |= (uint32_t)ADC_Channel;


  /* Clear the Sampling time Selection bits */

  tmpreg &= ~ADC_SMPR1_SMPR;


  /* Set the ADC Sampling Time register */

  tmpreg |= (uint32_t)ADC_SampleTime;


  /* Configure the ADC Sample time register */

  ADCx->SMPR = tmpreg ;

}

那就直接写通道到寄存器吧:


ADC1->CHSELR = ADC_CHSELR_CHSEL1;


第2个小坑: 就是在向FLASH 写入参数的时候,单片机会死机,后来找到问题了,在写FLASH的时候,要关闭中断。可能是我写入到FLASH的内容多,时间长,写进入后,还要读出来,校验。而我的串口通讯,波特率时38400很快,读写FLASH期间,频繁的进入中断,导致死机。

关键字:STM32  ADC  通道设置  写FLASH 

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

热门文章 更多
STM32中断向量表的位置.重定向