单片机的存储空间

2019-07-20 16:45发布

MCU工程师炼成记---读书日志
02篇-单片机的存储空间

单片机的存储器管理,术语很多,我一直搞不明白,现买了《MCU工程师炼成记》一书,借此机会再次学习之,总结我的学习过程如下,希望共享,更希望指正。(还有个小目标,古代四书五经 有很多注释的书,希望这个学习过程也是对有关资料的注释,如果能达到这个目标,就圆满了。)
由于是个学习过程的总结,行文不系统。很多内容是我自己的理解,很可能不对,我对逐渐完善的,希望持续关注。(下文中的“书中”,都是指《MCU工程师炼成记》)

Flash可以存储代码和数据,RAM也可以存储数据,那么存储在二种存储器的数据有何异同?
是全局变量、局部变量(脑子里浮现了学习C语言的一些印象,但是记不清楚了)等不同类型变量保存在不同的存储器吗?
现在学习用户指南(编号SLAU049)第五章的Flash内容。反正手头除了《MCU工程师炼成记》外,就这个现成的资料。以下内容都来       自指南的翻译。

Flash存储器的缺省模式是read,在read模式下,不能erased,或者written,(学习到这里,我理解erased是擦除,就是全部清零,是比written快得多的操作,所以和written区分开来,不知道对不对?)在read模式下,Flash时间和电压发生器关闭,其操作和ROM一样。(这么说,ROM只能读了?)

MSP430的Flash存储器不需要额外的外部电压就可以在系统编程(ISP),CPU能编程它自己的Flash。(不需要额外的外部电压,啥意思?它的操作的用电来自谁?)Flash的write/erase模式由BLKWRT,WRT,MERAS,ERAS位来选择(这4个位都是来自FCTL1寄存器),可以是以下选择:
字节/字的写
Block(翻译成块,从指南看是segment的组成单位)的写,
Segment的擦除
Mass的擦除(就是擦除所有的主存segments)
ALL擦除(所有的segments)

Flash在编程或者擦除期间是禁止reading和writing的。(新名词:Flash的编程?就是写入数据吧!),若在writing或者erase期间,CPU要执行的代码必须在RAM中。Flash的任何更新可以从Flash或者RAM中启动。

Flash存储器的时间发生器
Write和erase操作受其时间发生器控制,时间发生器操作频率f(FTG)必须在~257KHz到~476KHz的范围内。
Flash时间发生器来源于ACLK,SMCLK,MCLK,所选时钟再用FNx位分频,以满足f(FTG)的频率要求。若在write或者erase操作中,f(FTG)频率不符合要求,则操作结果是不可预测的。

Erasing操作:Flash存储器的位的擦除后是1,每个位可以从1编程到0,但是从0编程到1需要一个erasing 周期。最小的擦除单位是segment,有三种擦除模式,(由ERASE,MERASE位来确定)
任何erase由一个dummy write地址启动,dummy write 启动时间发生器和擦除操作。擦除操作的时间周期与FLAsh的大小没有关系,都是一样的。Dummy write 地址若发生错误,则此write被忽略。(问题:dummy write 是什么代码?)
Flash擦除前中断应该禁止,擦除结束后,中断可以重新使能。擦除期间的中断使标志位置1,当使能后会产生一个中断请求。
从Flash 中启动ERAS:(不理解啥意思?)任何erase 可以从Flash或者RAM中启动,当从Flash中启动时,所有定时由Flash 控制器控制,CPU保持状态(我理解就是不运行了),当erase完成后,CPU执行dummy write后面一条指令。有可能擦除了擦除后需要执行的代码,若这样,CPU的执行是不可预测的。
从RAM中启动erase:任何erase可以从RAM中启动,此时,CPU可以继续执行来自RAM的代码,(学习到这里,好像明白了一点MCU有多种存储器的原因,当然,还要大侠指点),在CPU访问任何Flash地址前,BUSY位要测验一下来确定erase是否结束。若在BUSY=1期间发生了Flash访问,就是访问冲突,ACCVIFG会置位,擦除结果是不可预料的。
写Flash存储器:
写入有2种模式,分别为字节/字写入,块写入,后者是前者速度的2倍,因为在整个块写入期间,电压发生器保持在开 的状态。在2种模式下,任何修改目标参数的指令都可以用于修改Flash位置(不明白其含义?)。
在写入时BUSY自动置位,并且操作完成后自动清零。若写操作从RAM启动,当BUSY=1时,CPU不能访问Flash,否则,发生访问冲突,AAVIFG置位,写入的后果不可预测。
字节/字的写入
此种操作(就是指字节/字的写入)可从Flash或者RAM启动,当从Flash启动时,CPU被挂起,就是不运行了,知道写操作完毕,当写入完毕后,CPU执行写操作之后的代码。
当从RAM执行时,CPU继续执行RAM中的代码,在CPU再次访问Flash之前,BUSY必须处于清零的状态,否则,发生访问冲突,AAVIFG置位,写入的后果不可预测。总结一下(我总结的,不是指南的内容)我咋知道代码是从Flash还是RAM启动的?从RAM的执行,要检测BUSY的状态,检测的方法是循环检测标志位吗?(如书中第53页提及,这不利于低功耗)
块写入
块写入不能从Flash启动,必须从RAM中启动,在整个块写入期间BUSY都置1,当要写入多个块时,每个块写入完成时,BUSY要清零(我猜测是自动清零),BLKWRT和WRT也要软件清零,BLKWRT和WRT置位表明下一个块写入开始了。(在书中的85页有写入Flash的代码,是一个块的写入,还是2个块的写入,如何和指南(编号SLAU049f)中的写入操作对应,还是不明白?)
在块写入时,不能超过累计编程时间tCPT,这个术语啥意思,不明白?
在启动任何Flash操作前,任何中断源应该禁止,若在Flash 操作期间发生了一个使能的中断,将会执行错误的中断服务程序(具体见指南第140页)。
任何写入或者擦除操作在正常结束前都可以置位EMEX位(在FCTL3寄存器中)来终止,置位EMEX立刻停止所有的flash操作,进入读模式,FCTL1的所有位复位,所进行的操作的结果不可预知。
在操作或者字节/字写期间的任何对FCTL1的写入会置位ACCVIFG,在块写入期间,且WAIT=1时,写入FCTL1是可以的 ,但是当WAIT=0时写入FCTL1是会置位ACCVIFG的。
当BUSY=1时写入FCTL2会置位ACCVIFG。
当BUSY=1时,读取FCTLx是可以的。
在指南的141页提及:有三种对MSP430 flash型号单片机编程的方式,都支持在系统编程(看样,在系统编程仅是一种特性而已,不需要额外的外部电压,不是很理解),其中第三种是用户定制方法。这种方式在什么场合下应用?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
dirtwillfly
1楼-- · 2019-07-20 18:55
baimiaocun2015
2楼-- · 2019-07-21 00:22
Flash可以存储代码和数据,RAM也可以存储数据,这两个都是可以存储数据的,不过简单来说前者存储的数据在掉电后不会丢失的,而后者就一定为丢失,只是临时存储的
tongbu2015
3楼-- · 2019-07-21 03:22
同意楼上的意见的,不过ram的数据读写的比flash容易的。

一周热门 更多>