- 本课程为精品课,您可以登录eeworld继续观看:
- (17) -系统设计之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链接上找到
课程介绍
共计28课时,4小时27分22秒
C2837x入门指南
TI C2000 MCU PWM F2837xD ADC DAC DMA CLA C2837x CMP SDFM CAP QEP c28x
F2837x系列的最新 C2000™ Delfino™ 32 位 F2837xD 微控制器 (MCU),为工业实时控制实现最新创新,并设定了全新性能标准。这些最新 MCU 支持双核 C28x 处理功能与双实时控制加速器(也称为控制律加速器或 CLA),可提供 800 MIPS 浮点性能,从而可帮助设计人员为计算要求严格的控制应用开发低时延系统。此外,设计人员还可通过将多个嵌入式处理器整合在单个 MCU 中以降低复杂性,充分满足高级伺服驱动器、太阳能中央逆变器以及工业不间断电源 (UPS) 等需要实时信号分析的应用需求。
猜你喜欢
换一换
推荐帖子
- 【TI首届低功耗设计大赛】初识MSP430FR5969 LaunchPad
- 板子到了有几天了,工作太忙学习时间不多,先发几张刚收到的照片 收到之后插上USB线,发现电脑提示串口驱动没有 调试驱动都没有,悲剧,在网上查了很久,经过了几天的努力才解决一个串口驱动,debug 接口驱动一直找不到,我之前一直没有安装360,是个人对360实在没有好感,看到有人的解决办法是装360,用360来修复系统,结果试了一下,真的搞好了,看来360还是不错的啊,然后就是选择工具软件了,工具...
- lilong8470 微控制器 MCU
- TMS320C2x、-'C2xx或-'C5x DSP与8位引导区EPROM的接口
- TMS320C2x、-'C2xx或-'C5x DSP与8位引导区EPROM的接口 ...
- fish001 微控制器 MCU
- msp430f5529 I2C求助
- 小弟用P3.5和P3.6模拟I2C总线,但是得不出正确的波形,大佬们能指点一下吗?程序和波形图如下: void IICstart() { P3OUT|=BIT5;//先保证SDA数据总线为高,保证在时钟信号为高的前提下以便于变低 _NOP(); _NOP(); _NOP();...
- hxm3213 微控制器 MCU
- 我的数控电源基本完成
- 由于工作比较忙!基本能实现功能,精度及稳定性有待提高 1,应该是811把计算好的电压,电流值发送给PC或就地LCD上显示,可是我现在都是在PC或在程序里手动添加个系数进去的 2,板子连接比较多,导致壳体里安不下所有的板子了,计划下次有空,画个PCB做个出来 3,没有很好的发挥811的外围功能。 现在上传资料与大家分享下!有不足的地方请大家指出来! 原理图 ...
- 蓝雨夜 微控制器 MCU