最近做项目用到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期间,频繁的进入中断,导致死机。
上一篇:MDK V5.12 + ST-Link V2 + Win10 STM32开发环境搭建1
下一篇:stm32 实现串口中断接收浮点型、整型数据
推荐阅读最新更新时间:2024-11-13 06:51
设计资源 培训 开发板 精华推荐
- EVAL-L9779WD-SPI,基于 L9779WD-SPI 的评估板是采用高级 BCD6s 技术的智能功率器件
- LT6656ACS6-2.5、2.5V 扩展电源范围电压基准的典型应用
- ADR420 超精密、低噪声、5.00 Vout XFET 电压基准的典型应用,用于输出微调调整
- LTC2164 演示板,16 位 105Msps ADC,LVDS 输出,5-140MHz
- LTC3110EUF 3.3V/2A 输出的典型应用电路来自具有有源电压平衡的超级电容器备份/再充电应用
- LT3470AHDDB 3.3V 降压转换器的典型应用电路
- LT1170HVCQ、5A 高效恒流充电器的典型应用
- LTC3892HUH 具有 6V 栅极驱动器的高效、双路 3.3V/8.5V 输出同步降压转换器的典型应用电路
- 适用于12038及15050两种规格的风机调速模块
- LTC3638EMSE 6W LED 驱动器降压稳压器的典型应用电路