MSP430G2553 flash操作例子

2018-07-11 21:11:01编辑:什么鱼 关键字:MSP430G2553  flash操作

/* 实际适用于MSP430x2xx系列单片机,包含以下10个常用功能函数: 

(1)初始化。Flash_Init(unsigned char Div,unsigned char Seg ):依据SMCLK频率计算设定Flash的时

钟的分频系数,靠Seg段号码确定计划操作的段起始地址。 

(2)整段擦除。Flash_Erase():段擦除函数。 

(3)读字节。Flash_ReadChar(unsigned int Addr):读取偏移地址Addr位置1个字节的数据。 

(4)读字。Flash_ReadWord(unsigned int Addr):读取偏移地址Addr位置1个字的数据。 

(5)读一串字节到RAM数组。Flash_ReadSeg(unsigned int Addr, unsigned int SegSize,char * 

Array):读取起始偏移地址为Addr,长度SegSize个字节数据到RAM的Array数组。 

(6)直接写1个字节。Flash_Direct_WriteChar(unsigned int Addr):直接写偏移地址Addr位置1个字节

的数据。 

(7)直接写1个字。Flash_Direct_WriteWord(unsigned int Addr):直接写偏移地址Addr位置1个字的数

据。 

(8)备份后写1字节。Flash_Bak_WriteChar(unsigned int Addr):先备份段内其他数据,擦写后,在偏

移地址Addr位置写1个字节的数据,再还原段内其他数据。(仅限信息flash段,使用RAM备份) 

(9)备份后写1个字。Flash_Bak_WriteWord(unsigned int Addr):先备份段内其他数据,擦写后,在偏

移地址Addr位置写1个字的数据,再还原段内其他数据。(仅限信息flash段,使用RAM备份)。 

(10)读SegA专用函数。Flash_SegA_ReadChar(unsigned int Addr):读取SegA段偏移地址Addr位置1

个字节的数据。 

说明:  1、块写函数需要在RAM中调用函数指针来使用,本库函数未涉及 

        2、其他长字节的数据类型读写需使用结构体,本库函数未涉及 

        3、所有函数均针对无符号整型数据,如需使用有符号整型,需修改函数 

        4、对InfoA段单独处理,只有读字节函数Flash_SegA_ReadChar(),不提供擦写函数。 

        5、其他函数的段操作首地址SegAddr被Flash_Init()函数“限定”,不易发生误写 */ 


#include   "MSP430G2553.h" 

unsigned  int SegAddr=0;                        //全局变量 

unsigned  int SegPre=0;                         //全局变量  当前信息段 

/******************************************************************************************************  

* 名     称:Flash_Init() 

* 功       能:对Flash时钟进行初始化设置 

* 入口参数:Div:根据SMCLK频率计算的所需分频值,可设定为1-64 

*           选择原则: SMCLK分频后,落在257kHz~476kHz

*        Seg:段号,可设为"0"-"31"或”"A"、"B"、"C"、"D"。 

* 出口参数:1:配置成功 

*           0:配置失败 

* 说     明:操作Flash其他函数前,需要调用该初始化函数设置时钟分频和待操作段首地址。 

*            其他函数中均不出现绝对地址,防止误操作。 

* 范     例:  Flash_Init(3,'B' ) 3分频、对Info B段操作 

******************************************************************************************************/ 

unsigned char Flash_Init(unsigned  char Div,unsigned  char Seg ) 

  //-----设置Flash的时钟和分频,分频为恰好为最低位,直接用Div-1即可----- 

  if(Div<1) Div=1; 

  if(Div>64) Div=64; 

  FCTL2 = FWKEY + FSSEL_2 + Div-1;    //  默认使用SMCLK,分频系数参数传入 

  //-----操作对象为主Flash段的情况,可通过512的倍数设置段起始地址----- 

  SegPre = Seg;            //获取当前段 

  if (Seg <= 31)             //判断是否处于主Flash段 

    { 

    SegAddr=0xFFFF-(Seg+1)*512+1;         //计算段起始地址 

         return(1);                   //赋值成功后即可退出并返回成功标志”1“ 

    } 

  //-----操作对象为信息Flash段的情况,穷举即可----- 

  switch(Seg)                //判断是否处于信息Flash段 

  { 

  case  'A':  case'a':    SegAddr=0x10C0; break; 

  case  'B':  case'b':    SegAddr=0x1080; break; 

  case  'C':  case'c':    SegAddr=0x1040; break; 

  case  'D':  case'd':    SegAddr=0x1000; break; 

  default:    SegAddr=0x20FF;  return(0);       //0x20FF地址为空白区,保护Flash 

  } 

  return(1); 

/******************************************************************************************************  

* 名    称:Flash_Erase() 

* 功    能:擦除Flash的一个数据块,擦写段由初始化函数 Flash_Init()的SegAddr变量决定 

* 入口参数:无 

* 出口参数:无 

* 说    明:函数中给出了擦除InfoFlashA段的操作代码(已注释掉了),但不建议初学者使用。 

* 范    例:无 

******************************************************************************************************/ 

void Flash_Erase() 

   unsigned char  *Ptr_SegAddr;                     //Segment  pointer 

   Ptr_SegAddr = (unsigned char *)SegAddr;        //Initialize Flash  pointer 

   FCTL1 = FWKEY + ERASE;                       //段擦除模式 

   FCTL3 = FWKEY;                                  //解锁 

   //FCTL3 = FWKEY+LOCKA;                     //对InfoFlashA也解锁 

   _DINT(); 

   *Ptr_SegAddr = 0;                              //擦除待操作段 

   while(FCTL3&BUSY);                           //Busy 

   _EINT(); 

   FCTL1 = FWKEY;                                //取消擦模式 

   FCTL3 = FWKEY+LOCK;                          //上锁 

