打印

Kinetis一个Flash时钟门控引发的“血案”

[复制链接]
533|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
社畜一枚|  楼主 | 2018-8-24 16:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  到现在还记得当年广大观众调侃吐槽冯小刚的夜宴时网上比较火的一个视频——一个馒头引发的“血案”(估计现在90后00后没看过这个,当时师弟师妹们还在初高中为考大学做准备呢,应该没有机会看个电影啥的,不过也不一定绝对啊),结果最近在调试Kinetis低功耗模式时却遇到了一个Flash时钟门控引发的“血案”,让俺至今dan疼不已啊,久久不能忘怀,呵呵。

    下面具体聊聊这件事。Kinetis的低功耗特性还是被广大用户所认可的,所以调试低功耗的时候比较多的,结果最近一次调试低功耗时却发现芯片迟迟不能进入到低功耗状态(虽然测的电流有明显减小的趋势,但是却远没有达到预料的低电流,暂且说是一种伪低功耗状态吧),翻来复去的查代码都没有发现低功耗相关的配置有任何错误(与之前的代码做过对比),一遍一遍的测试都是这个状态,即使换个芯片也是如此,这就说明是代码里有bug,当时真是搞的自己有点崩溃。

    最后一段一段代码去查,同时对照手册,最后终于把问题给定位出来了,即不小心把Flash的门控给关掉了,而数据手册上也写的很明确如下图,如果Flash时钟门控禁止,则任何低功耗模式都会被block掉。至于为什么之前调试低功耗的时候都没有遇到这个问题呢,我们看下一张图,位于SIM_SCGC6寄存器的Flash时钟门控位上电默认是打开的,而容易让人一不小心就会犯错的是SIM_SCGC6寄存器里面还控制着其他一些外设的时钟门控,而问题就出在使能某个外设时对SIM_SCGC6这个寄存器的赋值是‘或操作’还是直接赋值,每次都是“或操作”是没有问题的,但是如果不小心直接赋值了即"SIM_SCGC6 = 1<<24;”就会出现这样一个简单的操作就已经不小心把Flash时钟门控关掉了(这个操作已经把FTF位清零了)。

<img id="aimg_YY2O8"  class="zoom" height="130" file="http://files.chinaaet.com/images/blog/2015/03/31/9893310401809.png" border="0" alt="" />

<img id="aimg_tNr6p"  class="zoom" height="320" file="http://files.chinaaet.com/images/blog/2015/03/31/9893361108177.png" border="0" alt="" />

    哎,就是这样一个非常微小的细节问题却让我差点熬出一个通宵才定位出来,真是“防不胜防啊”,呵呵。一朝被蛇咬,十年怕井绳,现在搞的俺在遇到低功耗进不去的时候老是第一直觉先看看这个寄存器赋值对不对,真是让我**深刻啊。当然还有就是也认识到,好的编程习惯也是非常重要的,如果自己的编程习惯规范和有条理的话估计也可以避免这个问题了,总之,防微杜渐吧,在编程的道路上心细些会让你走的更远(虽然这条路很苦逼,呵呵)。









——————————————————————————————————————

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

397

主题

401

帖子

0

粉丝