UCD3138数字电动工具:Boot ROM和程序闪存校验和
Loading the player...
将在30s后自动为您播放下一课程
现在,我将简要概述 在写入编程闪存时 用于 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 系列产品的其他成员 略有不同。 请参阅 各种程序员 手册以了解确切详情。 但实质上, 我将讨论的原则 与整个 UCD 3138 系列均有关。 加电或复位后, 引导 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 和数字 系统程序员手册中, 您可以阅读有关 软件中断机制的更多 内容。
现在,我将简要概述 在写入编程闪存时 用于 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 系列产品的其他成员 略有不同。 请参阅 各种程序员 手册以了解确切详情。 但实质上, 我将讨论的原则 与整个 UCD 3138 系列均有关。 加电或复位后, 引导 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 和数字 系统程序员手册中, 您可以阅读有关 软件中断机制的更多 内容。
现在,我将简要概述 在写入编程闪存时
用于 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 系列产品的其他成员
略有不同。
请参阅 各种程序员
手册以了解确切详情。
但实质上, 我将讨论的原则
与整个 UCD 3138 系列均有关。
加电或复位后, 引导 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 和数字 系统程序员手册中,
您可以阅读有关 软件中断机制的更多
内容。
现在,我将简要概述 在写入编程闪存时 用于 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 系列产品的其他成员 略有不同。 请参阅 各种程序员 手册以了解确切详情。 但实质上, 我将讨论的原则 与整个 UCD 3138 系列均有关。 加电或复位后, 引导 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 和数字 系统程序员手册中, 您可以阅读有关 软件中断机制的更多 内容。
现在,我将简要概述 在写入编程闪存时
用于 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 系列产品的其他成员
略有不同。
请参阅 各种程序员
手册以了解确切详情。
但实质上, 我将讨论的原则
与整个 UCD 3138 系列均有关。
加电或复位后, 引导 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 和数字 系统程序员手册中,
您可以阅读有关 软件中断机制的更多
内容。
视频报错
手机看
扫码用手机观看
收藏本课程
视频简介
UCD3138数字电动工具:Boot ROM和程序闪存校验和
所属课程:UCD3138数字电动工具
发布时间:2019.03.11
视频集数:6
本节视频时长:00:07:09
该视频介绍了TI为UCD3k代码开发提供的软件工具,并介绍了完成教程所需的UCD3k开环板。
//=$v1;?>
//=$v['id']?>//=$v['down_category']?>//=$v['link']?>//=$v['is_dl']?>//=$v['link']?>//=$v['name']?>//=$v['name']?>
//=$v['id']?>//=$v['down_category']?>//=$v['path']?>//=$v['is_dl']?>//=$v['path']?>//=$v['name']?>//=$v['name']?>
////=count($lesson['bbsinfo'])?>
//=$elink?>//=$elink?>//=$tags[0]?>//=$tags[0]?>//=$elink?>//= $elink?>//=$tags[1]?>//=$tags[1]?>
//=$lesson['bbs'];?>
//=count($lesson['bbsinfo'])?>