// FCTL3 = FWKEY+LOCK+LOCKA;              //对InfoFlashA也上锁 

/******************************************************************************************************  

* 名    称:Flash_ReadChar() 

* 功    能:从Flash中读取一个字节 

* 入口参数:Addr:存放数据的偏移地址 

* 出口参数:Data:读回的数据;当偏移溢出时返回0 

* 说    明:无 

* 范    例:无 

******************************************************************************************************/ 

unsigned char Flash_ReadChar  (unsigned  int Addr) 

   unsigned char Data=0; 

   unsigned  int *Ptr_SegAddr,temp=0;                       //Segment  pointer 

   //-----  段范围限定。为了内存管理安全,只允许本段操作----- 

   if((SegPre<=31&&Addr>=512) ||(SegPre>31&&Addr>=64) ) 

     return 0; 

   temp =SegAddr+Addr; 

   Ptr_SegAddr =(void*)temp;                     //initialize Flash  pointer 

   Data=*(Ptr_SegAddr); 

   return(Data); 

/******************************************************************************************************  

* 名    称:Flash_ReadWord() 

* 功    能:从FlashROM读回一个整型变量,地址应为偶数 

* 入口参数:Addr:存放数据的偏移地址,仍按字节计算,需为偶数 

* 出口参数:Data:读回的整型变量值  ;当偏移溢出时返回0 

* 说    明:无 

* 范    例:无 

******************************************************************************************************/ 

unsigned  int Flash_ReadWord (unsigned  int Addr) 

   unsigned  int *Ptr_SegAddr; 

   unsigned  int temp=0,Data=0;                             //Segment  pointer 

   //-----  段范围限定。为了内存管理安全,只允许本段操作----- 

   if((SegPre<=31&&Addr>=512) ||(SegPre>31&&Addr>=64) ) 

     return 0; 

   temp = SegAddr+Addr; 

Ptr_SegAddr =

[1] [2] [3]

关键字:MSP430G2553  flash操作

来源: eefocus 引用地址:http://www.eeworld.com.cn/mcu/2018/ic-news071140264.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:MSP430 我的低功耗系统编程模板
下一篇:MSP430G2553 WDT的NMI中断例子

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

MSP430G2553电子时钟实验

用msp430g2553控制1602液晶显示时间,并可以通过按键设置时间,我做了正计时和倒计时两种模式/*********************************************************************msp430g2553与1602引脚连接情况* PIN1 --> 地* PIN2 --> VCC(一定要接+5V)* PIN3 -->仿真时悬空,实际电路 2K电阻-->地 (电阻可以是500-2k的,改变电阻可以改变字符显示的亮度,电阻接不好会导致什么都不显示)* PIN4 --> RS --> P1.6* PIN5 --> R/W -->
发表于 2018-07-14 20:42:53

MSP430G2553 1602显示字符

代码:# include "msp430G2553.h"# define uchar unsigned char # define uint unsigned int # define LCD1602_RS_H  P2OUT|=BIT0# define LCD1602_RS_L  P2OUT&=~BIT0# define LCD1602_RW_H  P2OUT|=BIT1# define LCD1602_RW_L  P2OUT&=~BIT1# define LCD1602_EN_H  P2OUT|=BIT2# define LCD1602_EN_L
发表于 2018-07-14 20:40:26

MSP430G2553串口通讯 发送接收

数据发送代码:void UartPutchar(unsigned char c){while(!(IFG2 & UCA0TXIFG));  //待发送为空UCA0TXBUF=c;IFG2 &=~UCA0RXIFG;}只需要将那个buf变量的值改变即可接收数据#pragma vector=USCIAB0RX_VECTOR__interrupt void USCI0RX_ISR(void){while (!(IFG2&UCA0TXIFG));                // 等待发送完成//UCA0TXBUF
发表于 2018-07-14 20:33:37

MSP430 - G2553之串口操作

#include <msp430.h> void delay1s(void) {  int t = 1000;  while (t--)    __delay_cycles(1000);    } #define UART_TXD 0x02                                  // TXD on P1.1 (Timer0_A.OUT0
发表于 2018-07-14 20:26:54

MSP430G2553 输出ACLK和SMCLK

#include "io430.h"int main( void ){  int i;  // Stop watchdog timer to prevent time out reset  WDTCTL = WDTPW + WDTHOLD;  P1DIR |= P0 + P4; //设置P1.0 1.4为输出  P1SEL |= P0 + P4; //设置P1.0输出ACLK,P1.4输出SMCLK  while(1);  return 0;}
发表于 2018-07-14 20:23:28

MSP430G2553 串口通信

代码功能:TI官方例程 :PC机向单片机发送字符 然后单片机回发到PC机 就是这么一个简单的代码 我居然。。。。。。。。。。。。。。。。。。。。。。。。。。。。下面逐一的解释一下每一条语句的功能 附上代码://*************************************************************************//   MSP430G2xx3 Demo - USCI_A0, 9600 UART Echo ISR, DCO SMCLK////   Description: Echo a received character, RX ISR used.
发表于 2018-07-14 20:19:35

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2018 EEWORLD.com.cn, Inc. All rights reserved