F28027第六课
今天下班后马上去健身房跟私教练了一下,真酸爽,生命在于健康在于运动,各位大神请多锻炼,聪明的脑袋和健康的体魄更配哦!
下午偷偷做了小动作,看了点CMD文件和内存的知识,突然觉得自己昨天又吹NB了,今天晚上我能把这个片子内存理清楚就算很了不起了,我看明晚那个CMD链接文件也够呛。但今晚和明晚的知识,我觉得整个F28027基础学习中最重要的环节,只有对芯片内存映射有了清晰的认识,才能说自己认识了这个芯片。
闲话少说,来学习今晚即枯燥又重要的章节。
先给大家上一幅图,这样大家才有最最直观的感受,才能意识到内存是多么多么的总要:
我们GPIO端口、PIE外设中断源、时钟源等,都离不开寄存器的操作,那你寄存器存放在哪里呢?你操作寄存器的指令命令放在哪呢?你优先级矢量表又放在哪?等等这些,看似简单,但认真想想却一点都不简单,怎么觉得自己又跑题了,呵呵。
从上面那个图中可以了解到,我们这款芯片内存分布是:
Flash:32KW(16位)
SARAM:MO-1KW、M1-1KW、LOSARAM-4KW
Boot ROM:8KW
OTP:1KW
前面三个我还知道,分别是Flash、RAM、和Boot ROM(引导程序),但是对于OPT(one-time programmable),说实话,我今天第一次了解到这个概念,呵呵,这个区域只能进行一次性编程,无法进行二次擦写。
下面我们看下具体的内存分布图:
先解释下基本概念:Data Space-数据空间,主要保存一些临时变量,掉电丢失;Prog Space-程序空间,主要保存代码和常量,掉电不丢失。
容许我再天马行空下,因为我看到这个映射表里面有PIE中断矢量表的相关东西,但是我昨天没有提到这些,我要回过头去补一下(任性)
从上图我们也可以了解到,PIE矢量映射表可以存放在四个不同的地方:MO Vector、M1 Vector、Boot ROM Vector、PIE Vertor,那这四种模式如何选择呢?
模式选择就由图中三个圈圈变量控制
由变量解释可以看出,VMAP和MOM1MAP一般状态都是1,只有在TI测试时才为其他值,而ENPIE系统复位是0,那也就是在系统初始化复位时,矢量表是存放在Boot ROM Vector区域(0x3FFFC0 - 0x3FFFFF)。
经过上面的解读后,这张流转图大家应该还是能够看的明白吧,除了OBJMODE和AMODE这两个变量,其实我也不认识这两个变量,只知道都是ST1寄存器的。
这里说这个图是C28内核的工作模式选择,我其实是不懂的,勿怪,这里留着以后知道了再来解答,呵呵。
在内存映射表里面,有三个外设帧:Peripheral Frame 0/1/2,既然叫外设帧,主要是存放寄存器地址的,上图:
其他的存储部分没什么好说的,看图都知道了,除了Flash那部分,主要是这里分了四个扇区
在扇区A那里有一个安全代码模块CSM
那说到这里,我们今晚剩下的任务就比较明确了,Flash和CSM区域的使用。
先说Flash,它的工作模式我就不讨论,什么休眠、待用、运行读写模式,我还一个初学者,暂时不深究。
有花了一个小时,把flash所有相关的东西都看了一遍,有点晕晕的,呵呵,但还是要总结一下
Flash配置流程跟上图一致,重点就是中间配置那一步,配置完后要等待8个时钟周期。先来一个示例程序,再看寄存器:
void InitFlash(void)
{
EALLOW;
//Enable Flash Pipeline mode to improve performance
//of code executed from Flash.
FlashRegs.FOPT.bit.ENPIPE = 1;
// CAUTION
//Minimum waitstates required for the flash operating
//at a given CPU rate must be characterized by TI.
//Refer to the datasheet for the latest information.
#if (CPU_FRQ_60MHZ)
//Set the Paged Waitstate for the Flash
FlashRegs.FBANKWAIT.bit.PAGEWAIT = 2;
//Set the Random Waitstate for the Flash
FlashRegs.FBANKWAIT.bit.RANDWAIT = 2;
//Set the Waitstate for the OTP
FlashRegs.FOTPWAIT.bit.OTPWAIT = 2;
#elif (CPU_FRQ_40MHZ)
//Set the Paged Waitstate for the Flash
FlashRegs.FBANKWAIT.bit.PAGEWAIT = 1;
//Set the Random Waitstate for the Flash
FlashRegs.FBANKWAIT.bit.RANDWAIT = 1;
//Set the Waitstate for the OTP
FlashRegs.FOTPWAIT.bit.OTPWAIT = 1;
#endif
// CAUTION
//ONLY THE DEFAULT VALUE FOR THESE 2 REGISTERS SHOULD BE USED
FlashRegs.FSTDBYWAIT.bit.STDBYWAIT = 0x01FF;
FlashRegs.FACTIVEWAIT.bit.ACTIVEWAIT = 0x01FF;
EDIS;
//Force a pipeline flush to ensure that the write to
//the last register configured occurs before returning.
asm(” RPT #7 || NOP”);
}
再来看寄存器:
又堆了那么多图,看了理论,看了程序,再看寄存器,是懂非懂,呵呵,等后面做实践课的时候再深入理解吧。
现在剩最后一个安全代码模块了。
先来看下这个CSM的代码保护范围
从上面两幅图可以看出来,CSM主要在Flash/OPT/L0SARAM中起作用,对于外设和中断没有影响。
从上面的存储数据排列可以看出,KEY排在前六位,最后一个就是CSM唯一的一个寄存器CSMSCR
上面有两地地址,一个是CSM寄存器所在,一个是password所在
再看看最后一个图,当CSM模块启用时,如何进行设备操作:
看完这个流程有没有觉得思路比较清晰,那我们再来上两个示例程序
总这里,今晚的课程差不多就结束了,压力山大,虽然花了至少五个小时研究内存,可还是半懂状态,再继续研究也没太大作用了,只能再后面实践课程再学习了,现在准备洗洗睡了,明天还要上班。
菜鸟交流qq群107691092