0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

STM32单片机 来源:未知 作者:刘勇 2017-12-20 07:27 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

近日某论坛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读取等待有关的参数,也是发生跟本案同样的情况。

好,就此打住。旨在交流与分享,祝君好运!


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5186

    文章

    20146

    浏览量

    328819
  • STM32
    +关注

    关注

    2305

    文章

    11120

    浏览量

    371159

原文标题:时钟调高时出现异常的案例分享

文章出处:【微信号:STM32_STM8_MCU,微信公众号:STM32单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    电能质量在线监测装置时钟模块自动同步异常的常见类型有哪些?

    电能质量在线监测装置时钟模块自动同步异常,核心可按 同步方式(PTP/GPS/NTP)分类 ,每种方式的异常类型均集中在 “链路、配置、硬件、环境” 四大维度,且各有典型表现。以下是具体分类及特征
    的头像 发表于 10-22 14:15 199次阅读

    设备运行状态出现异常,如何确定是电源纹波超标导致的

    设备运行异常(如死机、数据跳变、动作卡顿等)的诱因复杂(硬件故障、软件 bug、电磁干扰、负载过载等均可能导致),要确定是否由 电源纹波超标 引发,核心是通过 “ 排除非纹波因素→验证纹波与异常
    的头像 发表于 09-23 11:09 444次阅读
    设备运行状态<b class='flag-5'>出现异常</b>,如何确定是电源纹波超标导致的

    STM32H743 移植 Micro-XRCE-DDS 时,在调用 gethostbyname() 时出现异常怎么解决?

    平台:STM32H743II 环境:keil mdk 版本:rt-thread-5.1.0 文件路径
    发表于 09-22 06:54

    rtthread线程出现异常了,有没有什么钩子函数能够定义用户操作?

    线程出现异常了,有没有什么钩子函数能够定义用户操作????
    发表于 09-18 06:36

    AD7928BRUZ AD采样批量出现异常低值的原因?

    信号的峰值,意味AD7928BRUZ均在模拟信号达到峰值时采集。我观测了半个小时的数据,均没有发现cs信号和模拟信号时序异常。 现在请教有可能是哪方面的问题,导致异常数据出现
    发表于 08-13 06:29

    判断伺服行星减速机出现噪音的异常

    伺服行星减速机在正常运行时,其噪音水平应在一定范围内。若噪音突然增大或出现异常声响,如尖锐、不规则或周期性的噪音,则可能表明减速机存在故障或问题。 二、可能原因 1. 齿轮磨损: ● 长时间的使用可能导致齿轮表面磨损
    的头像 发表于 07-31 18:16 679次阅读
    判断伺服行星减速机<b class='flag-5'>出现</b>噪音的<b class='flag-5'>异常</b>

    TJA1043的收发器,如果CAN总线出现异常,它会进入异常状态吗?

    关于 TJA1043 的收发器,如果 CAN 总线出现异常,它会进入异常状态吗?一旦处于异常状态,它的行为会如何?例如,可以发送数据包但无法接收,谢谢
    发表于 04-04 07:30

    STM32H750 FDCAN发送异常的原因?

    了,所以再去查之前的版本是否哪些代码导致了这个异常。 最后排查出来,原因是时钟的配置问题,由于其他部分需要,我的APB1时钟配置成了15MHz,而FDCAN1的时钟我用的是80MHz,
    发表于 03-07 08:42

    重复开机关机,有时会出现ADS1232异常,为什么?

    PWND拉低复位操作。等出现异常状态时,快速重新开关机。采样的数值依然不正确。PWND拉低复位,无效果. 4.当出现异常状态时,需要长时间断电后,重新开机。ADS1232才有可能正常 。 有没有出现这个现象的?可能是什么原因呢?
    发表于 02-11 06:44

    ADS1118低温下出现异常的原因?

    口(设置成5V,1s)每秒钟大概有5次转换进行;当我把电路板放在室外后,上述较为规律的波形就会出现异常,具体表现为某一次转换时间变长;当温度继续下降时,ADC的一次转换就无法完成,由于我的程序中有一个
    发表于 02-10 07:45

    ADS1247连续采样时数据异常跳动的原因?

    ADS1247 START脚直接拉高连续转换,程序中是采用轮询的方式读取AD值,单是数据会出现异常跳动。使用MCU控制START脚进行单次转换读取时不会出现这种状况。
    发表于 01-23 08:14

    ads1298使用内部测试信号,连续读数据方式,获取的数据会不定时的出现异常数据,是哪里出了问题?

    ads1298 使用内部 测试信号,连续读数据方式,获取的数据会不定时的出现异常数据,不知道哪里出问题。
    发表于 01-23 07:56

    使用stm32的spi读取ads1256数据,ads1256正常输出数据一段时间后总会出现异常默认设置,为什么?

    使用stm32的spi读取ads1256数据,发现ads1256在正常输出数据一段时间(不确定多少时间,有时候几秒有时候一两分钟)之后,总会出现异常默认设置,表现为数据输出频率(DRDY引脚脉冲
    发表于 01-07 08:23

    ADS1248采集温度会出现噪音的干扰,为什么?

    我利用热敏电阻(高精度线性)采集温度,在常温下,不断地切换四路热敏电阻,不会出现波动,在恒温60度时,也不会出现异常波动,异常波动为温度一下跳动大于0.1度,但是在持续加热或常温散热时,温度
    发表于 12-20 08:00

    使用DDC232芯片做了一些板卡,当芯片增益设置为range0时,采集数据出现异常的原因?

    最近使用DDC232芯片做了一些板卡,当芯片增益设置为range0时,采集数据出现异常情况。 现有采集数据绘图,如下: 说明:一共6个芯片,水平轴为通道数,纵轴为采集数据数值。6个芯片同时设置
    发表于 12-16 07:15