首页 > 应用与设计 > 工业应用 > C2837x入门指南 >

电机驱动

最新课程

热门课程

C2837x入门指南(十七)—系统设计之Flash编程和配置

接下来我们看看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。
TI培训小程序