STM32各个系列时钟调高时出现异常案例

发布时间:2023-09-22  

STM32用户反馈,使用STM32F103内部时钟,把系统时钟配置成64MHz单片机就不跑了,配置成36MHz程序就正常妥妥的,频率稍高点就容易导致死机。他贴出的代码如下:void RCC_Configuration(void)

{

RCC_DeInit();//将外设 RCC寄存器重设为缺省值

RCC_HSICmd(ENABLE);//使能HSI

while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);//等待HSI使能成功

//FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

//FLASH_SetLatency(FLASH_Latency_2);

RCC_HCLKConfig(RCC_SYSCLK_Div1);

RCC_PCLK1Config(RCC_HCLK_Div2);

RCC_PCLK2Config(RCC_HCLK_Div1);

//设置 PLL 时钟源及倍频系数

RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_16);

。。。。。。

结合他的问题描述及他贴出来的代码,大致可以判断很可能是因为他屏蔽了指令预取和flash读取等待延迟的参数配置而导致的。即上面两条红色标注出来的代码。

后来我明确地提醒他这点后,他似乎并没及时反应过来,还折腾了几下才开启了上述配置,问题最终得以解决。

其实,关于这个问题经常有人遇到,尤其是那些基于STM32标准固件库进行开发或自行创建工程的新手更容易碰到这个问题。主要原因是因为他们对上述两行代码的功能不了解,导致有意或无意的将库例程中相关代码屏蔽掉无视掉而不做配置、或者配置不正确。

这里将这个问题再次分享出来,并对那两行代码简单做些解释。希望更多人对此有所知晓,少在这个地方走弯路。

这句 FLASH_PrefetchBufferCmd(); 用来开启或禁用flash指令预取功能。

现有STM32各个系列都是基于ARM cortexM内核的微处理器,它们采用多级流水线的哈佛结构,即一条指令的执行分割为几个阶段,如取指、译码、执行等,使得当前指令的取指操作完成后就可以开始后续指令的取指、译码等操作,程序指令就这样像流水一样执行下去,大大提高了指令的执行效率。

具体到STM32各系列单片机,这个指令预取功能的开启或关闭可以软件配置,一般配置为开启。要注意的是,复位后不同的系列该功能有的默认为开启有的则默认为关闭。比方STM32F1系列的flash指令预取功能就是默认打开的,当然你也可以关闭。其中,明确要求打开的情景就是当那个AHB时钟预分频系数不等于1时。

再比如STM32F4系列,它的指令预取功能在芯片复位后是默认关闭的,你可以自行打开。但明确要求关闭的场景就是芯片的供电电压低于2.1V时。

其实,STM32F4的预取功能与STM32F1不尽一样,STM32F4、STM32F2、STM32L4、STM32F7等系列芯片使用了ST的专利技术ART存储加速器【Adaptive real-time memory accelerator】。该加速器使用指令预取队列和分支跳转缓存技术,从而提高 Flash 程序代码执行速度,使得CPU即使在其最高主频下也能完美实现0 等待执行flash程序指令。

上面大致介绍了指令预取功能,预取主要是为了实现指令读取和执行的高效性。具体细节请参考STM32和ARM cortex内核的相关技术手册。

我们知道CPU的运行速度可调、可以很快,通常使用高速总线访问FLASH接口控制器,FLASH控制器收到来自CPU的取指指令后然后去读取相应地址的指令或数据。Flash控制器自身的读取速度相比CPU的高速请求来说可能会出现滞后,往往需要CPU做相应的延时等待。为了让CPU准确及时读取Flash 数据,我们须根据 CPU 时钟频率以及器件供电情况在Flash存取控制寄存器 (FLASH_ACR)中正确地编程等待周期数(LATENCY),类似上面提到另外一句代码:

FLASH_SetLatency(FLASH_Latency_n);

这里的等待周期数视不同的STM32系列也各有差异,不妨以STM32F4为例:

下面是STM32F4系列部分产品线的LATENCY设置的表格。从表格中可以看出LATENCY参数的设置与CPU的时钟、电源电压都有关系。另外,当电源电压在2.1V以下时要关闭预取。

在设置上面的等待周期参数时,选择合适的就好。不难理解,设置太大了影响CPU性能的充分发挥,太小了容易导致异常。

