C2837x入门指南(十七)—系统设计之Flash编程和配置
Loading the player...
将在30s后自动为您播放下一课程
接下来我们看看F2837X的flash的配置和编程 F2837X有RAM flash、ROM等 最常用的是RAM和flash 其中RAM的特点是访问速度快 一般是单周期的 它的缺点是会丢失数据 因此RAM主要用来保存数据 以及程序运行过程中需要用到的变量 需要快速执行的代码 等等 FLASH的特点是掉电不丢失 但它的访问速度慢 因此它里面保存用户的执行代码 不变的数据 也就是数据表等表格 接下来看看FLASH的基本操作 我们的FLASH按照使用分为 多次擦除的flash 以及只能一次擦除的OTP flash使用去必须有一个初始化过程 最主要的设置flash的等待时间 和位置 由于CPU的执行速度较快 比如2837X的CPU执行速度是200兆赫兹 我的flash的访问速度相对慢 因此 为了匹配 必须增加等效的周期 芯片在复位时 等待周期默认最大值 15个等待周期 我们可以在初始化过程中设置寄存器的值 来改变等待周期 比如2837X最高运行频率200兆赫兹的时候 flash的周期是3个周期 相对应的不同的工作频率的话 这个等待周期不同 我们都有这些推荐值 不止有flash受到等待周期的影响 ODP不受它的影响 它的固定时间是11个系统周期 记住一点 flash初始化配置的代码不能在flash中运行 必须在上电的时候把flash初始化的代码 拷贝到RAM中执行 刚才说了 我的CPU实行速度快 最高达到200兆 我的flash速度慢 所以必须提高我的flash速度 能够满足我CPU操作需求 这个地方就涉及到我如何加速 在我们的C2000里面 我们采用预取缓冲机制 一个是预取 一个是缓冲 预取意思我一次从flash中读取多个字节的 这个地方 我们读取128字节的指令 然后把数据放入我的两级的缓存器里面 然后把数据发给CPU的内核 这样的话 因为这个是在我的RAM里面的 因此这地方就能把他加速了 也就是我一次性多读取几个过来 在CPU这里执行的时候 我不断读取 放到缓存里面 通过缓存提供数据 这样把速度提上来 针对指令的话 我们有预取和缓冲机制的 针对我的数据 我只有预取没有缓冲机制 也就是 我数据读过来 我放这里等待的CPU内核 的一个读取 C2000的话 一般采取8级的缓冲 8级的预存 我们看看代码执行的性能 首先 我们假设 我们的2837X工作在200兆赫兹 16位的指令 如果它是内部的RAM中的 也就是你的代码速度要求比较快的 我把它拷贝到RAM中执行 如果从RAM中读取指令的话 我执行速度会非常快 取址速度快 单周期的 可以工作在200兆的MPS 如果从flash中读取 等待时间设置为3个周期 默认3个周期 我每6个周期读取128字节的指令 然后 用8个周期来执行 这样总统128除以8个周期 约等于200MIPS 但考虑到我的取址过程中 会有一些不连续性 因此性能稍微降低 达到180MIPS 从此看出 最好是把程序代码拷贝到RAM中执行 把200MIPS放到FLASH中 能达到180MIPS 根据上面的推算 我们得出这个表格 内部RAM是单周期的访问 不管是16还是32位的 针对flash 我是接近1 也就是0.9 这样算的话 flash接近1 同时需要注意 在flash数据访问期间 我的指令获取的管道是停止的 也就是 我从flash读取数据 我不能同时从代码区读取数据 现在我们看看flash和OTP低功耗模式 flash和OTP三种电压模式 一个是sleep 休眠模式 它消耗的电源最少 另外是standby 待机模式 它的功耗比sleep模式高 但它可以很快进入激活模式 激活模式是功耗最高的 也是芯片正常执行程序所需的工作模式 如果在我的flash里面 长期没有flash OTP访问操作 这些请求的话 我的flash和OTP都进入低功耗模式 但进入低功耗模式后 这个sleep模式后 如果有一个访问请求 我自动进入待机模式 然后是激活模式 采用低功耗模式的最重要的好处是 我可以保证芯片的功耗 降到最低 激活模式是通过flash里面的控制设定 然后是我们的ECC保护 我们的2837XECC保护 主要作用是 筛选出flash和OTP里面的故障 而我们采用的保护机制是 SECDED 单字节纠错 双字节检测的机制 假如我的flash OTP里面 单个字节被篡改的话 我能自动检测到 把错误改正 但如果有两个字节 发生错误的话 我无法改正它 只能报警 也就是我能检测到错误 针对flash和OTP每个64字节 每个64位 需要计算一个ECC代码 把它编写到我的ECC存储器里面 它跟我的flash OTP编程时一起写入到寄存器里面的 在取址或者读数据时 我根据每个64位数据 然后做ECC的校验 校验跟我的ECC里保存的内容对比 对上的话 就是没错误 正常执行 如果发生了一个字节的错误的话 我可以把它改正 如果两个字节的错误 我可以检测 并报警 这就是我们的ECC保护机制 每64个字节我产生8个子节的ECC代码 把它放在对应的寄存器里面 ECC保护使能也是在flash ECC 寄存器里面使能 把它打开 再来看flash的编程 它实际上是将我放在flash里面的数据 和代码 如何烧写到flash中去 我们所有flash的烧写都是通过CPU 来执行的 分为两个过程 第一个是 外部通过SCI SPI接口把数据导入我的RAM中 第二步 在RAM中执行flash的擦除 烧写函数 将数据写入flash 这过程需要CPU执行 也就是烧写分为两步 第一步将代码放入RAM中 第二步在RAM中运行RAM函数 烧写函数 将数据放入FLASH中 前面这种将数据放入RAM中 不同的方式 是我们的boot决定的 有JTAG SCI SPI I2C各种不一样的 boot方式不同是通过外部的GPL口的boot来决定的 其中 JTAG直接可以把代码烧到RAM中 除了它外 其他这些方式 必须经过ROM bootloader将这些代码导入到RAM中 那flash编程基本操作有三个 一个是擦除 一个是编程 一个是验证 擦除是将所有位归零 也就是将所有的字节变成1 归零不是把它写成0 而是1 所有编程都是将相应的位从1到0 就是编程 验证的话 我烧写的程序的数据和我烧到flash中的数据是否是一样的 如果不同 会报错 flash最小的擦除单位是一个扇区 最下的编程字节是一个位 一个bit 这样的话 我的flash可以当做一方来用 但最后一点是 我擦除把一个扇区擦除掉 所以作为一方来用的话 需要把其他不需要的数据先拷出来 然后在烧回flash 过程稍微复杂 而且在flash的烧写过程中 务必保证 芯片不要断电 不要有电源大波动 假如发生断电 这个时候密码区全部变成0的时候 我的芯片就完全锁死了 就算不是全部是0的话 我也不知道 密码区写了哪些数据 芯片就很难解开 flash的烧写过程是非常短暂的 所以发生意外的概率很小 从我们外部来说 主要保证一点 在烧写程序时 必须保证电源稳定 那么烧写程序的工具我们有 仿真器 串口烧写 我们看看flash编程实用的程序 JTAG我们有CCS 是集成的闪存编程器 还有CCS UNIFLASH 以及第三方提供的软件 基于SCI串口编程的话 有第三方提供的C2PROG 在生产上编程的话 我们有C2000啊 还有一些BP的编程器啊 那么还有一些比如生产过程中用到的升级器 也是基于串口control引导程序 来导入烧写程序的 所有这些工具都可以在C2000链接上找到
接下来我们看看F2837X的flash的配置和编程 F2837X有RAM flash、ROM等 最常用的是RAM和flash 其中RAM的特点是访问速度快 一般是单周期的 它的缺点是会丢失数据 因此RAM主要用来保存数据 以及程序运行过程中需要用到的变量 需要快速执行的代码 等等 FLASH的特点是掉电不丢失 但它的访问速度慢 因此它里面保存用户的执行代码 不变的数据 也就是数据表等表格 接下来看看FLASH的基本操作 我们的FLASH按照使用分为 多次擦除的flash 以及只能一次擦除的OTP flash使用去必须有一个初始化过程 最主要的设置flash的等待时间 和位置 由于CPU的执行速度较快 比如2837X的CPU执行速度是200兆赫兹 我的flash的访问速度相对慢 因此 为了匹配 必须增加等效的周期 芯片在复位时 等待周期默认最大值 15个等待周期 我们可以在初始化过程中设置寄存器的值 来改变等待周期 比如2837X最高运行频率200兆赫兹的时候 flash的周期是3个周期 相对应的不同的工作频率的话 这个等待周期不同 我们都有这些推荐值 不止有flash受到等待周期的影响 ODP不受它的影响 它的固定时间是11个系统周期 记住一点 flash初始化配置的代码不能在flash中运行 必须在上电的时候把flash初始化的代码 拷贝到RAM中执行 刚才说了 我的CPU实行速度快 最高达到200兆 我的flash速度慢 所以必须提高我的flash速度 能够满足我CPU操作需求 这个地方就涉及到我如何加速 在我们的C2000里面 我们采用预取缓冲机制 一个是预取 一个是缓冲 预取意思我一次从flash中读取多个字节的 这个地方 我们读取128字节的指令 然后把数据放入我的两级的缓存器里面 然后把数据发给CPU的内核 这样的话 因为这个是在我的RAM里面的 因此这地方就能把他加速了 也就是我一次性多读取几个过来 在CPU这里执行的时候 我不断读取 放到缓存里面 通过缓存提供数据 这样把速度提上来 针对指令的话 我们有预取和缓冲机制的 针对我的数据 我只有预取没有缓冲机制 也就是 我数据读过来 我放这里等待的CPU内核 的一个读取 C2000的话 一般采取8级的缓冲 8级的预存 我们看看代码执行的性能 首先 我们假设 我们的2837X工作在200兆赫兹 16位的指令 如果它是内部的RAM中的 也就是你的代码速度要求比较快的 我把它拷贝到RAM中执行 如果从RAM中读取指令的话 我执行速度会非常快 取址速度快 单周期的 可以工作在200兆的MPS 如果从flash中读取 等待时间设置为3个周期 默认3个周期 我每6个周期读取128字节的指令 然后 用8个周期来执行 这样总统128除以8个周期 约等于200MIPS 但考虑到我的取址过程中 会有一些不连续性 因此性能稍微降低 达到180MIPS 从此看出 最好是把程序代码拷贝到RAM中执行 把200MIPS放到FLASH中 能达到180MIPS 根据上面的推算 我们得出这个表格 内部RAM是单周期的访问 不管是16还是32位的 针对flash 我是接近1 也就是0.9 这样算的话 flash接近1 同时需要注意 在flash数据访问期间 我的指令获取的管道是停止的 也就是 我从flash读取数据 我不能同时从代码区读取数据 现在我们看看flash和OTP低功耗模式 flash和OTP三种电压模式 一个是sleep 休眠模式 它消耗的电源最少 另外是standby 待机模式 它的功耗比sleep模式高 但它可以很快进入激活模式 激活模式是功耗最高的 也是芯片正常执行程序所需的工作模式 如果在我的flash里面 长期没有flash OTP访问操作 这些请求的话 我的flash和OTP都进入低功耗模式 但进入低功耗模式后 这个sleep模式后 如果有一个访问请求 我自动进入待机模式 然后是激活模式 采用低功耗模式的最重要的好处是 我可以保证芯片的功耗 降到最低 激活模式是通过flash里面的控制设定 然后是我们的ECC保护 我们的2837XECC保护 主要作用是 筛选出flash和OTP里面的故障 而我们采用的保护机制是 SECDED 单字节纠错 双字节检测的机制 假如我的flash OTP里面 单个字节被篡改的话 我能自动检测到 把错误改正 但如果有两个字节 发生错误的话 我无法改正它 只能报警 也就是我能检测到错误 针对flash和OTP每个64字节 每个64位 需要计算一个ECC代码 把它编写到我的ECC存储器里面 它跟我的flash OTP编程时一起写入到寄存器里面的 在取址或者读数据时 我根据每个64位数据 然后做ECC的校验 校验跟我的ECC里保存的内容对比 对上的话 就是没错误 正常执行 如果发生了一个字节的错误的话 我可以把它改正 如果两个字节的错误 我可以检测 并报警 这就是我们的ECC保护机制 每64个字节我产生8个子节的ECC代码 把它放在对应的寄存器里面 ECC保护使能也是在flash ECC 寄存器里面使能 把它打开 再来看flash的编程 它实际上是将我放在flash里面的数据 和代码 如何烧写到flash中去 我们所有flash的烧写都是通过CPU 来执行的 分为两个过程 第一个是 外部通过SCI SPI接口把数据导入我的RAM中 第二步 在RAM中执行flash的擦除 烧写函数 将数据写入flash 这过程需要CPU执行 也就是烧写分为两步 第一步将代码放入RAM中 第二步在RAM中运行RAM函数 烧写函数 将数据放入FLASH中 前面这种将数据放入RAM中 不同的方式 是我们的boot决定的 有JTAG SCI SPI I2C各种不一样的 boot方式不同是通过外部的GPL口的boot来决定的 其中 JTAG直接可以把代码烧到RAM中 除了它外 其他这些方式 必须经过ROM bootloader将这些代码导入到RAM中 那flash编程基本操作有三个 一个是擦除 一个是编程 一个是验证 擦除是将所有位归零 也就是将所有的字节变成1 归零不是把它写成0 而是1 所有编程都是将相应的位从1到0 就是编程 验证的话 我烧写的程序的数据和我烧到flash中的数据是否是一样的 如果不同 会报错 flash最小的擦除单位是一个扇区 最下的编程字节是一个位 一个bit 这样的话 我的flash可以当做一方来用 但最后一点是 我擦除把一个扇区擦除掉 所以作为一方来用的话 需要把其他不需要的数据先拷出来 然后在烧回flash 过程稍微复杂 而且在flash的烧写过程中 务必保证 芯片不要断电 不要有电源大波动 假如发生断电 这个时候密码区全部变成0的时候 我的芯片就完全锁死了 就算不是全部是0的话 我也不知道 密码区写了哪些数据 芯片就很难解开 flash的烧写过程是非常短暂的 所以发生意外的概率很小 从我们外部来说 主要保证一点 在烧写程序时 必须保证电源稳定 那么烧写程序的工具我们有 仿真器 串口烧写 我们看看flash编程实用的程序 JTAG我们有CCS 是集成的闪存编程器 还有CCS UNIFLASH 以及第三方提供的软件 基于SCI串口编程的话 有第三方提供的C2PROG 在生产上编程的话 我们有C2000啊 还有一些BP的编程器啊 那么还有一些比如生产过程中用到的升级器 也是基于串口control引导程序 来导入烧写程序的 所有这些工具都可以在C2000链接上找到
接下来我们看看F2837X的flash的配置和编程
F2837X有RAM flash、ROM等 最常用的是RAM和flash
其中RAM的特点是访问速度快
一般是单周期的
它的缺点是会丢失数据 因此RAM主要用来保存数据
以及程序运行过程中需要用到的变量
需要快速执行的代码 等等
FLASH的特点是掉电不丢失 但它的访问速度慢
因此它里面保存用户的执行代码 不变的数据
也就是数据表等表格
接下来看看FLASH的基本操作
我们的FLASH按照使用分为 多次擦除的flash
以及只能一次擦除的OTP
flash使用去必须有一个初始化过程
最主要的设置flash的等待时间
和位置
由于CPU的执行速度较快
比如2837X的CPU执行速度是200兆赫兹
我的flash的访问速度相对慢
因此 为了匹配 必须增加等效的周期
芯片在复位时 等待周期默认最大值 15个等待周期
我们可以在初始化过程中设置寄存器的值
来改变等待周期 比如2837X最高运行频率200兆赫兹的时候
flash的周期是3个周期
相对应的不同的工作频率的话
这个等待周期不同
我们都有这些推荐值
不止有flash受到等待周期的影响
ODP不受它的影响
它的固定时间是11个系统周期 记住一点
flash初始化配置的代码不能在flash中运行
必须在上电的时候把flash初始化的代码
拷贝到RAM中执行
刚才说了 我的CPU实行速度快
最高达到200兆 我的flash速度慢
所以必须提高我的flash速度
能够满足我CPU操作需求
这个地方就涉及到我如何加速
在我们的C2000里面 我们采用预取缓冲机制
一个是预取 一个是缓冲
预取意思我一次从flash中读取多个字节的
这个地方 我们读取128字节的指令
然后把数据放入我的两级的缓存器里面
然后把数据发给CPU的内核
这样的话 因为这个是在我的RAM里面的
因此这地方就能把他加速了
也就是我一次性多读取几个过来 在CPU这里执行的时候
我不断读取 放到缓存里面
通过缓存提供数据
这样把速度提上来
针对指令的话 我们有预取和缓冲机制的
针对我的数据 我只有预取没有缓冲机制
也就是 我数据读过来 我放这里等待的CPU内核
的一个读取
C2000的话 一般采取8级的缓冲
8级的预存
我们看看代码执行的性能
首先 我们假设 我们的2837X工作在200兆赫兹
16位的指令 如果它是内部的RAM中的
也就是你的代码速度要求比较快的
我把它拷贝到RAM中执行
如果从RAM中读取指令的话 我执行速度会非常快
取址速度快 单周期的
可以工作在200兆的MPS
如果从flash中读取 等待时间设置为3个周期
默认3个周期
我每6个周期读取128字节的指令
然后 用8个周期来执行
这样总统128除以8个周期 约等于200MIPS
但考虑到我的取址过程中 会有一些不连续性
因此性能稍微降低 达到180MIPS
从此看出 最好是把程序代码拷贝到RAM中执行
把200MIPS放到FLASH中 能达到180MIPS
根据上面的推算 我们得出这个表格
内部RAM是单周期的访问
不管是16还是32位的
针对flash 我是接近1 也就是0.9
这样算的话
flash接近1 同时需要注意
在flash数据访问期间 我的指令获取的管道是停止的
也就是 我从flash读取数据 我不能同时从代码区读取数据
现在我们看看flash和OTP低功耗模式
flash和OTP三种电压模式 一个是sleep
休眠模式 它消耗的电源最少
另外是standby 待机模式
它的功耗比sleep模式高 但它可以很快进入激活模式
激活模式是功耗最高的 也是芯片正常执行程序所需的工作模式
如果在我的flash里面 长期没有flash OTP访问操作
这些请求的话
我的flash和OTP都进入低功耗模式
但进入低功耗模式后 这个sleep模式后
如果有一个访问请求 我自动进入待机模式 然后是激活模式
采用低功耗模式的最重要的好处是
我可以保证芯片的功耗 降到最低
激活模式是通过flash里面的控制设定
然后是我们的ECC保护
我们的2837XECC保护 主要作用是
筛选出flash和OTP里面的故障 而我们采用的保护机制是
SECDED 单字节纠错 双字节检测的机制
假如我的flash OTP里面
单个字节被篡改的话 我能自动检测到 把错误改正
但如果有两个字节 发生错误的话
我无法改正它 只能报警
也就是我能检测到错误 针对flash和OTP每个64字节
每个64位
需要计算一个ECC代码
把它编写到我的ECC存储器里面
它跟我的flash OTP编程时一起写入到寄存器里面的
在取址或者读数据时 我根据每个64位数据
然后做ECC的校验
校验跟我的ECC里保存的内容对比
对上的话 就是没错误 正常执行
如果发生了一个字节的错误的话
我可以把它改正
如果两个字节的错误 我可以检测 并报警
这就是我们的ECC保护机制
每64个字节我产生8个子节的ECC代码
把它放在对应的寄存器里面
ECC保护使能也是在flash ECC 寄存器里面使能
把它打开
再来看flash的编程
它实际上是将我放在flash里面的数据
和代码 如何烧写到flash中去
我们所有flash的烧写都是通过CPU
来执行的
分为两个过程 第一个是
外部通过SCI SPI接口把数据导入我的RAM中
第二步 在RAM中执行flash的擦除 烧写函数
将数据写入flash
这过程需要CPU执行
也就是烧写分为两步
第一步将代码放入RAM中 第二步在RAM中运行RAM函数
烧写函数
将数据放入FLASH中
前面这种将数据放入RAM中 不同的方式
是我们的boot决定的
有JTAG SCI SPI I2C各种不一样的
boot方式不同是通过外部的GPL口的boot来决定的
其中 JTAG直接可以把代码烧到RAM中
除了它外 其他这些方式
必须经过ROM bootloader将这些代码导入到RAM中
那flash编程基本操作有三个
一个是擦除 一个是编程 一个是验证
擦除是将所有位归零
也就是将所有的字节变成1
归零不是把它写成0 而是1
所有编程都是将相应的位从1到0
就是编程 验证的话
我烧写的程序的数据和我烧到flash中的数据是否是一样的
如果不同 会报错
flash最小的擦除单位是一个扇区
最下的编程字节是一个位
一个bit
这样的话 我的flash可以当做一方来用
但最后一点是 我擦除把一个扇区擦除掉
所以作为一方来用的话
需要把其他不需要的数据先拷出来
然后在烧回flash 过程稍微复杂
而且在flash的烧写过程中 务必保证
芯片不要断电
不要有电源大波动
假如发生断电 这个时候密码区全部变成0的时候
我的芯片就完全锁死了
就算不是全部是0的话 我也不知道 密码区写了哪些数据
芯片就很难解开
flash的烧写过程是非常短暂的
所以发生意外的概率很小
从我们外部来说 主要保证一点
在烧写程序时 必须保证电源稳定
那么烧写程序的工具我们有
仿真器 串口烧写
我们看看flash编程实用的程序
JTAG我们有CCS
是集成的闪存编程器
还有CCS UNIFLASH
以及第三方提供的软件
基于SCI串口编程的话 有第三方提供的C2PROG
在生产上编程的话 我们有C2000啊
还有一些BP的编程器啊
那么还有一些比如生产过程中用到的升级器
也是基于串口control引导程序
来导入烧写程序的
所有这些工具都可以在C2000链接上找到
接下来我们看看F2837X的flash的配置和编程 F2837X有RAM flash、ROM等 最常用的是RAM和flash 其中RAM的特点是访问速度快 一般是单周期的 它的缺点是会丢失数据 因此RAM主要用来保存数据 以及程序运行过程中需要用到的变量 需要快速执行的代码 等等 FLASH的特点是掉电不丢失 但它的访问速度慢 因此它里面保存用户的执行代码 不变的数据 也就是数据表等表格 接下来看看FLASH的基本操作 我们的FLASH按照使用分为 多次擦除的flash 以及只能一次擦除的OTP flash使用去必须有一个初始化过程 最主要的设置flash的等待时间 和位置 由于CPU的执行速度较快 比如2837X的CPU执行速度是200兆赫兹 我的flash的访问速度相对慢 因此 为了匹配 必须增加等效的周期 芯片在复位时 等待周期默认最大值 15个等待周期 我们可以在初始化过程中设置寄存器的值 来改变等待周期 比如2837X最高运行频率200兆赫兹的时候 flash的周期是3个周期 相对应的不同的工作频率的话 这个等待周期不同 我们都有这些推荐值 不止有flash受到等待周期的影响 ODP不受它的影响 它的固定时间是11个系统周期 记住一点 flash初始化配置的代码不能在flash中运行 必须在上电的时候把flash初始化的代码 拷贝到RAM中执行 刚才说了 我的CPU实行速度快 最高达到200兆 我的flash速度慢 所以必须提高我的flash速度 能够满足我CPU操作需求 这个地方就涉及到我如何加速 在我们的C2000里面 我们采用预取缓冲机制 一个是预取 一个是缓冲 预取意思我一次从flash中读取多个字节的 这个地方 我们读取128字节的指令 然后把数据放入我的两级的缓存器里面 然后把数据发给CPU的内核 这样的话 因为这个是在我的RAM里面的 因此这地方就能把他加速了 也就是我一次性多读取几个过来 在CPU这里执行的时候 我不断读取 放到缓存里面 通过缓存提供数据 这样把速度提上来 针对指令的话 我们有预取和缓冲机制的 针对我的数据 我只有预取没有缓冲机制 也就是 我数据读过来 我放这里等待的CPU内核 的一个读取 C2000的话 一般采取8级的缓冲 8级的预存 我们看看代码执行的性能 首先 我们假设 我们的2837X工作在200兆赫兹 16位的指令 如果它是内部的RAM中的 也就是你的代码速度要求比较快的 我把它拷贝到RAM中执行 如果从RAM中读取指令的话 我执行速度会非常快 取址速度快 单周期的 可以工作在200兆的MPS 如果从flash中读取 等待时间设置为3个周期 默认3个周期 我每6个周期读取128字节的指令 然后 用8个周期来执行 这样总统128除以8个周期 约等于200MIPS 但考虑到我的取址过程中 会有一些不连续性 因此性能稍微降低 达到180MIPS 从此看出 最好是把程序代码拷贝到RAM中执行 把200MIPS放到FLASH中 能达到180MIPS 根据上面的推算 我们得出这个表格 内部RAM是单周期的访问 不管是16还是32位的 针对flash 我是接近1 也就是0.9 这样算的话 flash接近1 同时需要注意 在flash数据访问期间 我的指令获取的管道是停止的 也就是 我从flash读取数据 我不能同时从代码区读取数据 现在我们看看flash和OTP低功耗模式 flash和OTP三种电压模式 一个是sleep 休眠模式 它消耗的电源最少 另外是standby 待机模式 它的功耗比sleep模式高 但它可以很快进入激活模式 激活模式是功耗最高的 也是芯片正常执行程序所需的工作模式 如果在我的flash里面 长期没有flash OTP访问操作 这些请求的话 我的flash和OTP都进入低功耗模式 但进入低功耗模式后 这个sleep模式后 如果有一个访问请求 我自动进入待机模式 然后是激活模式 采用低功耗模式的最重要的好处是 我可以保证芯片的功耗 降到最低 激活模式是通过flash里面的控制设定 然后是我们的ECC保护 我们的2837XECC保护 主要作用是 筛选出flash和OTP里面的故障 而我们采用的保护机制是 SECDED 单字节纠错 双字节检测的机制 假如我的flash OTP里面 单个字节被篡改的话 我能自动检测到 把错误改正 但如果有两个字节 发生错误的话 我无法改正它 只能报警 也就是我能检测到错误 针对flash和OTP每个64字节 每个64位 需要计算一个ECC代码 把它编写到我的ECC存储器里面 它跟我的flash OTP编程时一起写入到寄存器里面的 在取址或者读数据时 我根据每个64位数据 然后做ECC的校验 校验跟我的ECC里保存的内容对比 对上的话 就是没错误 正常执行 如果发生了一个字节的错误的话 我可以把它改正 如果两个字节的错误 我可以检测 并报警 这就是我们的ECC保护机制 每64个字节我产生8个子节的ECC代码 把它放在对应的寄存器里面 ECC保护使能也是在flash ECC 寄存器里面使能 把它打开 再来看flash的编程 它实际上是将我放在flash里面的数据 和代码 如何烧写到flash中去 我们所有flash的烧写都是通过CPU 来执行的 分为两个过程 第一个是 外部通过SCI SPI接口把数据导入我的RAM中 第二步 在RAM中执行flash的擦除 烧写函数 将数据写入flash 这过程需要CPU执行 也就是烧写分为两步 第一步将代码放入RAM中 第二步在RAM中运行RAM函数 烧写函数 将数据放入FLASH中 前面这种将数据放入RAM中 不同的方式 是我们的boot决定的 有JTAG SCI SPI I2C各种不一样的 boot方式不同是通过外部的GPL口的boot来决定的 其中 JTAG直接可以把代码烧到RAM中 除了它外 其他这些方式 必须经过ROM bootloader将这些代码导入到RAM中 那flash编程基本操作有三个 一个是擦除 一个是编程 一个是验证 擦除是将所有位归零 也就是将所有的字节变成1 归零不是把它写成0 而是1 所有编程都是将相应的位从1到0 就是编程 验证的话 我烧写的程序的数据和我烧到flash中的数据是否是一样的 如果不同 会报错 flash最小的擦除单位是一个扇区 最下的编程字节是一个位 一个bit 这样的话 我的flash可以当做一方来用 但最后一点是 我擦除把一个扇区擦除掉 所以作为一方来用的话 需要把其他不需要的数据先拷出来 然后在烧回flash 过程稍微复杂 而且在flash的烧写过程中 务必保证 芯片不要断电 不要有电源大波动 假如发生断电 这个时候密码区全部变成0的时候 我的芯片就完全锁死了 就算不是全部是0的话 我也不知道 密码区写了哪些数据 芯片就很难解开 flash的烧写过程是非常短暂的 所以发生意外的概率很小 从我们外部来说 主要保证一点 在烧写程序时 必须保证电源稳定 那么烧写程序的工具我们有 仿真器 串口烧写 我们看看flash编程实用的程序 JTAG我们有CCS 是集成的闪存编程器 还有CCS UNIFLASH 以及第三方提供的软件 基于SCI串口编程的话 有第三方提供的C2PROG 在生产上编程的话 我们有C2000啊 还有一些BP的编程器啊 那么还有一些比如生产过程中用到的升级器 也是基于串口control引导程序 来导入烧写程序的 所有这些工具都可以在C2000链接上找到
接下来我们看看F2837X的flash的配置和编程
F2837X有RAM flash、ROM等 最常用的是RAM和flash
其中RAM的特点是访问速度快
一般是单周期的
它的缺点是会丢失数据 因此RAM主要用来保存数据
以及程序运行过程中需要用到的变量
需要快速执行的代码 等等
FLASH的特点是掉电不丢失 但它的访问速度慢
因此它里面保存用户的执行代码 不变的数据
也就是数据表等表格
接下来看看FLASH的基本操作
我们的FLASH按照使用分为 多次擦除的flash
以及只能一次擦除的OTP
flash使用去必须有一个初始化过程
最主要的设置flash的等待时间
和位置
由于CPU的执行速度较快
比如2837X的CPU执行速度是200兆赫兹
我的flash的访问速度相对慢
因此 为了匹配 必须增加等效的周期
芯片在复位时 等待周期默认最大值 15个等待周期
我们可以在初始化过程中设置寄存器的值
来改变等待周期 比如2837X最高运行频率200兆赫兹的时候
flash的周期是3个周期
相对应的不同的工作频率的话
这个等待周期不同
我们都有这些推荐值
不止有flash受到等待周期的影响
ODP不受它的影响
它的固定时间是11个系统周期 记住一点
flash初始化配置的代码不能在flash中运行
必须在上电的时候把flash初始化的代码
拷贝到RAM中执行
刚才说了 我的CPU实行速度快
最高达到200兆 我的flash速度慢
所以必须提高我的flash速度
能够满足我CPU操作需求
这个地方就涉及到我如何加速
在我们的C2000里面 我们采用预取缓冲机制
一个是预取 一个是缓冲
预取意思我一次从flash中读取多个字节的
这个地方 我们读取128字节的指令
然后把数据放入我的两级的缓存器里面
然后把数据发给CPU的内核
这样的话 因为这个是在我的RAM里面的
因此这地方就能把他加速了
也就是我一次性多读取几个过来 在CPU这里执行的时候
我不断读取 放到缓存里面
通过缓存提供数据
这样把速度提上来
针对指令的话 我们有预取和缓冲机制的
针对我的数据 我只有预取没有缓冲机制
也就是 我数据读过来 我放这里等待的CPU内核
的一个读取
C2000的话 一般采取8级的缓冲
8级的预存
我们看看代码执行的性能
首先 我们假设 我们的2837X工作在200兆赫兹
16位的指令 如果它是内部的RAM中的
也就是你的代码速度要求比较快的
我把它拷贝到RAM中执行
如果从RAM中读取指令的话 我执行速度会非常快
取址速度快 单周期的
可以工作在200兆的MPS
如果从flash中读取 等待时间设置为3个周期
默认3个周期
我每6个周期读取128字节的指令
然后 用8个周期来执行
这样总统128除以8个周期 约等于200MIPS
但考虑到我的取址过程中 会有一些不连续性
因此性能稍微降低 达到180MIPS
从此看出 最好是把程序代码拷贝到RAM中执行
把200MIPS放到FLASH中 能达到180MIPS
根据上面的推算 我们得出这个表格
内部RAM是单周期的访问
不管是16还是32位的
针对flash 我是接近1 也就是0.9
这样算的话
flash接近1 同时需要注意
在flash数据访问期间 我的指令获取的管道是停止的
也就是 我从flash读取数据 我不能同时从代码区读取数据
现在我们看看flash和OTP低功耗模式
flash和OTP三种电压模式 一个是sleep
休眠模式 它消耗的电源最少
另外是standby 待机模式
它的功耗比sleep模式高 但它可以很快进入激活模式
激活模式是功耗最高的 也是芯片正常执行程序所需的工作模式
如果在我的flash里面 长期没有flash OTP访问操作
这些请求的话
我的flash和OTP都进入低功耗模式
但进入低功耗模式后 这个sleep模式后
如果有一个访问请求 我自动进入待机模式 然后是激活模式
采用低功耗模式的最重要的好处是
我可以保证芯片的功耗 降到最低
激活模式是通过flash里面的控制设定
然后是我们的ECC保护
我们的2837XECC保护 主要作用是
筛选出flash和OTP里面的故障 而我们采用的保护机制是
SECDED 单字节纠错 双字节检测的机制
假如我的flash OTP里面
单个字节被篡改的话 我能自动检测到 把错误改正
但如果有两个字节 发生错误的话
我无法改正它 只能报警
也就是我能检测到错误 针对flash和OTP每个64字节
每个64位
需要计算一个ECC代码
把它编写到我的ECC存储器里面
它跟我的flash OTP编程时一起写入到寄存器里面的
在取址或者读数据时 我根据每个64位数据
然后做ECC的校验
校验跟我的ECC里保存的内容对比
对上的话 就是没错误 正常执行
如果发生了一个字节的错误的话
我可以把它改正
如果两个字节的错误 我可以检测 并报警
这就是我们的ECC保护机制
每64个字节我产生8个子节的ECC代码
把它放在对应的寄存器里面
ECC保护使能也是在flash ECC 寄存器里面使能
把它打开
再来看flash的编程
它实际上是将我放在flash里面的数据
和代码 如何烧写到flash中去
我们所有flash的烧写都是通过CPU
来执行的
分为两个过程 第一个是
外部通过SCI SPI接口把数据导入我的RAM中
第二步 在RAM中执行flash的擦除 烧写函数
将数据写入flash
这过程需要CPU执行
也就是烧写分为两步
第一步将代码放入RAM中 第二步在RAM中运行RAM函数
烧写函数
将数据放入FLASH中
前面这种将数据放入RAM中 不同的方式
是我们的boot决定的
有JTAG SCI SPI I2C各种不一样的
boot方式不同是通过外部的GPL口的boot来决定的
其中 JTAG直接可以把代码烧到RAM中
除了它外 其他这些方式
必须经过ROM bootloader将这些代码导入到RAM中
那flash编程基本操作有三个
一个是擦除 一个是编程 一个是验证
擦除是将所有位归零
也就是将所有的字节变成1
归零不是把它写成0 而是1
所有编程都是将相应的位从1到0
就是编程 验证的话
我烧写的程序的数据和我烧到flash中的数据是否是一样的
如果不同 会报错
flash最小的擦除单位是一个扇区
最下的编程字节是一个位
一个bit
这样的话 我的flash可以当做一方来用
但最后一点是 我擦除把一个扇区擦除掉
所以作为一方来用的话
需要把其他不需要的数据先拷出来
然后在烧回flash 过程稍微复杂
而且在flash的烧写过程中 务必保证
芯片不要断电
不要有电源大波动
假如发生断电 这个时候密码区全部变成0的时候
我的芯片就完全锁死了
就算不是全部是0的话 我也不知道 密码区写了哪些数据
芯片就很难解开
flash的烧写过程是非常短暂的
所以发生意外的概率很小
从我们外部来说 主要保证一点
在烧写程序时 必须保证电源稳定
那么烧写程序的工具我们有
仿真器 串口烧写
我们看看flash编程实用的程序
JTAG我们有CCS
是集成的闪存编程器
还有CCS UNIFLASH
以及第三方提供的软件
基于SCI串口编程的话 有第三方提供的C2PROG
在生产上编程的话 我们有C2000啊
还有一些BP的编程器啊
那么还有一些比如生产过程中用到的升级器
也是基于串口control引导程序
来导入烧写程序的
所有这些工具都可以在C2000链接上找到
视频报错
手机看
扫码用手机观看
收藏本课程
视频简介
C2837x入门指南(十七)—系统设计之Flash编程和配置
所属课程:C2837x入门指南
发布时间:2016.07.12
视频集数:28
本节视频时长:00:13:14
C2837x概述;芯片架构; 开发环境;外设寄存器操作;复位和中断;系统初始化;模拟子系统 ADC DAC CMP SDFM;控制类外设PWM CAP QEP。
//=$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'])?>