历史上的今天
今天是:2025年01月22日(星期三)
2021年01月22日 | MSP430的Flash存储器
2021-01-22 来源:eefocus
FLASH存储器的主要功能部件
控制寄存器:控制FLASH存储器的檫除与写入
FLASH存储器阵列:存储体
地址数据锁存器:檫除与编程时执行锁存操作
编程电压发生器:产生编程电压
时序发生器:产生檫除与编程所需所有时序控制信号
擦除操作
选择适当的时钟源和分频因子,为时序发生器提供正确时钟输入
如果Lock=1,则将它复位
监视BUSY标志位只有当BUSY=0时才可以执行下一步,否则一直监视BUSY。
如果擦除一段,则设置ERASE=1。
如果擦除多段,则设置MERAS=1
如果整个FLASH全擦除,则设置RASE=1同时MERAS=1。
对擦除的地址范围内任意位置作一次空写入,用以启动擦除操作。如果空写的地址在不能执行擦除操作的段地址范围内,则写入操作不起作用
FLASH编程操作
选择适当的时钟源以及合适的分频因子
如果Lock=1,将它复位
监视BUSY位,直到BUSY=0是才可进入下一步
如果写入单字或单字节,则将设置WRT=1
如果是块写或多字、多字节顺序写入,则将设置WRT=1,BLKWRT=1
将数据写入选定地址时启动时序发生器,在时序发生器的控制下完成整个过程
FLASH错误操作的处理
如果写入高字节口令码错误,则引发PUC信号:小心操作可以避免;
在对FLASH操作期间读FLASH内容,会引发ACCVFIG状态位的设置:小心操作可以避免
因为在对FLASH操作期间,需要较长的时间,如果这时看门狗定时器的数据将近尾声,则看门狗定时器溢出:建议用户程序在进行FLASH操作之前先停掉看门狗定时器,等操作结束之后再打开看门狗
所有的FLASH类型的MSP430器件的0段都包含有中断向量等重要的程序代码,如果对其进行擦除操作,将会引起严重的后果:建议用户程序在进行FLASH操作之前,先将该段的重要数据(或程序代码)保存到RAM中或写入到其他暂时未用的段中,等待该段操作完毕再还原那些数据(或程序代码);同时一定不要使正在执行的程序处在正要被擦除的段中;也不要在FLASH操作期间允许中断的发生。
下面这个图是Flash储存器的组织

这个图示flash的周期时序

EXAMPLE:
信息段A和B的擦和写操作。现将内存中的double型数据和int型数据保存到信息段A中,再将其从信息段A复制到信息段B中。
#include void write_SegA(void) Flash_data_ptr = (double*)0x1080; //intialize for(i=0;i<8;i++) void Copy_A2B(void) FCTL1 = FWKEY + ERASE; // 允许擦除 for(i = 0;i<8;i++) FCTL1 = FWKEY; 下面贴上运行的结果(在449下的调试结果) 初始化状态 void write_SegA(void)后 另外,不同型号的Flash区别只在于主存储器的地址范围不一样!
double data[8];
int add;
void write_SegA(void);
void Copy_A2B(void);
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;//STOP THE WATCHDOG
FCTL2 = FWKEY + FSSEL0 + FN0;// initialize the clock
for(int i=0;i<8;i++ )
{
data[i] = i;
} //initialize unsigned int data
add = 8;
write_SegA();
Copy_A2B();
for(;;);
}
{
double* Flash_data_ptr;
unsigned int* Flash_int_ptr;
unsigned int i;
FCTL1 = FWKEY + ERASE; //允许擦出
FCTL3 = FWKEY; //解锁
*Flash_data_ptr = 0;//空写,启动擦除
FCTL1 = FWKEY + WRT;//允许写
{
*Flash_data_ptr++ = data[i];
}
Flash_int_ptr = (unsigned int*)Flash_data_ptr; //initialize
*Flash_int_ptr = add; //写入unsigned int
FCTL1 = FWKEY;
FCTL3 = FWKEY + LOCK;
}
{
double *Flash_data_ptrA; //信息段A double型 Flash 指针
double *Flash_data_ptrB; //信息段B double型 Flash 指针
unsigned int *Flash_int_ptrA;
unsigned int *Flash_int_ptrB;
unsigned int i;
Flash_data_ptrA = (double *)0x1080;
Flash_data_ptrB = (double *)0x1000;
FCTL3 = FWKEY; //解锁
*Flash_data_ptrB = 0; //空写
FCTL1 = FWKEY + WRT; // 允许写
{
*Flash_data_ptrB++ = *Flash_data_ptrA++;//COPY
}
Flash_int_ptrA = (unsigned int*)Flash_data_ptrA;//初始化信息段 A unsigned int 型指针
Flash_int_ptrB = (unsigned int*)Flash_data_ptrB;//初始化信息段 B unsigned int 型指针
*Flash_int_ptrB = *Flash_int_ptrA;
FCTL3 = FWKEY + LOCK; //锁定
}

void Copy_A2B(void)后
史海拾趣
|
1.信号“地”; 信号“地”又称参考“地”,就是零电位的参考点,也是构成电路信号回路的公共段,图形符号“⊥”。 1) 直流地:直流电路“地”,零电位参考点。 2) 交流地:交流电的 ...… 查看全部问答> |
|
小弟在初学PIC时候遇到了这个难处。 我用PIC扫描时总是不能实现正常显示。以下是我的代码 unsigned int k; void delay(ms) { int a,b; for(a=ms;a>0;a--) & ...… 查看全部问答> |
|
PC机与多个C51进行通信时,在51中怎么样判断数据是否发送给自己的呢? 如何将数据精确到发送到指定的51单片机上呢? 有效立即给分,绝不 食言而肥… 查看全部问答> |
|
交流电流过负载时,加在该负载上的交流电压与通过该负载的交流电流产生相位差,人们便从中引出功率因数这一概念。人们生产、生活用电来自电网,电网提供频率为50Hz或60Hz的交流电。作为交流电的负载有电阻、电感、电容三种类型: 1、当交流电通过 ...… 查看全部问答> |
|
具有 6 位点校正功能的 16 通道 12 位 PWM LED 驱动器 [url=https://www.eeworld.com.cn/LED$(\'swf_K2S\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', encodeURI(\'\'), \'quality\', \'hi ...… 查看全部问答> |
|
AD5933是一款功能有强的12位ADC,里面集成了1024点的DFT,并有DDS型频率发生器。可以测试被测元件的实部和虚部。-----电感、电阻、电容都能测量。 外加个I2C接口的显示部分,就可以组成一个好的阻抗测试仪。 缺点:芯片太贵(淘宝价70~110)… 查看全部问答> |
|
本帖最后由 accboy 于 2014-8-25 11:56 编辑 (一) WEBENCH设计目标与缘由及设计思路; 开关电源的基本设计有很多的种类, 使用的电路的不同, 拓朴的不同, 设计思路的不同, 使用芯片的不同,周边元件的不同, 变压器设计的不同, 也包括变压器设计 ...… 查看全部问答> |




