针对F0系列片子 ADC多路通道单独采样工作,无法切换通道进行自问自答

2019-07-21 01:01发布

这几天,遇到一个问题。 基本可以确定是 ,所有F0系列都可能遇到的问题了 ,在使用HAL库开发的时候会遇到的。   我使用的式STM 32 F070F6P6的芯片,定义了 PA0为 ADC_IN0 , PA1为 ADC_IN1 ,开启了两路通道,单独不连续采样工作模式。

微信截图_20190522174940.png
ADC的配置代码如图,使用CubeMX软件配置的,可以说比自己手动要准快狠 主要准有保证
微信截图_20190522175558.png
。。。。。。。。。。。
然后我主函数里 不停的循环1秒读一次 ADC_IN0 , ADC_IN1 。
使用读函数是原子例程里的:
微信截图_20190522180203.png
但是被我进行了修改,因为F0 HAL库里没有这些划红线的函数。于是我把它去掉了,正确。
每次读的时候 把该函数里 ( ADC1_ChanConf.Channel=ch;  //通道)  ch重新赋值为选定的通道就可以了。
如;           ch =ADC_CHANNEL_0;
                   ch =ADC_CHANNEL_1;       然后去调用这个函数 就可以读到你选定通道的电平了。也没错。
第一次读值  使用  ch =ADC_CHANNEL_0; 可以读到正确电平。 第一次读值  使用  ch =ADC_CHANNEL_1; 也可以读到正确电平。
但他么 就是 第一次使用任意一个  ,(单片机不复位)第二次使用另一个值 ,就读的值还是第一次 通道的值。

以上如果一直只读一个通道,百分百没问题,想要切换通道 就不行,不管你配置多少通道,度多少次,始终都是第一次使用的通道的在进行采样。

于是百般询问各路网友,提供的方法都不行,于是我百度 到了,类似的,说是直接设置寄存器。
于是 我也怀疑这个 HAL库的函数可能有问题 ,于是就把    sConfig.Channel=ch;   使用  这个替代了  ADC1->CHSELR =ch;
哎呀 以为万事大吉,结果心灰意冷 ,险些撂挑子不干了,无奈了。
就在我放弃的时候,我吃了一把狗粮,人生又燃起了 奋斗的欲望。
就把这句话 移动一下位置,不曾想 却可以了。
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
把  ADC1->CHSELR =ch; 这句话  放到 HAL_ADC_ConfigChannel(&hadc, &sConfig);她的热屁股     !!!   后面!!!!
把  ADC1->CHSELR =ch; 这句话  放到 HAL_ADC_ConfigChannel(&hadc, &sConfig);她的热屁股     !!!   后面!!!!
把  ADC1->CHSELR =ch; 这句话  放到 HAL_ADC_ConfigChannel(&hadc, &sConfig);她的热屁股     !!!   后面!!!!
你就可以任意指挥每个通道 ,随心所欲,无所不能!
看图。谢谢
微信截图_20190522174227.png



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。