-
- 视频加载中。。。
- 课程目录
- 课程笔记
现在,我将简要概述在写入编程闪存时
用于 UCD3138及校验和安置的
引导 BOM 程序。
这些校验和提供了一种在允许 ARM 内核
执行编程闪存中的代码前
让引导 ROM检查编程闪存
完整性的方法。
这是 UCD3138 中32 KB 编程闪存
图示。
引导程序可置于编程闪存的
前两个 KB 中。
如果编程闪存的前 2 KB
用于引导程序,则该 2 KB 块的最后 4 个字节
将保留用于
4 字节的校验和。
该校验和的计算方式是
将前 2 KB 编程闪存上
每字节编程闪存的内容相加。
如果无需引导程序,
则将保留编程闪存的最后 4 个字节
供另一4 个字节的校验和使用,
其计算是通过在整个 32 KB 范围内
将编程闪存的各字节内容
相加。
加电或复位后,引导 ROM 例程
将在两个位置验证校验和,
并根据结果,决定是
始终处于 ROM 模式,还是开始执行代码和编程
闪存。
这就是我们所说的闪存模式。
校验和提供了一种在执行
代码和编程闪存前检查编程闪存中的
内容是否完整的方法。
从用户角度来看,我们在写入
编程闪存时,纳入或排除了
这些校验和。
排除校验和会强制器件在加电复位后
仍始终处于 ROM 模式。
纳入校验和会强制器件在加电复位后
在闪存模式下运行,当然,前提是编程闪存未
损坏。
我现将展示 UCD3138 上有关引导 ROM 程序的
程序流程简图。
请注意,该引导 ROM 例程
与 UCD3138 的 3138系列产品的其他成员
略有不同。
请参阅各种程序员
手册以了解确切详情。
但实质上,我将讨论的原则
与整个 UCD3138 系列均有关。
加电或复位后,引导 ROM 程序
将初始化一些外设。
然后,它计算编程闪存前两个 KB 的校验和,
这可用于存储引导程序,
以及将最新计算的校验和
与在该 2 KB 编程闪存块的最后 4 个字节
中存储的值进行比较。
如果校验和的值相符,引导 ROM 例程
会强制 ARM 内核开始执行编程闪存中的
代码,从而它从 ROM 模式转变为闪存模式。
如果校验和的值不相符,
则引导 ROM 程序会计算整个 32 KB 编程
闪存的校验和。
然后,它会将此最新计算所得的校验和
与该 32 KB 编程闪存的最后 4 个字节中存储的值
进行比较。
如果校验和的值相符,它会开始执行
编程闪存中的代码,从而它从 ROM 模式转变
为闪存模式。
如果校验和的值不相符,
它将跳至 PMBus处理程序例程。
该例程不断通过 PMBus 接口
轮询来自主控的有效命令,
例如 UCD器件 GUI。
这些 PMBus 命令可用于读取、写入和擦除
程序和数据闪存。
此外,还有命令可执行
编程闪存中的代码。
使用此命令,我们可以在 ROM 模式下
执行代码和编程闪存,
而不会在对器件编程时写入任何一个校验和。
我们不建议编写这两种校验和中的任一种
以及在代码开发期间使用该命令,
因为它将确保该闪存不会变为锁定状态。
现在,我将演示闪存可以
如何变为锁定状态,这表示无法再将其
擦除和对其重新编程。
这是主程序中代码的简单图示。
这是将写入编程闪存的代码。
此时,假设已对一个或全部两个校验和
编程,从而引导 ROM例程将指示
ARM 内核在加电或复位后执行闪存中的
代码。
一般而言,我们在主程序开头
设有初始化函数,然后是主循环。
在主循环内部,我们始终调用 PMBus 处理程序
例程,从而我们可以通过 PMBus 接口
擦除闪存并对其重新编程。
一切运行正常,每次经过主循环时,
均会调用PMBus 处理程序例程。
但是,当程序中有妨碍到达
主循环的错误时,应当如何应对?
这意味着将永不调用PMBus 处理程序例程,
从而防止我们访问和擦除闪存
以及对闪存重新编程。
因此,编程闪存变为锁定
且永不能对该部分重新编程。
所以,我们建议将后门置于主程序的开头
以规避该问题。
clear_integrity_word 将清除该编程闪存校验和。
您应在处于闲置状态的
输入引脚上依情况调用 clear_integrity_word。
将其就置于主程序开头可最大限度
降低因错误导致 clear_integrity_word
在需要执行时无法执行的发生概率。
所以,如果有错误阻碍
主循环中的PMBus 处理程序例程
执行,您可以
更改输入引脚的状态,复位器件,
当执行代码和编程闪存时,
将即时调用clear_integrity_word,
它将清除校验和。
然后,在复位时,引导 ROM 代码
不会跳至编程闪存,因为启动时
执行的校验和将失败,但是仍将处于 ROM 模式
并执行 PMBus处理程序例程。
从此以后,您可以擦除并重新写入编程闪存。
函数clear_integrity_word
会清除编程闪存校验和,
从而它会清除编程闪存
4 或 8 字节的内容。
擦除或写入闪存要求该器件
处于特权模式。
为将器件置于特权模式,
我们采用了软件的中断机制。
软件中断不是常规意义上的中断。
软件中断的发起是由软件的
顺序执行和调用
特定函数实现的。
对软件中断函数的调用
看上去与对任何其他标准函数的调用别无二致。
使函数基于软件中断
会强制 ARM 以特权模式运行。
在特权模式下,软件
可启用或禁用中断,操纵程序
和数据闪存内容及其他。
当 ARM 处于用户模式下时,这些功能
全都不允许使用。
在 UCD3138 ARM 和数字系统程序员手册中,
您可以阅读有关软件中断机制的更多
课程介绍
共计6课时,36分25秒
猜你喜欢
换一换
推荐帖子
- 【TI首届低功耗设计大赛】Copter_alarm_Powered_by_MSP430FR5969之八-总结及演示
- 本帖最后由 tziang 于 2014-11-24 10:55 编辑 总结及演示 这个周末,终于把这次DIY项目全部完成,实现功能主要有 1)Copter_Alarm系统运行心跳指示; 2)飞行器多路电池电压实时监测及显示; 3)飞行器电池报警电压门限设置及显示, 报警门限从3.4V-3.9V步进0.1V及报警关闭可循环设置,默认报警门限为3.5V;&nbs...
-
tziang
微控制器 MCU
- 求推荐一块dcdc转换器,要求输出电压范围3-20左右
- 求推荐一块dcdc转换器,要求输出电压范围3-20左右,电流最大3安以上,效率90%左右 eeworldpostqq...
-
kevin.di
模拟与混合信号
- 【ZLG/IP】LM3S8962以太网通信UDP无法发送数据
- 实在没办法了求有过经验的朋友帮帮忙,这个双休日简直煎熬啊搞不粗来!! 下面是周公uCOS+UDP通讯的例程中的两个核心任务,并且我已经测试成功,【可以发送和接收】!! 但是这里的发送数据是将接收到的数据返回serv端, 而我需要的是【单独发送我想发送的数据】。 那我就想把recvfrom()去掉不就行了,可是【总是发送不出去啊】!!! 而且加了我改的发送任务后,连这个接收任务也无法执行了...
-
ssuperliang
微控制器 MCU
- 28335采样瞬间电压跌落
- 用28335时,当板件正常工作时没有启动AD转换时信号是很好的,而一旦对信号进行AD采集时,信号就受到了干扰,在每个采样的瞬间 信号电压都有很大波动,如图中大的尖峰所示。采样频率10k,尖峰频率也是10k。请问,这个干扰是DSP造成的吗?是否是内部的SAMPLE-AND-HOLD模块造成?正常吗?会造成采样不准吗?如何解决呢? eeworldpostqq...
-
Xiaomin
微控制器 MCU