如何用MSP430单片机flash存储数据
#1 Msp430Flash型单片机内部Flash存储器介绍
1 Msp430Flash型单片机内部Flash存储器介绍MSP430的Flash存储器是可位、字节、字寻址和编程的存储器。
该模块由一个集成控制器来控制编程和擦除的操作。
控制器包括三个寄存器,一个时序发生器及一个提供编程、擦除电压的电压发生器。
Msp430的Flash存储器的特点有:1)产生内部编程电压2)可位、字节、字编程,可以单个操作,也可以连续多个操作3)超低功耗操作4)支持段擦除和多段模块擦除2 Flash存储器的分割Msp430 Flash存储器分成多个段。
可对其进行单个字节、字的写入,也可以进行连续多个字、字节的写入操作,但是最小的擦除单位是段。
Flash 存储器被分割成两部分:主存储器和信息存储器,两者在操作上没有什么区别。
两部分的区别在于段的大小和物理地址的不同。
以Msp430F149为例,信息存储器有两个128字节的段,即segmentA和segmentB,主存储器有多个512字节的段。
Msp430F149内部Flash的地址为0x1000H~0xFFFFH,计60K。
信息段SegA的起始地址为0x1080H,信息段SegB 的起始地址为0x1000H。
3 Flash存储器的操作在默认状态下,处于读操作模式。
在读操作模式中,Flash存储器不能被擦除和写入,时序发生器和电压发生被关闭,存储器操作指向ROM区。
Msp430 Flash存储器在系统编程ISP(in-system programmable)不需要额外的外部电压。
CPU能够对Flash直接编程。
Flash存储器的写入/擦除通过BLKWRT、WRT、MERAS、ERASE等位确定。
3.1 擦除Flash存储器各位的缺省值为1,每一位都可以单独编程为0,但只有擦除操作才能将其恢复为1。
擦除操作的最小单位是段。
通过erase和meras位设置可选择3种擦除模式。
ME RA S ERASE擦除模式0 1 段擦除1 0 多段擦除(所有主存储器的段)1 1 整体擦除(LOCKA=0时,擦除所有主存储器和信息存储器的段;主存储器的段只有当LOCKA=0时可以擦除)擦除操作开始于对擦除的地址范围内的任意位置执行一次空写入。
msp430 flash
一、MSP430单片机FLASH存储器模块特点1.8~3.6V工作电压,2.7~3.6V编程电压;擦除/编程次数可达100000次:数据保持时间从10年到100年不等:60KB空间编程时间<5秒:保密熔丝烧断后不可恢复,不能再对JTAG进行任何访问;FLASH编程/擦除时间由内部硬件控制,无任何软件干预;二、FLASH存储器的操作由于FLASH存储器由很多相对独立的段组成,因此可在一个段中运行程序,而对另一个段进行擦除或写入操作。
正在执行编程或擦除等操作的FLASH段是不能被访问的,因为这时该段是与片内地址总线暂时断开的。
对FLASH模块的操作可分为3类:擦除、写入及读出。
而擦除又可分为单段擦除和整个模块擦除;写入可分为字写入、字节写入、字连续写入和字节连续写入1.FLASH擦除操作:对FLASH要写入数据,必须先擦除相应的段,对FLASH存储器的擦除必须是整段地进行,可以一段一段地擦除,也可以多端一起擦除,但不能一个字节或一个字地擦除。
擦除之后各位为1。
擦除操作的顺序如下:选择适当的时钟源和分频因子,为时序发生器提供正确时钟输入如果Lock=1,则将它复位:BUSY标志位,只有当BUSY=0时才可以执行下一步,否则不行如果擦除一段,则设置ERASE=1如果擦除多段,则设置MERAS=1如果擦除整个FLASH,则设置RASE=1,同时MERAS=1对擦除的地址范围内的任意位置作一次空写入,用以启动擦除操作。
在擦除周期选择的时钟源始终有效在擦除周期不修改分频因子在BUSY=1期间不再访问所操作的段电源电压应符合芯片的相应要求对FLASH擦除要做4件事对FLASH控制寄存器写入适当的控制位BUSY位空写一次等待2.FLASH编程操作。
对FLASH编程按如下顺序进行:选择适当的时钟源和分频因子如果Lock=1,则将它复位BUSY标志位,只有当BUSY=0时才可以执行下一步,否则不行如果写入单字或单字节,则将设置WRT=1如果是块写或多字、多字节顺序写入,则将设置WRT=1,BLKWRT=1将数据写入选定地址时启动时序发生器,在时序发生器的控制下完成整个过程块写入可用于在FLASH段中的一个连续的存储区域写入一系列数据。
MSP430Flash读写操作总结
MSP430X14X Flash 读写操作总结开发平台:IAR Embedde d Workben ch、MSP430F149开发板作者:谭贝贝Flash简介Flash分为主存储区和信息存储区,主存储区有8个512byt e的片段,信息存储区有两个128by te的片段。
Flash 默认为读取模式。
在对Flash进行编程或者擦除时不允许读写,如果需要CPU在这期间进行操作,可以把代码段放在RAM中进行。
Flash操作注意事项在读写的过程中电压不能小于2.7V否则擦除和读写的结果将不可预测。
Flash的可操作时钟频率为~257KHZ---~476KHZ。
如果频率不符合要求,则结果不可预测。
在擦除先需要关闭中断和看门狗,在擦除的过程中如果产生了中断,则会在重新使能中断后产生一个中断请求。
Flash 只能从1写为0,不能从从0写为1,所以需要擦除。
可以被擦除的最小模块是片段,tAll Erase = tMass Erase= 5297/fFTG, tSeg Erase = 4819/fFTG。
Flash ERASEMSP430X14X的擦除模式可以从F lash或者RAM中进行。
从Flash中擦除从Flash中擦除的过程中所有的定时都会被Flas h控制,CPU被挂起。
擦除完成后需要一个假写入C PU才能复位。
从Flash擦除时有可能把后面CPU需要执行的代码擦除。
如果发生这样的情况,在擦除后CPU的执行状况将不可预测。
Flash中擦除流程图从RAM中擦除从RAM中擦除时CPU不会被挂起,可以继续执行代码。
必须检测BUS Y位以判断擦除是否结束,如果在擦除的过程中(即BUSY=1时)访问Flash,这是一个违规的访问,ACCVIFG会置位,而擦除的结果也将不可预测。
单片机flash储存结构体的方式
单片机flash储存结构体的方式单片机的Flash存储结构体的方式可以通过以下几种方式实现:
1. 直接存储,将结构体直接存储到Flash中。
这种方式需要考
虑Flash的写入擦除次数,以及Flash的页大小和擦除块大小,避
免频繁写入导致Flash寿命缩短。
2. 分页存储,将结构体分成适当大小的页,然后按页写入Flash。
这样可以减少对Flash的擦除次数,延长Flash的使用寿命。
3. 压缩存储,对结构体进行压缩,然后再存储到Flash中。
这
种方式可以节省Flash的空间,但在读取时需要进行解压缩操作。
4. 文件系统存储,使用文件系统将结构体以文件的形式存储到Flash中,例如FAT文件系统。
这种方式可以方便地管理存储的结
构体数据,但会增加额外的存储空间和读写开销。
无论采用哪种方式,都需要考虑数据的完整性和一致性,以及
对Flash的读写操作进行合理的管理,避免出现数据损坏或者
Flash寿命缩短的情况。
同时,还需要考虑结构体数据的访问方式和频率,选择合适的存储方式来满足系统的需求。
MSP430BSL使用说明
MSP430BSL 使用说明REV 3.0首先感谢您购买了本公司的MSP430开发工具我们将为您提供最完善的售后服务和最全面的技术支持下图是MSP430BSL的产品清单1、MSP430BSL*12、DB9针对孔串口连线*13、10芯扁平连线*14、附有BSL软件的光盘*1一、BSL的介绍什么是BSL(Bootstrap loader)? Bootstrap loader是MSP430FLASH系列单片机独有的一项功能。
在程序空间、RAM之外有1K左右的引导区,用来存放430的BOOTROM文件(这是一个引导ROM,类似网卡上的BOOTROM)。
当外界给芯片提供一种特定的激励时,芯片内的引导程序开始工作,引导外部数据写入片内ROM、RAM区,或者是发送片内数据到外部。
这些都是通过一个软UART来完成的。
如果是FLASH系列的单片机,则FLASH空间包含了ROM和RAM。
这个引导程序是固化在BOOTROM空间内,而且是一个用户不能直接使用和修改的存储空间。
430BSL的主要原理是通过芯片特殊的上电复位后,引导片外代码烧录到片内FLASH中,来完成系统编程的。
我们的MSP430BSL工具使用非常方便,图形化的界面让你通过鼠标就能顺利下载代码,读出内部任何数据。
这里提及的代码是TI专用的430-TXT格式文本,可以通过IAR-EW430的编译器生成。
MSP430BSL的主要特点1、代码下载。
下载任意编译系统提供的标准430-TXT源代码。
2、读出芯片内的程序、信息FLASH等随意指定空间。
目前支持TI推出的MSP430 FLASH全系列芯片,包括一些补丁程序所做的修改,都在REV3.0软件上做了改进。
3、芯片加密后还能通过256BIT密码字校验后下载、升级、读写芯片内容。
对一些产品遭受破坏还需要读出内部数据来说是非常好的一种工具。
其在仪表的软件调校上也有很广泛的应用。
(JTAG接口一般不留在成熟的产品里)4、尺寸小,随身携带。
430单片机的flash断电数据保护程序(已经过试验)
//**************************************************************************** ////// 本程序实现断电数据保护功能,断电可以保存128个数据(仅适用A区),也可以保存256个数据(使用A区和B区)////***************************************************************************** #include <msp430x14x.h>#define uchar unsigned char#define uint unsigned intunsigned int value0;unsigned int value1;unsigned int *Flash_ptr;void write_SegA (unsigned int value0,unsigned int value1);void copy_A2B (void);unsigned int i;void delay(){for(i=0;i<50000;i++);}void main(void){WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗Ini_Lcd();/**************flash的程序***************************************/FCTL2 = FWKEY + FSSEL0 + FN0; // 时钟分频,使flash的时钟频率在257K-476K value0 =0;value1 =0;Flash_ptr = (unsigned int *) 0x1080; // 设置A区的起始地址for (i=0; i<128; i++){value0=*Flash_ptr ; // 从flash当中读出数据value0,value1value1=*(Flash_ptr+1) ;}/***************************************************************/while(1){value0++;value1++;write_SegA(value0,value1); //向flash当中写入数据//写入主程序,value作为一个变量使用}}//******************向flash中写入数据************************************void write_SegA (unsigned int value0, unsigned int value1){unsigned int i;Flash_ptr = (unsigned int *) 0x1080; // 设置指针的起始地址,A区的起始地址是0x1080 FCTL1 = FWKEY + ERASE; // 擦除独立段FCTL3 = FWKEY; // 允许写入*Flash_ptr = 1; // 设置为单字节写入模式FCTL1 = FWKEY + WRT; // Set WRT bit for write operationfor (i=0; i<128; i++) // 连续写入128个数据{*Flash_ptr = value0; // 写数据value0和value1到flash当中*(Flash_ptr+1) = value1;}FCTL1 = FWKEY; // 保护flashFCTL3 = FWKEY + LOCK;}//**************************从A区读取的数据赋值给B区((∩_∩)注意可以向一个区中先写入数据,再读取数据)*****************************************void copy_A2B (void){char *Flash_ptrA;char *Flash_ptrB;unsigned int i;Flash_ptrA = (char *) 0x1080;Flash_ptrB = (char *) 0x1000;FCTL1 = FWKEY + ERASE;FCTL3 = FWKEY;*Flash_ptrB = 0;FCTL1 = FWKEY + WRT;for (i=0; i<128; i++){*Flash_ptrB++ = *Flash_ptrA++; }FCTL1 = FWKEY;FCTL3 = FWKEY + LOCK;}。
第三章 MSP430基本外设7(Flash编程)
FLASH控制寄存器4 (FCTL4)
位 15 14 13 12 11 10 9 8
功能
FRKEY 读密码是96h,写时必须为A5h
位 功能
7
6
5
4
3
2
1
0
LOCKINFO
保留
MRG1
MRG0
保留
VPE
0 边沿0读模式禁止 1 边沿0读模式使能 边沿读0模式。该位使能边沿读0模式。仅仅当从Flash存储区读时,边沿 读0位才是有效的。在存取周期内,边沿模式自动关闭。如果MRG1和MRG0 都置位,则MRG1有效,MRG0被忽略。
3.7 Flash编程
主要内容
• 嵌入式系统中存储器介绍
– 嵌入式系统中常用存储器分类 – Flash 存储器介绍 – RAM 存储器介绍
• MSP430存储器介绍
– Flash 存储器读写操作 – Flash 存储器分段结构 – Flash 存储器寄存器
嵌入式系统中常用存储器分类
存储器类别
RAM 存储器
位 15 14 13 12 11 10 9 8
功能
FRKEY 读密码是96h,写时必须为A5h
位 功能
7 保留
6 LOCKA
5 保留
4 LOCK
3 WAIT
2 ACCVIF
1 KEYV
0 BUSY
锁信息A段。对该位写1能改变该位状态。写0无效。 0 信息A、B、C、D、被解锁。 1 信息A段被写保护。
写入或者擦除期间访问Flash存储器
当BUSY = 1时,从RAM区启动写入或擦除操作,CPU 可能不会在任何Flash 位置进行写操作。否则,将发生非法 访问,ACCVIFG位置位,结果不可预料。 当写操作从Flash存储器内启动时,在写周期完成后( BUSY = 0),CPU将继续取下一指令。 当写操作完成且 BUSY = 0 时,Flash控制器才允许CPU取出操作代码,继续 执行代码。
提高MSP430G 系列单片机的Flash 擦写寿命方法
提高MSP430G 系列单片机的Flash 擦写寿命方法在设计中,许多应用设计都需要用法EEPROM 存储非易失性数据,因为成本缘由,某些在芯片内部并没有集成EEPROM。
G 系列处理器是TI 推出的低成本16 位处理器,在MSP430G 系列单片机中并不具备EEPROM。
为了存储非易失性数据,MSP430G 系列处理器在芯片内部划分出了256 字节的Flash 空间作为信息Flash,可用于存储非易失性数据,但是因为Flash 与EEPROM 在擦写寿命上存在一定差距,所以在实际应用中,这种应用方式并不能够满足全部客户的需求。
本应用笔记介绍了用法代码区域Flash 来模拟EEPROM,通过一定的软件处理算法,可以大大增强数据存储周期的一种办法。
本文给出了实现上述功能的软件流程。
1.嵌入式Flash 存储介质与EEPROM 的主要特性对照电可擦除和编程只读存储器(EEPROM)是在绝大多数嵌入式应用中都会用法到的用于保存非易失性数据的关键器件,用于在程序运行期间保存数据。
Flash 闪存(Flash Memory,简称为"Flash")是一种非易失性( Non-Volatile )存储器,广泛应用于各种嵌入式处理器中,用于存储程序代码。
因为硬件成本缘由,在许多嵌入式处理器中并没有集成 EEPROM 模块,通常我们可以采纳在片内Flash 存储器中保存非易失性数据的应用方式来达到用法要求。
对一些一般的应用场合,这种用法方式可以满足要求。
1.1 写拜访时光因为 EEPROM 和 Flash 的工作特性不同,所以写拜访时光也不相同。
Flash 具有更短的写拜访时光,所以更适用于对存储速度有要求的场合。
1.2 写办法外置EEPROM 和采纳Flash 模拟EEPROM 的最大不同之处在于写的办法。
EEPROM:对 EEPROM 的写操作不需要额外的操作,只需要提供电源供第1页共8页。
课件:第10章 MSP430F5单片机flash
从Flash存储区启动擦除操作
16
在实际使用中,对FLASH的擦除要做4件事: ① 对FLASH控制寄存器写入适当的控制位。 ② 监视BUSY位 ③ 空写一次 ④ 等待
17
10.3.2 Flash存储器的写入
• 写模式由位WRT和BLKWRT选择:
18
• 从Flash存储器启动字/字节写入:
// 空写,启动擦除
FCTL1 = FWKEY + WRT;
// 允许写
for (i=0; i<8; i++)
*Flash_data_ptr++ = data[i];
Flash_int_ptr = (unsigned int *)Flash_data_ptr;
FCTLx的密钥。
读结果是96h,写时必须是A5h,否则引起PUC。
LOCKA Bit6
锁信息A段。对该位写1能改变该
位状态。写0无效。
0
信息A、B、C、D被解锁。
1
信息A段被写保护。
31
• LOCK
Bit4
锁。该位对FLASH的写和擦
除操作进行解锁。该位可以字/字节写的任意时刻置位。
•0
解锁
•1
2
• FLASH存储器在现代嵌入式系统中占有重要 地位,它具有很多重要的优点:掉电后数 据不丢失,数据存储速度快,电可擦除、 在线可编程、价格低廉、可靠性高,由于 FLASH存储器的应用,极大地方便了微控制 器系统的开发和设计,显著地改善了微控 制器市场。MSP430系列单片机各型号均含 有容量不等的FLASH存储器模块。
如果写入高字节口令码错误,则引发PUC信号。小 心操作可避免。
在对FLASH操作期间读FLASH内容,会引发ACCVIFG 状态位的置位,引起NMI中断。小心操作可避免。
MSP430系列Flash存储器C语言环境下的参数保存和擦写技巧
MSP430系列Flash存储器C语言环境下的参数保存和擦写
技巧
李文炜
【期刊名称】《《可编程控制器与工厂自动化(PLC FA)》》
【年(卷),期】2005(000)007
【摘要】本文详细介绍了 TI 公司 MSP430系列 Flash 型单片机内部的 Flash 控制器的结构,以 MSP430F149为例详细举例介绍了如何在 C 编译环境下如何对Flash 存储器的进行在线擦除和编程操作,并且就实际现场的基于裸机的首次参数保存提出了实用建议,并且给出了数组结构参数保存的实际 C 语言例程。
【总页数】4页(P86-89)
【作者】李文炜
【作者单位】杭州师范学院信息工程学院
【正文语种】中文
【中图分类】TP334
【相关文献】
1.基于MSP430单片机的环境参数检测系统设计 [J], 陈中;沈翠凤
2.MSP430微控制器系列讲座(十)软件编程方法及技巧 [J], 雷奥
3.MSP430单片机实用技术讲座第1讲 MSP430单片机系列简介(下) [J], 张俊谟
4.MSP430单片机实用技术讲座(6)第3讲MSP430学习和调试系统的软件环境
(下) [J], 张俊谟
5.MSP430系列C语言环境下的软件设计实用技巧 [J], 李文炜
因版权原因,仅展示原文概要,查看原文内容请购买。
MSP430单片机对片内FLASH的读写操作程序
MSP430单片机对片内FLASH的读写操作程序// 参数: wAddr 为地址 , 范围 0x1000~0xFFFFvoid ReadFlash(U16 wAddr,U8 *bBuf,U8 bLen){while (bLen--)*bBuf++=*(U8 *)wAddr++;return;}void WriteFlash(U16 wAddr,U8 *bBuf,U8 bLen){U8 reg1,reg2;reg1=_BIC_SR(GIE);reg2=IE1;IE1=0; // 保护原来中断标志,并关闭有关中断。
// 写一个字节数据到指定flash地址while (bLen--){while (FCTL3&BUSY); // 等待以前FLASH操作完成FCTL3 = FWKEY;FCTL1 =FWKEY+WRT; // 发送写flash命令*(U8 *)wAddr++=*bBuf // 写数据到指定的flash地址while(FCTL3&BUSY); // 等待写操作完成FCTL1 = FWKEY;FCTL3 = FWKEY+LOCK; // 对FLASH内容进行加锁保护}if(reg1&GIE) _BIS_SR(GIE); // 恢复中断标志IE1=reg2;return;}void EraseSectorFlash(U16 wAddr){U8 reg1,reg2;reg1=_BIC_SR(GIE);reg2=IE1; // 保护有关中断标志IE1=0; // 关闭IE1中断while(FCTL3&BUSY); // 等待FLASH编程结束FCTL3 = FWKEY; // 为了准备编程而初始化FLASH控制寄存器3FCTL1 = FWKEY+ERASE; // 发送FLASH擦除命令*(U8 *)wAddr=0; // 启动擦除操作while(FCTL3&BUSY); // 等待擦除操作完成FCTL1 = FWKEY; // 撤销任何对FLASH的操作命令FCTL3 = FWKEY+LOCK; // 对FLASH内容进行加锁保护if(reg1&GIE) _BIS_SR(GIE); // 恢复中断标志IE1=reg2;return;}。
MSP430F5438扩展型单片机FLASH应用
5、汇编指令 当操作数或数据长度超过 16 位时,要使用 MSP430X 指令,其它情况下完全与 MSP430 指令兼容。扩展指令如 MOVX.(W/B/A),RRAX.(W/B/A),PUSHX, POPX,SWPBX 等。当调用 64K 以外的子程序时不能再用 BR,CALL 等,也要使用扩展指令 BRA,CALLA 等。限于篇幅,不再一一例举。
在 Project-Option-Linker-Config-Linker command file 中的 Override default 前打勾选中,在浏览中找到 lnkxms430F5438.xcl 添加上即可。对程序存储修 改如下: // --------------------------------------------------------// Code -P(CODE)CODE=5C00-FF79,10000-45BFF -P(CODE)DELAY=20100-201FF -P(CODE)TAISR=26182-26FFF
WDTCTL = WDTPW + WDTHOLD; P1DIR |= 0XFF ; P1OUT = 0; TA0CTL = TASSEL_1 + TACLR; TA0CCR0 = 10000 ; TA0CTL |= MC0; TA0CCTL0 = CCIE ; e(1) {
_BIS_SR(LPM3_bits+GIE); } } #pragma vector = TIMER0_A0_VECTOR __interrupt void timea(void)@"TAISR" { P1OUT ^= BIT0 ;//P1.0 ---LED delay(50000) ; } void delay(unsigned int del)@"DELAY" { while(del--); } __root void stop(void)@"TT" { while(1); } 编译器会把编译后的 TA 中断服务程序代码放在 0X26182 开始的地址里,如果发生中断,PC 指针不会跳到 0X26182 去执行程序,而是跳转到 0X6182 去执行 了 while(1)。 原因:因为 430 每个中断向量占用的是一个字(16 位),发生中断的时候压入 PC 的地址最多也就是一个 16 位的地址,如果中断服务程序定位在 64K 之外, 发生中断的时候它只能把低 16 位传递给 PC,以至程序跑飞,所以中断服务程序入口必须在 64K 之内。 如果把本程序把__interrupt void timea(void)@"TAISR" 中的@"TAISR" 去掉,delay(void) 放在了 0x20100-0x201ff 程序空间中,在中断程序中调用 delay() 函数时,指针指向 0x20100,接 P1.0 口的 LED 开始闪烁。 那么这时候为什么 PC 指针又能指向大于 64K 的 FLASH 呢? 这种情况下,实际上在汇编上是执行了 “CALLA #delay”。CALLA 是扩展指令,可以调用 64K 之外的子函数。于是我们可以得出这样一个结论:在大 FLASH 的 430 单片机内,可以调用定位在大于 64K 之外的子函数,但是中断函数入口则必须定位再 64K 之内。
MSP430F149 FLASH存储模块
MSP430F149的存储器结构及FLASH读写1 概述1.1 FLASH特点写操作只能将1改写为0,不能将0改写成1。
FLASH擦除后所有单元变为1,擦除操作只能针对整个段。
FLASH在擦除前不能被改写。
1.2 MSP430F149存储器编址方式MSP430F149的ROM为60K+256B的FLASH,RAM为2K。
MSP430存储器采用冯诺依曼结构,RAM和ROM合在一起编址。
MSP430F149内部集成有FLASH控制器,可以简化对FLASH的操作。
64K的寻址空间分为RAM、FLASH。
RAM分两块:1、寄存器(0000H-01FFH),存放特殊寄存器、设备寄存器、变量与堆栈。
2、数据RAM(01FFH-),存放各种变量、中间结果、堆栈。
FLASH分两块:1、主FLASH 一般用于存放程序代码。
2、信息FLASH(InfoFlash)用作掉电后保存少量数据。
分为InfoA(0X1080-0X10FF)和InfoB(0X1000-0X1080),每段各128B。
1.3 操作三种操作:读取、擦除(只能针对段擦除)、写入(可以写入单个字节)。
2使用方法2.1 程序架构读取FLASH方法和读取RAM方法相同。
写和擦除FLASH要进行如下配置:配置寄存器制定指针地址写数据/复制数据配置寄存器2.2 参数配置主要配置三个寄存器FCTL1,FCTL2,FCTL3。
1、配置FLASH控制器时钟。
时钟要求控制在250-470Khz之间。
FCTL2 = FWKEY + FSSEL0 + FN0; //2分频2、用指针指向地址Unsigned char *ptr= (unsigned char *) 0x1080;3、进入写模式或擦除模式FCTL1=FWKEY+WRT;或FCTL1=FWKEY+ERASE4、清除锁定位FCTL3=FWKEY;5、写数据*ptr=0x30;或擦除*ptr=0;6、退出写状态,恢复锁存FCTL1=FWKEY;FCTL3=FWKEY+LOCK;2.3 说明上电FLASH默认状态是读。
MSP430-Flash读写操作总结
MSP430X14X Flash 读写操作总结开发平台:IAR Embedded Workbench、MSP430F149开发板作者:谭贝贝Flash简介Flash分为主存储区和信息存储区,主存储区有8个512byte的片段,信息存储区有两个128byte的片段。
Flash 默认为读取模式。
在对Flash进行编程或者擦除时不允许读写,如果需要CPU在这期间进行操作,可以把代码段放在RAM中进行。
Flash操作注意事项在读写的过程中电压不能小于2.7V否则擦除和读写的结果将不可预测。
Flash的可操作时钟频率为~257KHZ---~476KHZ。
如果频率不符合要求,则结果不可预测。
在擦除先需要关闭中断和看门狗,在擦除的过程中如果产生了中断,则会在重新使能中断后产生一个中断请求。
Flash 只能从1写为0,不能从从0写为1,所以需要擦除。
可以被擦除的最小模块是片段,tAll Erase = tMassErase = 5297/fFTG, tSeg Erase = 4819/fFTG。
Flash ERASEMSP430X14X的擦除模式可以从Flash或者RAM中进行。
从Flash中擦除从Flash中擦除的过程中所有的定时都会被Flash控制,CPU被挂起。
擦除完成后需要一个假写入CPU才能复位。
从Flash擦除时有可能把后面CPU需要执行的代码擦除。
如果发生这样的情况,在擦除后CPU的执行状况将不可预测。
Flash中擦除流程图从RAM中擦除从RAM中擦除时CPU不会被挂起,可以继续执行代码。
必须检测BUSY位以判断擦除是否结束,如果在擦除的过程中(即BUSY=1时)访问Flash,这是一个违规的访问,ACCVIFG会置位,而擦除的结果也将不可预测。
RAM中擦除流程图Flash WriteMSP430X14X有两种写入模式,分为段写入(byte/word write),和块写入(Block Write),块写入要快得多,但是操作麻烦,在擦除的过程中不能有一个Flash word(low + high byte),则会发生损坏。
如何用MSP430单片机flash存储数据
如何用MSP430单片机flash存储数据MSP430 FLASH型单片机的FLASH存储器模块根据不同的容量分为若干段,其中信息存储器SegmengA及SegmentB各有128字节,其他段有512字节。
SegmentB的地址是:0x01000h 到0x107F,SegmentA的地址是:0x01080h到0x010FFh。
其他段的地址根据容量不同,从0xFFFFh开始,每512字节为一段进行分配。
FLASH存储器写入数据时,每一位只能由“1”变成“0”,不能由“0”变成“1“,因此,当我们有数据要保存到FLASH存储器时,要先对目标段进行整段擦除操作,擦除操作使的对应段FLASH存储器变成全“1”。
下面是擦除FLASH段的子程序,配置好必要的寄存器后,向段中任意地址写入数据,及擦除一段。
void flash_clr(int *ptr){_DINT(); //关中断FCTL3 = 0x0A500; //* Lock = 0 开锁FCTL1 = 0x0A502; //* Erase = 1 使能擦除*((int *) ptr) = 0; //* 擦除段}FLASH存储器可以按字节写入,也可以按字写入。
void flash_write_int8(int8_t *ptr, int8_t value) // 字节写入{_DINT();FCTL3 = 0x0A500; // Lock = 0 开锁FCTL1 = 0x0A540; // Write = 1使能写入*((int8_t *) ptr) = value; // 写入数据}void flash_write_int16(int16_t *ptr, int16_t value) // 字写入{_DINT();FCTL3 = 0x0A500; /* Lock = 0 */FCTL1 = 0x0A540; /* Write = 1 */*((int16_t *) ptr) = value; /* Program the flash */}// FLASH存储器可以连续写入按字节写入指定的数量的数据void flash_memcpy(char *ptr, char *from, int len){_DINT();FCTL3 = 0x0A500; /* Lock = 0 */FCTL1 = 0x0A540; /* Write = 1 */while (len) { *ptr++ = *from++; len--; } } 在我们的应用程序中可以将要保存的数据放在一个自定义的结构中,例如:typedef struct Setup{float gain_ch0; // 0通道增益float gain_ch1; // 1通道增益float gain_ch2; // 2通道增益char init_flag; //初始化标记,恒为0xAA;}SETUP;我们定义了一个SETUP结构,存放三个AD通道的增益,以及其他要掉电保存的信息,init_flag的作用是标志FLASH的参数是否已被正确初始化,当我们设置了FLASH参数后,将init_flag置一个固定值,例如设为0xAAh,在程序开始运行时,检查init_flag,当init_flag的值为0xAAh时,表明参数已被初始化。
单片机原理及应用_第八讲_MSP430单片机的比较器和Flash存储器实验报告
CBCTL0 |= CBIPEN + CBIPSEL_6;// Enable V+, input channel CB6
CBCTL1 |= CBPWRMD_1;// normal power mode
CBCTL2 |= CBRSEL;// VREF is applied to -terminal
可输出到TA的捕获输入
软件控制端口输入缓冲
具有中断能力
可选的参考电压发生器、电压磁滞发生器
参考电压输入可选择共用参考电压
超低功耗的比较模式
低功耗模式支持中断驱动测量系统
应用:
比较器B是为精确的比较测量而设计的,如电池电压监
测、产生外部模拟信号、测量电流、电容和电阻,结合其
他模块还可实现精确的A/D模数转换功能。
思考题
1、MSP430系列单片机FLASH存储器的主要特点是什么?
答:在对Flash存储器进行写操作时,可以以字节或字为单位进行写操作,但对Flash存储器进行擦除操作时,必须以段为单位进行擦除。换句话说,即使要改变存储器中某个地址处的字节内容,也必须首先将该字节所在的段先擦除,然后再将该地址的字节内容写入,由于擦除操作会擦掉整段的内容,所以建议将有用的内容先保存到RAM中,然后再进行擦除操作。
#pragmavector=COMP_B_VECTOR
__interruptvoidComp_B_ISR(void)
{
CBCTL1 ^= CBIES;// Toggles interrupt edge
CBINT &= ~CBIFG;// Clear Interrupt flag
P4OUT ^= 0x02;//ToggleP1.0
第5章 MSP430单片机片内外设及其应用[5]_flash
单字或单字节写入控制时序如图所示:
31
块写入的控制时序
32
3.FLASH错误操作及其处理
在写入FLASH控制寄存器控制参数时,可引发以下错误: 如果写入高字节口令码错误,则引发PUC信号。小心操作可避免 。 在对FLASH操作期间读FLASH内容,会引发ACCVIFG状态位的 置位,引起NMI中断。小心操作可避免。 因为在对FLASH操作期间,需要较长的时间,如果这时看门狗定 时器的数据将近尾声,则看门狗定时器溢出。建议用户程序在 进行FLASH操作之前先停掉看门狗定时器,等操作结束之后再 打开。 所有的FLASH类型的MSP430器件的0段都包含有中断向量等重 要的程序代码,如果对其进行擦除操作,将会引起严重的后果 。建议用户程序在进行FLASH操作之前,先将该段的重要数据 保存到RAM中或写入到其它未用的段中,等待该段操作完毕再 还原那些数据;同时一定不要使正在执行的程序处在正要被擦 除的段中;也不要在FLASH操作期间允许中断的发生。
22
擦除操作只有在满足下列条件时才能正确完成: ① 在擦除周期,选择的时钟源时钟有效。 ② 在擦除周期,不修改分频因子,如果时钟源改变 或分频因子改变,容易引起FLASH擦除时序的失 控。 ③ 在BUSY=1期间不再访问所操作的段,包括读 取,写入和再一次的擦除。如果发生这些操作, 会使KEYV置位,并产生NMI中断。 ④ 电源电压应符合芯片的相应要求,只允许有较小 的容差。电压的跌落容易使电压超出正常的范围 ,而不能完成操作。
15
EMEX 紧急退出位。用于FLASH存储器擦除或编程失控情 况。 0 无作用 1 立即停止对FLASH存储器的操作,关闭内部控制电 路,电流消耗降至活动模式水平,FCTL1中各位复位。 该位读出总为0.
MSP430F5438学习笔记 FLASH操作编程
1. // 时钟默认情况 2. // FLL 时钟 3. // 辅助时钟 4. // 主系统时钟 5. // 子系统时钟 FLL 选择 XT1 ACLK 选择 XT1 MCLK 选择 DCOCLKDIV SMCLK 选择 DCOCLKDIV 32768Hz 8000000Hz 8000000Hz
6. // UART 时钟选择 ACLK 7. // 低频波特率产生 9600-8-N-1 8. #include <msp430.h> 9. #include <stdio.h> 10. #include <stdint.h> 11. 12. void clock_config(void); 13. void select_xt1(void); 14. void dco_config(void); 15. void uart_config(void); 16. 17. void flash_writebuf(uint8_t *flash_ptr,uint8_t *buffer,uint 8_t len);
图 1 运行结果
4.注意事项
在下载程序是仿真器可以设置擦除 FLASH 的范围, 可以只擦除主 FLASH (可 以理解为程序部分),也可以擦除主 FLAHS 和 INFO FLASH 部分,这些设 置具体如何使用要看具体情况。如果需要 INFO FLASH 内的所有内容复位, 则可以选择 Erase main and Information memory —— 擦除主 FLASH 和 INFO FLASH。
UCSCTL1 = DCORSEL_5; UCSCTL2 = FLLD_1 + 243;
// DCO 最大频率为 16MHz // 设置 DCO 频率为 8MHz
内部FALSH的操作
//// 注意:修改flash中的内容必须首先执行擦除操作,// 因为对FLASH的操作只能将1写成0,而不能将0写成1只有擦除才能将0写回1 // 擦除操作至少将擦除1个段//// 如果使用其它型号的单片机,只需将头文件改为相应的<msp430xx.h>;// 并在Option的Target中的device改为相应的cpu即可。
//// 硬件连接:如下图// MSP430F13x// -----------------// /|\| XIN|-// | | |// --|RST XOUT|-// | |// | P5.0|-->LED_DOUT// | P5.2|-->LED_CLK// | P5.4|-->LED_LATCH//// 时间:2007年12月// //// 硬件电路:MSP430F135核心实验板-I型+ TY-DIS1(8位数码管显示模块)// 硬件连接://// 调试器:MSP430FET全系列JTAG仿真器// 调试软件: IAR Embedded Workbench Version: 3.41A 编译//************************************************************************* *****#include <msp430x13x.h>////预定义函数//////////////////////////////////////////////////////////////////void LED_595(char SMG1,char SMG2,char SMG3,char SMG4);//4位LED数码管显示子程序void Led_out(unsigned char X);//74HC595串行输出子程序void A16(unsigned int dd);// 16进制到4位10进制转换const unsigned char LED_0_F[];//LED数码管段码转换表void Flash_clr( int *Data_ptr );void Flash_ww( int *Data_ptr, int word );void Flash_wb( char *Data_ptr, char byte );////变量定义//////////////////////////////////////////////////////////////////// unsigned char Buffer[4];void main(void){char *point,*readaa; // 定义2个指针,分别指向flash和变量aachar aa;//初始化IO口用于显示P5DIR =0; //P5口全部设为输入口P5SEL =0; //将P5口所有的管脚设置为一般I/O口P5DIR |= BIT0; //将P5.0 P5.2 P5.4设置为输出方向P5DIR |= BIT2;P5DIR |= BIT4;WDTCTL = WDTPW + WDTHOLD; //停止watchdog_DINT(); //对FLASH操作之前必须关闭中断readaa=&aa; //读取变量aa的地址;//在watch观察窗中可以通过readaa看到aa所在的地址及内容point=(char*)0xcb10; //设置要读取的flash地址为“0xcb10”//在watch观察窗中可以通过point看到0xcb10所在地址的内容*readaa=*point; //将flash数据读入aaaa=*point; //另一种将flash数据读入aa的方法aa++;Flash_clr((int*)0xcb00); //擦除0xcb00所在段,只有擦除才能将0写回1 Flash_wb((char*)0xcb10,aa); //向0xcb10写入新的aa(字节)while(1){A16(aa);LED_595(Buffer[0],Buffer[1],Buffer[2],Buffer[3]);}}//***FLASH操作类函数集********************************************************** //-----------------------------------------------------------------// Flash_wb//-----------------------------------------------------------------// 将1个字节(8 bit)写入到flash memory中void Flash_wb( char *Data_ptr, char byte ){FCTL3 = 0x0A500; /* Lock = 0 */FCTL1 = 0x0A540; /* WRT = 1 */*Data_ptr=byte; /* program Flash word */FCTL1 = 0x0A500; /* WRT = 0 */FCTL3 = 0x0A510; /* Lock = 1 */}//-----------------------------------------------------------------// Flash_ww//-----------------------------------------------------------------// 将1个字节(16 bits)写入到flash memory中void Flash_ww( int *Data_ptr, int word ){FCTL3 = 0x0A500; /* Lock = 0 */FCTL1 = 0x0A540; /* WRT = 1 */*Data_ptr=word; /* program Flash word */FCTL1 = 0x0A500; /* WRT = 0 */FCTL3 = 0x0A510; /* Lock = 1 */}//-----------------------------------------------------------------// Flash_clr//-----------------------------------------------------------------// 擦除1个段的flash memoryvoid Flash_clr( int *Data_ptr ){FCTL3 = 0x0A500; /* Lock = 0 */FCTL1 = 0x0A502; /* ERASE = 1 */*Data_ptr=0; /* erase Flash segment */FCTL1 = 0x0A500; /* ERASE = 0 */FCTL3 = 0x0A510; /* Lock = 1 */}//***显示类函数集*************************************************************** //------------------------------------------------------// 4位LED数码管显示子程序//// 人口参数:SMG1,SMG2,SMG3,SMG4——待显示的数据//void LED_595(char SMG1,char SMG2,char SMG3,char SMG4){char z;//最高位(最左侧)LED数码管显示---------------------z = LED_0_F[SMG1];Led_out(z); //段码输出z = 0xFE; //位码Led_out(z); //位码输出P5OUT &=~(BIT4); //显示输出P5OUT |=BIT4;//次高位(左数第2个)LED数码管显示---------------------z = LED_0_F[SMG2];Led_out(z); //段码输出z = 0xFD; //位码Led_out(z); //位码输出P5OUT &=~(BIT4); //显示输出P5OUT |=BIT4;//次低位(左数第3位)LED数码管显示---------------------z = LED_0_F[SMG3];Led_out(z); //段码输出z = 0xFB; //位码Led_out(z); //位码输出P5OUT &=~(BIT4); //显示输出P5OUT |=BIT4;//最低位(左数第4位)LED数码管显示---------------------z = LED_0_F[SMG4];Led_out(z); //段码输出z = 0xF7; //位码Led_out(z); //位码输出P5OUT &=~(BIT4); //显示输出P5OUT |=BIT4;}//------------------------------------------------------// 用于74HC595的LED串行移位子程序//// 人口参数:X——待输出的数据//。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如何用MSP430单片机flash存储数据
MSP430 FLASH型单片机的FLASH存储器模块根据不同的容量分为若干段,其中信息存储器SegmengA及SegmentB各有128字节,其他段有512字节。
SegmentB的地址是:0x01000h 到0x107F,SegmentA的地址是:0x01080h到0x010FFh。
其他段的地址根据容量不同,从0xFFFFh开始,每512字节为一段进行分配。
FLASH存储器写入数据时,每一位只能由“1”变成“0”,不能由“0”变成“1“,因此,当我们有数据要保存到FLASH存储器时,要先对目标段进行整段擦除操作,擦除操作使的对应段FLASH存储器变成全“1”。
下面是擦除FLASH段的子程序,配置好必要的寄存器后,向段中任意地址写入数据,及擦除一段。
void flash_clr(int *ptr)
{
_DINT(); //关中断
FCTL3 = 0x0A500; //* Lock = 0 开锁
FCTL1 = 0x0A502; //* Erase = 1 使能擦除
*((int *) ptr) = 0; //* 擦除段
}
FLASH存储器可以按字节写入,也可以按字写入。
void flash_write_int8(int8_t *ptr, int8_t value) // 字节写入
{
_DINT();
FCTL3 = 0x0A500; // Lock = 0 开锁
FCTL1 = 0x0A540; // Write = 1使能写入
*((int8_t *) ptr) = value; // 写入数据
}
void flash_write_int16(int16_t *ptr, int16_t value) // 字写入
{
_DINT();
FCTL3 = 0x0A500; /* Lock = 0 */
FCTL1 = 0x0A540; /* Write = 1 */
*((int16_t *) ptr) = value; /* Program the flash */
}
// FLASH存储器可以连续写入按字节写入指定的数量的数据
void flash_memcpy(char *ptr, char *from, int len)
{
_DINT();
FCTL3 = 0x0A500; /* Lock = 0 */
FCTL1 = 0x0A540; /* Write = 1 */
while (len) { *ptr++ = *from++; len--; } } 在我们的应用程序中可以将要保存的数据放在一个自定义的结构中,例如:
typedef struct Setup
{
float gain_ch0; // 0通道增益
float gain_ch1; // 1通道增益
float gain_ch2; // 2通道增益
char init_flag; //初始化标记,恒为0xAA;
}SETUP;
我们定义了一个SETUP结构,存放三个AD通道的增益,以及其他要掉电保存的信息,init_flag的作用是标志FLASH的参数是否已被正确初始化,当我们设置了FLASH参数后,将init_flag置一个固定值,例如设为0xAAh,在程序开始运行时,检查init_flag,当init_flag的值为0xAAh时,表明参数已被初始化。
使用FLASH参数:在程序中定义一个SETUP类型的指针变量,通过这个指针访问FLASH 中的参数。
例如:
#define SegmentA 0x1080
float temp;
SETUP *p_setup_flash = (SETUP *) SegmentA
if(p_setup_flash-> init_flag == 0xAA)
{
temp = p_setup_flash->gain_ch0;
}
修改FLASH信息:由于FLASH不能象RAM一样直接修改,可以将FLASH信息拷贝到RAM 中,修改相应参数后,重新保存到FLASH存储器中,之前要先擦除FLASH存储区。
例如:
SETUP *p_setup;
SETUP buf; // 临时变量
p_setup = (SETUP *) SegmentA // 指向FLASH
memcpy((char *) buf, (char *) p_setup_flash, sizeof(SETUP)); // 拷贝到RAM
p_setup = &buf; // 指向RAM
p_setup-> gain_ch0 = 1.02; // 修改参数
flash_memcpy((char *) p_setup_flash, (char *) buf, sizeof(SETUP)); // 拷贝到FLASH。