具体回到开头所提案例,它出现死机问题极可能是因为没有合理配置等待周期参数导致异常,因为它屏蔽了例程中那两句配置代码,即使用其默认功能,对于STM32F1,指令预取功能默认为开启。而STM32F1系列芯片的latency默认值即为0,无等待。这样的话,当他把时钟调高到一定程度时出现死机就不难理解了。

另外,当他反馈时钟调高产生异常时,我还给他提醒了注意检查VDDA的电源情况。我碰到有人遇到因VDDA没接好使得PLL不正常的情况。我们知道,对于STM32芯片,调高其工作时钟,往往借助于锁相环。而PLL的供电来自VDDA,如果PLL没有被正常供电,也是个非常隐蔽的麻烦。曾经有个客户为此折腾好久,才愿沉下心来检查其“坏品”的电源脚,结果发现有个VDDA脚虚焊。一直以芯片低频没问题,频率高了就异常为由怀疑芯片品质问题而耽误时间。

最后给点建议,做STM32开发的话,尤其是新手,如果参照ST的官方例程的话,有些配置在没看懂的情况下不要轻易屏蔽或修改。我碰到多个类似本案随意屏蔽例程中的初始化配置代码或断言代码出现异常,自己又找不到方向的。另外,尽可能使用ST官方的stm32cubeMx图形配置工具做基本的配置,通过它来生成初始化配置文件,这样方便省事很多。当然,即使使用STM32CUBEMX配置也不是万能的。比方:曾经有人使用STM32F0开发产品,用CUBEMX配置初始化文件,刚开始配置时时钟选择得比较低, STM32CubeMx自然根据他选择的时钟做了相关参数配置。后来他自己在用户代码里手动调高了时钟,而不知相应调整跟FLASH读取等待有关的参数,也是发生跟本案同样的情况。


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    、60Hz或50Hz。它包含秒、分、小时、星期、日、月和年等信息。对于小于31天的月份,月终日期会自动调节,包括闰年的修正。时钟格式可配置为24小时制或AM/PM指示的12小时制。该器......
    、月和年信息。对于少于31天的月份,月底的日期会自动调整,包括针对闰年的更正。幻影时钟24小时制或12小时制运行,带AM/PM指示器。......
    时钟部分可提供百分之一秒、秒、分钟和小时等信息,工作于24小时制式或带AM/PM指示的12小时制式。日历部分提供星期、日、月和年信息。对于少于31天的月份,可对月末日期自动进行调整,包括......
    扩展了器件的晶体选择范围。时钟/日历部分提供秒、分、时、星期、日期、月和年信息。对于少于31天的月份,可在月末自动调整日期,包括闰年修正。时钟部分工作于24小时制式或带/AM/PM指示的12小时制式。 可通过SPI......
    技术进步或其他,使得新版STM32F207芯片超频支持168MHZ。 下面我们主要分析SystemCoreClock的120M时钟怎么从一个外部25MHZ的HSE得到的。 我们要从25MHZ的外部时钟得到120M......
    载初始时间和日期值,然后通过 RTC_CR寄存器中的 FMT 位配置时间格式(12 或 24 小时制)。 通过清零 INIT 位退出初始化模式。随后,自动加载实际日历计数器值,在 4 个 RTCCLK时钟......
    无关 位 22 PM :AM/PM 符号 (AM/PM notation) 0:AM 或 24 小时制 1:PM 位 21:20 HT[1:0]:小时的十位(BCD 格式) 位 19:16......
    访问DS1558中所有寄存器都通过完整数据资料中的图1所示的字节宽度接口来实现。RTC寄存器包含24小时制BCD格式的世纪、年、月、日、星期、时、分、秒数据。对于每月天数及闰年的修正均自动完成。 DS1558......
    久;有12小时制24小时制两种工作模式;时间的表示方法有两种:二进制数表示和BCD码表示。用户可对DS12887进行编程以实现多种方波输出,用户可对其内部的三路中断通过软件进行屏蔽。 2.2.1......
    一个锂电池,断电后运行10年以上不丢失数据。(2)计秒、分、时、天、星期、日、月、年,并有闰年补偿功能。(3)二进制数码或BCD码表示时间、日历和定闹。(4)12小时24小时制,12小时时钟模式带有PWM和......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>