之前玩过F1和F4的板子,这段时间,接个项目需要用低功耗,所以就整了STM32L151单片机,然后今天在写ADC的时候,发现了一个问题,就是STM32L151MCU必须要开启HSI才能工作,不然ADC转换的结果全是0,特别困惑,因为手册里面的框图这样描述了ADC1
可以看见,同大多数STM32单片机一样,是挂在APB2总线上的,所以我就正常的配置了外部的8M HSE作为PLL输入,PLL作为系统时钟,也开启了APB2上的ADC1外设时钟,一切都配置好后,启动ADC转换就发现数据全是0。
ADC_InitTypeDef ADC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
ADC_DeInit(ADC1);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 , ENABLE);
DMA_DeInit(DMA1_Channel1);
特别困惑,之后去官方的固件库例程里面看了一下它的ADC初始化,发现有这样一段代码
RCC_HSICmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);
然后我在自己的程序加上了这段代码,再试果断好了,效果就是下面这个样子:
我是通道1接的GND,通道2接的3.3V电源,通道0是悬空的,所以从结果看起来,是正确的。然后就特别疑惑,所以就去找出参考手册去仔细阅读了一下,重要在两个地方发现了一些信息:
第一处是在5.2小节里面有这样的一句描述:
也就是说ADC的时钟只能来自于HSI。
同样的,第二处是在11.3.2小节里面也有类似的说明:
原文:
To avoid unnecessary consumption while not converting, the ADC digital interface has been designed to operate in a completely independent manner, at its maximum speed using an internal 16 MHz clock source (HSI), whatever the CPU operating frequency(which can range from a few sub-kHz up to 32 MHz).
翻译如下:
为了避免不必要的消耗而不进行转换,ADC数字接口被设计为以完全独立的方式运行,使用内部16 MHz时钟源(HSI)以其最大速度运行,而不管CPU的工作频率如何(范围从几个高达32 MHz的次kHz)。
所以综上所述,STM32L1系列的ADC时钟只能来自于HSI。顺便提下,STM32L0芯片的ADC时钟也只能来自于HSI。这和之前用过的F1有很大区别,虽然是同样的Cortex-M3内核,但是外设的安排却并不一样,这就是使用固件库带来的副作用,虽然方便开发,但是对于芯片还是很陌生,所以说遇到问题,还是需要多读芯片手册。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)