当前位置:首页 > 单片机 > 单片机
[导读]今天顺便研究了一下msp430的flash操作,很多人也许看了我的博客,会发现网站上有很多的人总结得比我要好,这点我承认,因为自己能力有限,但是,从这篇博客起,我会参照以前大神们写的博客,添加大神们写过的博客链接

今天顺便研究了一下msp430的flash操作,很多人也许看了我的博客,会发现网站上有很多的人总结得比我要好,这点我承认,因为自己能力有限,但是,从这篇博客起,我会参照以前大神们写的博客,添加大神们写过的博客链接,分享给大家,注明:本人从不抄袭他人博客,博客只是个人技术的一个总结~~~,下面进入今天的正题

msp430F149有60k的flash,这个对于51来说,是相当的惊人的了,在涉及到flash的操作的时候,往往涉及到三个寄存器,FCTL1,FCTL2,FCTL3。突然间发现msp430的寄存器都有CTL这个字样,这对于记住不同的寄存器操作很有必要,这里我们要明白各个寄存器的用途

FCTL1是控制如何进行操作,比如读写,复制,擦除

FCLT2是控制读写的时钟频率,因为flash的操作频率必须是257K到476K之间

FCTL3用于控制FLASH存储器操作,保存相应的状态标志和错误条件

关于Flash控制寄存器的介绍

这里推荐一篇比较好的博客:http://www.cnblogs.com/sky1991/archive/2012/08/18/2645529.html

也可以参照这一篇博客:http://www.cnblogs.com/Engin/archive/2011/08/31/2160534.html

下面我们来总结一下如何对flash进行编程操作:

这里也总结下操作flash的三个寄存器的规律,所有的寄存器操作都是等于,所有的寄存器操作都要加上FWKEY,也就是密匙,了解这一点对编程这很重要

步骤1:设置时钟频率

这个时候,是对FCTL2进行操作,FCTL2 = FWKEY+FSSEL0+FN0;

这里解释一下,FSSELx他有5种选择格式,这里可以查看头文件

#define FSSEL0 (0x0040) /* Flash clock select 0 */ /* to distinguish from USART SSELx */

#define FSSEL1 (0x0080) /* Flash clock select 1 */


#define FSSEL_0 (0x0000) /* Flash clock select: 0 - ACLK */

#define FSSEL_1 (0x0040) /* Flash clock select: 1 - MCLK */

#define FSSEL_2 (0x0080) /* Flash clock select: 2 - SMCLK */

#define FSSEL_3 (0x00C0) /* Flash clock select: 3 - SMCLK */


FNx是分频比:这里有5种分频比:

#define FN0 (0x0001) /* Divide Flash clock by 1 to 64 using FN0 to FN5 according to: */

#define FN1 (0x0002) /* 32*FN5 + 16*FN4 + 8*FN3 + 4*FN2 + 2*FN1 + FN0 + 1 */

#ifndef FN2

#define FN2 (0x0004)

#endif

#ifndef FN3

#define FN3 (0x0008)

#endif

#ifndef FN4

#define FN4 (0x0010)


步骤2:设置完分频的基本操作之后,一般就不用在对FCTL2进行操作了,这个时候

一般是对FCTL1进行设置,需要明白的是,对flash的操作是以段位操作的,而且在对flash进行操作的时候,一般要采用指针,这个时候,就要进行强制转化,例如设置一个flash的写函数所用的指针为 unsigned *Flash_ptr; Flash_ptr = (unsigned char *)0x1080

先对一个段进行擦除前,要进行一个假写入,所以这个时候要配置FCTL3,FCTL1,因为flash只能是读权限,要更改她的权限,要对flash的写的标志位进行置位

也就是

FCTL1 = FWKEY+ERASE;

FCTL3 = FWEKY;//#define FWKEY(0xA500) /* Flash key for write */

这里要注意一个ERASE这个宏定义;这里是设置擦除的格式,查看头文件会发现有几种擦除格式

#define ERASE (0x0002) /* Enable bit for Flash segment erase */

#define MERAS (0x0004) /* Enable bit for Flash mass erase */


这个时候,假写入一个数据,就会使得cpu挂起,flash进行擦除
*Flash_ptr = 0; //从flash中启动一个擦除,这时候要假写入,启动擦除过程

步骤3:

启动擦除之后,就可以想flash中写入数据了,写入数据的格式:

FCTL1 = FWKEY+WRT;//擦除的话,因为从flash中进行擦除,

//设定写模式

for(i=0;i<128;i++)

{

*Flash_ptr ++ = value;//写入128个字节

}

步骤4:做完上述操作,要对flash进行锁保护,以防止误写

FCTL1 = FWKEY;//清掉写的操作位,防止写完后误操作

FCTL3 = FWKEY +LOCK;//安全恢复保护

在实际编程的过程中,用到flash高深的地步,还可以将flash作为一个内部的SD卡,用来存储数据,这个功能算是比较高级的应用了,推荐几篇博客介绍这种功能的使用

flash的扩展使用http://www.cnblogs.com/hrj2012/archive/2012/05/17/2506306.html


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