受朋友之托,今天第一次给大家发帖子, 把珍藏的成年老窖, 让大家尝尝, 下面是我珍藏多年的代码,我自认为有价值, 如果对你有点点帮助,请个我回个帖子.
我们用的MSP430时, 内部有几十个字节information memory 可以当EEPROM来用, 无需再外扩EEPROM芯片, 用量保存一下系数的掉电保存的数据. 我一直用这个, 很好用.
特别说明:
1.说明我用的是IAR编译器, 在IAR上一定能通过
2. 利用information memory 作为EEPROM 掉电保存数据,这是这段程序第一个亮点;
3. 写information memory 必须在RAM中运行程序. 将程序从flash 跑到RAM中运行, 很有意思. 这是第二个亮点.
- #include "MSP430x16x.h"
- #include "string.h"
- #include"stdlib.h"
- #include"flash.h"
- /************************************************************************************
- ** 函数名称: flashWrite
- ** 功能描述: 在MSP430flash中写数据
- **
- ** 输 入: td:写入地址, sd:源数据指针, size:写入字节数
- ** 输 出: 无
- ** 返 回 值: 返回需要发送给其他任务处理的数据块的指针。
- ** 全局变量:
- ** 调用模块:
- ** 作 者: 陈文浩
- ** 日 期: 2010年07月12日
- ************************************************************************************/
- void flashWrite(unsigned char * td, unsigned char *sd, unsigned char size)
- {
- typedef void(*funp)(unsigned char*,unsigned char *, unsigned char); //定义函数指针类型
- funp FLASHBLK;
- char ramcode[100]; //ram内程序及数组地址指针
- _DINT();
- //ramcode=(char *)malloc(sizeof(char)*100); //为放入内存的子程分配空间(需先将heap值设为180)
- FLASHBLK = flashWriteBlock; //函数指针赋值
- memcpy(ramcode,(char *)FLASHBLK,100); //将块写子程放入ram中已分配空间
- FLASHBLK=*(funp)ramcode; //将函数指针指向ram中的块写子程
- flashErase(td); //段擦
- (FLASHBLK)(td,sd, size); //块写(调用的是ram中的块写子程)
- //free(ramcode); //释放空间
- _EINT(); //开放中断
- }
- void flashWriteBlock(unsigned char * td,unsigned char *sd, unsigned char size)
- {
- int i;
- while((FCTL3&BUSY)!=0x00); //检测busy位
- FCTL2=FWKEY+FSSEL_1+20; //flash模块时钟源为MCLK 分频2
- FCTL3=FWKEY; //解锁
- FCTL1=FWKEY+BLKWRT+WRT; //块写
- for(i=0;i
- {
- *td++=*sd++; //写入
- while((FCTL3&WAIT)==0); //检测wait位 是否写入该字
- }
- FCTL1=FWKEY; //BLKWRT WRT位复位
- while((FCTL3&BUSY)!=0x00); //检测BUSY位
- FCTL3=FWKEY+LOCK; //锁定
- }
- /*******************************************************************************/
- /* 段擦除子程序 */
- /*******************************************************************************/
- void flashErase(unsigned char *td)
- {
- FCTL2=FWKEY+FSSEL_1+10; //flash模块时钟源位MCLK 分频2
- FCTL3=FWKEY; //解锁
- FCTL1=FWKEY+ERASE; //段擦除
- *td=0; //在欲进行操作的段中空写,启动擦除操作
- FCTL3=FWKEY+LOCK; //锁定
- }
- //功能:FLASH操作 BYTE数据写入
- //编程时钟:257KHZ~476KHZ
- void flashWriteByte(unsigned char * pdata, unsigned char data)
- {
- //WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
- _DINT(); //关闭总中断
- FCTL2 = FWKEY+FSSEL1+12; //3686400/300K=12
- FCTL3 = FWKEY; //LOCK=0;
- FCTL1=FWKEY+WRT; //WRT=1;
- *pdata = data;
- FCTL3 = FWKEY+LOCK; //
- //开通看门狗
- _EINT(); //开放中断
- }
- void flashWriteWord(unsigned short * pdata, unsigned short data)
- {
- //WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
- _DINT(); //关闭总中断
- FCTL2 = FWKEY+FSSEL1+12;
- FCTL3 = FWKEY; //LOCK=0;
- FCTL1=FWKEY+WRT; //WRT=1;
- *pdata = data;
- FCTL3 = FWKEY+LOCK; //
- //开通看门狗
- _EINT(); //开放中断
补充一点,部分MSP430中A区中存有部分芯片调校数据,如果需要利用A区,需要仔细看一下DATASHEET.原文:http://www.deyisupport.com/question_answer/microcontrollers/msp430/f/55/t/30948.aspx