历史上的今天
今天是:2024年10月12日(星期六)
2020年10月12日 | FLASH操作程序设计与存储器结构
2020-10-12 来源:elecfans
1,FLASH操作程序设计
下面我们来学习编程的内容。在学习编程前,我们要先了解一下FLASH存储模块的控制寄存器。
FLASH存储模块的所有操作都通过控制相关的控制寄存器来实现的。包括FCTL1、FCTL2、FCTL3三个控制寄存器,其中FCTL1主要包含对FLASH的编程和擦除操作的控制位;FCTL2主要定义进入时序发生器前的时钟源和分频系数;FCTL3保存FLASH存储模块的一些标志位。
2, FCTL1控制寄存器

FWKEY:FLASH存储模块的安全键值。共8位,对FLASH操作时应该向其中写入对应的安全键值,否则会引起PUC信号以及KEYV信号。0x96:读取时的安全键值;0x5A:写入时的安全键值。
BLKWRT:段编程控制位。当需要对某一个段或者几个段连续编程时,使用段编程方式可以加快编程的速度。1:使用段编程方式;0:不适用段编程方式。
WRT:编程控制位。当需要对FLASH编程时,必须对该位置位,否则会导致ACCVIFG(非法访问中断标志位)置位。1:允许对FLASH编程;0:禁止对FLASH编程。
MERAS:多段擦除控制位,当需要擦除多段时,对改为置位。1:擦除多段;0:不擦除。
ERASE:但段擦除控制位,当需要擦除一个段时,对该位进行置位。1:擦除一个段;0:不擦除。
3,FCTL2控制寄存器

FWKEY:FLASH存储模块的安全键值。共8位,对FLASH操作时应该向其中写入对应的安全键值,否则会引起PUC信号以及KEYV信号。0x96:读取时的安全键值;0x5A:写入时的安全键值。
FSSEL1~0:选择FLASH存储模块的时序发生器的时钟源。3:选择SMCLK;2:选择SMCLK;1:选择CMLK;0:选择ACLK。
FN5-0:为时序发生器的时钟源选择分频系数,最终的分频比为32*FN5+16*FN4+8*FN3+4*FN2+2*FN1+FN0+1.
4, FCTL3控制寄存器

FWKEY为安全键值,和前两个一样,我们不在赘述。
EMEX:紧急退出位。对该位置位能够紧急停止对FLASH的操作。1:紧急停止FLASH操作;0:不操作。
LOCK:FLASH锁定位。如果在该位置位时对FLASH进行擦除和写入操作会导致非法访问,对应的标志位ACCVIFGF置位。1:锁定FLASH存储模块,锁定时可读,但不可擦除和写入;0:不锁定FLASH存储模块,可读可写可擦除。
WAIT:等待标志位,用户通过读取该位的状态已获得FLASH存储器和段编程状态。1:段编程有效;0:段编程操作正在进行。
ACCVIFG:非法访问标志位。1:非法访问;0:没有非法访问。
KEYV:非法安全键值标志位。1:错误安全键值;0:正确的安全键值。
BUSY:FLASH存储模块忙标志位。1:当前FLASH存储模块忙;0:当前FLASH存储模块空闲。
5,单字节写入操作

程序时对单字节写入的操作,向Seg_A中的地址0x1090写入数据0xAA。从这个程序段,我们可以看出向FLASH写入的数据的基本流程,大部分与擦除还是很相似的。需要特别注意的是,在这段程序中我们省略了检测BUSY状态位的环节,并且在实际情况下,只要用户程序不是频繁的、交叉的操作FLASH存储模块,一般是需要检测BUSY位的。
对于多字节的写入操作,其基本操作方式单字节类似,只需要每次修改FLASH地址指针,并写入对应的数据即可。
6,段擦除操作

MSP430系列MCU尽管可以向FLASH存储模块的任意地址写入数据,但是擦除操作只能以段位基本单位操作,即最少只能擦除Seg_A和Seg_B段。从示例的程序中,可以看出段擦除的基本流程:除了启动擦除操作之前的基本设置,擦除之后的基本设置之外,还需特别注意的是:向要擦除的段(程序中位Seg_A)任意一个地址中写入任意数据以启动擦除操作。同样,这是一个简化的程序段,也没有检测BUSY等标志位。
这是一个非常经典的TI的关于FLASH存储模块的程序,在几乎所有的关于MSP430的书籍等资料上都可以看见他的身影。这段程序包含了擦除,段写入、段复制等操作,是一个非常好的例子。
需要特别注意的是:前面的程序仅仅是一个示例,当你在很复杂的程序中操作FLASH前,一定要先禁止所有的中断并禁用看门狗,切记切记。
史海拾趣
|
DO-254中的高设计可靠性的逻辑综合(十)--使用Precision综合可以不用担心设计可靠性 在一些应用中,例如DO-254的A级和B级,对于设计可靠性的要求是非常重要的,而面积和性能的要求相应的优先级比较低。对这样的工程来说,通常会建议采用一个全局的选项,能够关闭一些优化后难以验证的功能。 这个全局选项要有两个功能,一个是能够自 ...… 查看全部问答> |
|
奇怪:Design Templates设为Small footprint device时模拟器跑不起来,而设为PDA时可以? 昨天,我将Design Templates设为PDA时模拟器跑起来了. 附: 在Builder options中,去掉Enable KITL; 在Target-〉Connectivity options->Debugger选none. 而今天自己想再试一 ...… 查看全部问答> |
|
我用VB.net开发一个小程序 有一个teXtboX的输入框 我想让程序在cE6下一点该输入框就跳出输入键盘 该怎么做呢 谢谢… 查看全部问答> |
|
我想在WinCE下通过DeviceIOControl来改变LCD背光电源的状态以实现背光灯的亮灭控制。 bResult = DeviceIoControl(hDevice, // device to be queried ...… 查看全部问答> |
|
想和單片機高手一起討論下這個簡單串口中斷程序的問題所在!!! 我編寫了一個串口中斷匯編程序,不復雜,調試也沒有出現問題,但是就是工作不了,我想和大家討論下究竟是什么錯誤導致它運\行出錯~請大家幫忙... T2CON EQU 0C8H T2MOD EQU 0C9H TR2 BIT T2CON.2 RCAP2L EQU 0CAH RCAP2H EQU 0CBH TH2 EQU 0C ...… 查看全部问答> |
|
#include <stdio.h>#define N 9int a[N];int k;int function(int m){ int j=1; while(j<m) { while(a[k]==0) k=(k+1)%N; j++; k=(k+1)%N; } while(a[k]==0)&nbs ...… 查看全部问答> |




