历史上的今天

今天是:2024年10月09日(星期三)

正在发生

2019年10月09日 | MSP430程序库<十五>Flash控制器

发布者:MoonlightStar 来源: eefocus关键字:MSP430  程序库  Flash控制器 手机看文章 扫描二维码
随时随地手机看文章

一般,在单片机中的Flash存储器用于存放程序代码,属于只读型存储器。而在MSP430些列的单片机中,都可以通过内置的Flash控制器擦除或改写任何一段的内容。另外,msp430的单片机内部还专门留有一段Flash区域(information memory),用于存放掉电后需要永久保存的数据。利用430内部的Flash控制器,可以完成较大容量的数据记录、用户设置参数在掉电后的保存等功能。


硬件介绍:

要对Flash读写,首先要了解MSP430的存储器组织。430单片机的存储器组织结构采用冯诺依曼结构,RAM和ROM统一编址在同一寻址空间中,没有代码空间和数据空间之分。


一般430的单片机都统一编址在0-64k地址范围中,只有少数高端的型号才能突破64k(如:FG461x系列)。绝大多数的msp430单片机都编址在64kB范围内。地址的大概编码方式如下:

image_thumb1


这是msp430f425的存储器分配图,其他在64k范围内的存储器的单片机编址方式与此类似:低256B是寄存器区,然后是RAM;空白;1000H到10FFH是信息Flash区;大于1100H-0FFFFH是主存储器区(从0FFFFH开始往低地址有单片机的主Flash,多余的部分空白)。


MSP430F14x的Flash分布:

image_thumb21[1]


MSP430F16x的Flash分布:


image_thumb41[1]


主Flash部分和信息Flash部分如下(60kB Flash对应的单片机,如msp430f149、msp430f149):


image_thumb4


主Flash分为以512B为段的单位,0段是单片机中断向量等程序入口地址,使用时不要擦除此段或改写此段,若要擦除或是改写,请先保存内容到RAM或其他段;主Flash各段内容均要避免写入或擦除,以免造成不可预料的后果。


信息Flash分为两段:段A和段B,每段128B;可以保存用户自己的内容(主Flash也可以但是要避免与程序代码区冲突);这里就把信息Flash的两段称为InfoA(1080H-10FFh)和InfoB(1000H-10FFH)。


Flash的操作包括:字或字节写入;块写入;段擦除;主Flash擦除;全部擦除。任何的Flash操作都可以从Flash或从RAM中运行。


Flash操作时需要时序发生器,Flash控制器内部含有时序发生器用以产生所需的Flash时钟,Flash时钟的范围必须在257kHz到476kHz之间。时序发生器的框图如下:


image_thumb2


时序发生器可以选择ACLK、MCLK、SMCLK作为时钟源,通过分频获得所需的257kHz到476kHz之间的Flash操作时钟。如果时钟频率不再这个范围内,将会产生不可预料的结果。


擦除:擦除之后,存储器中的bit都变为1;Flash中的每一位都可以通过编程写入有1到0,但是要想由0变为1,必须通过擦除周期。擦除的最小单位是段。有三种擦除模式:


MERAS   ERASE       Erase Mode

0       1           Segment erase

1       0           Mass erase (all main memory segments)

1       1           Erase all flash memory (main and information .segments)

可以通过MERAS、ERASE 位来设置擦除的模式:段擦除,主Flash擦除,全部擦除。


对要擦除段内的一个地址空写入启动擦出周期:空写入可以启动时序发生器和擦除操作。空写入后BUSY位立即变高直到擦除周期结束,这一位变为低(0)。BUSY, MERAS和 ERASE位在擦除周期结束后会自动复位。擦除周期的时间和要擦出的Flash大小无关,每次擦除的时间对于MSP430F1xx系系列单片机来说,所需时间是一样的。擦除的时序如下:


image_thumb41


当空写入到的地址不在要擦除的段地址范围内的时候,空写入无效,直接被忽略。在擦除周期内,应该关中断,直到擦除完成,重新开中断,擦除期间的中断已经置标志位,开中断后立即响应。


从Flash中启动的擦除操作:擦除操作可以从Flash中启动或是从RAM中启动。当操作是从Flash中启动的时候,Flash控制器控制了操作时序,CPU运行被暂停直到擦除结束。擦除周期结束后,CPU继续执行,从空写入之后的指令开始运行。当从Flash中启动擦除操作时,可以擦除即将运行的程序所在的段,如果擦除了即将运行的程序所在的Flash段时,擦除结束后,CPU的运行不可预料。


从Flash启动时擦除周期如下:


image_thumb2[1]

用户指南里面的示例汇编程序如下:


; Segment Erase from flash. 514 kHz < SMCLK < 952 kHz

; Assumes ACCVIE = NMIIE = OFIE = 0.

MOV #WDTPW+WDTHOLD,&WDTCTL ; Disable WDT

DINT //; Disable interrupts

MOV #FWKEY+FSSEL1+FN0,&FCTL2 ; SMCLK/2

MOV #FWKEY,&FCTL3 ; Clear LOCK

MOV #FWKEY+ERASE,&FCTL1 ; Enable segment erase

CLR &0FC10h ; Dummy write, erase S1

MOV #FWKEY+LOCK,&FCTL3 ; Done, set LOCK

... ; Re-enable WDT?

EINT ; Enable interrupts

从RAM中启动擦除操作:任意擦除周期都可以从RAM启动,这时CPU不再暂停而是继续从RAM中运行接下来的程序。CPU可以访问任何Flash地址之前,必须检查BUSY位以确定擦除周期结束。如果BUSY = 1访问Flash,这是一个访问冲突,这时ACCVIFG将被设置,而擦除的结果将是不可预测的的。


从RAM中启动擦除操作时,过程如下:


image_thumb5

要在擦除之前确认没有访问Flash,然后擦除完成之前不允许访问Flash。


; Segment Erase from RAM. 514 kHz < SMCLK < 952 kHz

; Assumes ACCVIE = NMIIE = OFIE = 0.

MOV #WDTPW+WDTHOLD,&WDTCTL  ; Disable WDT

DINT                        ; Disable interrupts

L1 BIT #BUSY,&FCTL3         ; Test BUSY

JNZ L1                      ; Loop while busy

MOV #FWKEY+FSSEL1+FN0,&FCTL2; SMCLK/2

MOV #FWKEY,&FCTL3           ; Clear LOCK

MOV #FWKEY+ERASE,&FCTL1     ; Enable erase

CLR &0FC10h                 ; Dummy write, erase S1

L2 BIT #BUSY,&FCTL3         ; Test BUSY

JNZ L2                      ; Loop while busy

MOV #FWKEY+LOCK,&FCTL3      ; Done, set LOCK

...                         ; Re-enable WDT?

EINT                        ; Enable interrupts

写Flash操作:写入的模式由WRT和BLKWRT位来确定:


BLKWRT      WRT         Write Mode

0           1           Byte/word write

1           1           Block write

这两种模式中块写入大约是字或字节写操作时的两倍快,因为在块写入完成之前,变成电压一直维持直到块写入完成。同一个位置不能在擦除周期之前写入两次或以上,否则将发生数据损坏。写操作时,BUSY位被置1,写入完成后,BUSY被自动清零。如果写操作是从RAM发起的,在BUSY=1时,程序不能访问Flash,否则会发生访问冲突,置位ACCVIFG,Flash写入操作不可以预料。


字或字节写入:字或字节写入可以从Flash内部发起,也可以从RAM中发起。如果是从Flash中启动的写操作,时序将由Flash控制,在写入完成之前CPU运行将被暂停。写入完成后CPU将继续运行。


操作时序如下:


image_thumb7


若是从RAM中启动写Flash,程序将继续从RAM中运行。CPU再次访问Flash之前必须确认BUSY位已经清零,否则会发生访问冲突,置位ACCVIFG,写入的结果将不可预料。


字或字节写入模式下,内部产生的编程电压时适用于完整的64个字节块的写入

In byte/word mode, the internally-generated programming voltage is applied

to the complete 64-byte block, each time a byte or word is written, for 32 of the

35 fFTG cycles. With each byte or word write, the amount of time the block is

subjected to the programming voltage accumulates. The cumulative

programming time, tCPT, must not be exceeded for any block. If the cumulative

programming time is met, the block must be erased before performing any

further writes to any address within the block.

从Flash发起写字节或字时:


image_thumb10


; Byte/word write from flash. 514 kHz < SMCLK < 952 kHz

; Assumes 0FF1Eh is already erased

; Assumes ACCVIE = NMIIE = OFIE = 0.

MOV #WDTPW+WDTHOLD,&WDTCTL      ; Disable WDT

DINT ; Disable interrupts

MOV #FWKEY+FSSEL1+FN0,&FCTL2    ; SMCLK/2

MOV #FWKEY,&FCTL3               ; Clear LOCK

MOV #FWKEY+WRT,&FCTL1           ; Enable write

MOV #0123h,&0FF1Eh              ; 0123h −> 0FF1Eh

MOV #FWKEY,&FCTL1               ; Done. Clear WRT

MOV #FWKEY+LOCK,&FCTL3          ; Set LOCK

...                             ; Re-enable WDT?

EINT                            ; Enable interrupts

从RAM中启动写入操作时:


image_thumb12


; Byte/word write from RAM. 514 kHz < SMCLK < 952 kHz

; Assumes 0FF1Eh is already erased

; Assumes ACCVIE = NMIIE = OFIE = 0.

MOV #WDTPW+WDTHOLD,&WDTCTL      ; Disable WDT

DINT                            ; Disable interrupts

L1 BIT #BUSY,&FCTL3             ; Test BUSY

JNZ L1                          ; Loop while busy

MOV #FWKEY+FSSEL1+FN0,&FCTL2    ; SMCLK/2

MOV #FWKEY,&FCTL3               ; Clear LOCK

MOV #FWKEY+WRT,&FCTL1           ; Enable write

MOV #0123h,&0FF1Eh              ; 0123h −> 0FF1Eh

L2 BIT #BUSY,&FCTL3             ; Test BUSY

JNZ L2                          ; Loop while busy

MOV #FWKEY,&FCTL1               ; Clear WRT

MOV #FWKEY+LOCK,&FCTL3          ; Set LOCK

...                             ; Re-enable WDT?

EINT                            ; Enable interrupts

块写入:当需要写入连续的多个字或字节时,块写入能够能够提高Flash访问速度。块写入时,内部产生的编程电压一直存在在64个字节的块写入期间。块写入不能有Flash存储器内启动,必须从RAM中发起块写入操作。块写入期间,BUSY位被置位。在写入每个字节或字时必须检测WAIT位。下一个字或字节能够被写入时,WAIT位被置位。


image_thumb16


块写入的过程如下:


image_thumb16


; Write one block starting at 0F000h.

; Must be executed from RAM, Assumes Flash is already erased.

; 514 kHz < SMCLK < 952 kHz

; Assumes ACCVIE = NMIIE = OFIE = 0.

MOV #32,R5                      ; Use as write counter

MOV #0F000h,R6                  ; Write pointer

MOV #WDTPW+WDTHOLD,&WDTCTL      ; Disable WDT

DINT                            ; Disable interrupts

L1 BIT #BUSY,&FCTL3             ; Test BUSY

JNZ L1 ; Loop while busy

MOV #FWKEY+FSSEL1+FN0,&FCTL2    ; SMCLK/2

MOV #FWKEY,&FCTL3               ; Clear LOCK

MOV #FWKEY+BLKWRT+WRT,&FCTL1    ; Enable block write

L2 MOV Write_Value,0(R6)        ; Write location

L3 BIT #WAIT,&FCTL3             ; Test WAIT

JZ L3                           ; Loop while WAIT=0

INCD R6                         ; Point to next word

DEC R5                          ; Decrement write counter

JNZ L2                          ; End of block?

MOV #FWKEY,&FCTL1               ; Clear WRT,BLKWRT

L4 BIT #BUSY,&FCTL3             ; Test BUSY

JNZ L4                          ; Loop while busy

MOV #FWKEY+LOCK,&FCTL3          ; Set LOCK

...                             ; Re-enable WDT if needed

EINT                            ; Enable interrupts

当任何写或擦除操作是从RAM启动,而BUSY = 1,CPU不能读取或写入或从任何Flash位置。否则,发生访问冲突,ACCVIFG设置,结果是不可预知的。此外,如果闪存写入让WRT= 0,ACCVIFG中断标志设置,Flash不受影响。


如果写入或擦除操作时从Flash启动的,CPU访问下一条指令时(从Flash读取指令),Flash控制器返回03FFFH给CPU;03FFFH是指令JMP PC,这让CPU一直循环直到Flash操作完成。Flash写入或擦除操作完成后,允许CPU继续访问接下来的指令。


当BUSY=1时,Flash访问时:


image_thumb21


在开始Flash操作之前,需要停止所有的中断源。如果在Flash操作期间有中断响应,读中断服务程序的地址时,将收到03FFFH作为中断服务程序的地址。如果BUSY=1;CPU将一直执行难IMP PC指令;Flash操作完成后,将从03FFFH执行中断服务程序而不是正确的中断程序的地址。

[1] [2]
关键字:MSP430  程序库  Flash控制器 引用地址:MSP430程序库<十五>Flash控制器

上一篇:MSP430程序库<十>ADC12模块
下一篇:MSP430程序库<十四>DMA程序库

推荐阅读

从上面定时器/计数器的结构图中我们可以看出,16位的定时/计数器分别由两个8位专用寄存器组成,即:T0由TH0和TL0构成;T1由TH1和TL1 构成。其访问地址依次为8AH-8DH。每个寄存器均可单独访问。这些寄存器是用于存放定时或计数初值的。此外,其内部还有一个8位的定时器方式寄存器 TMOD和一个8位的定时控制寄存器TCON。这些寄存器之间是通过内部总线和控制...
中国储能网讯:10月1~3日,江苏电网实施填谷电力需求响应,最大填补低谷负荷156.5万千瓦,累计填谷830.8万千瓦,为国庆期间最大值,促进清洁电能消纳5438.3万千瓦时,保障国庆期间电网安全稳定运行。 近年来,江苏地区新能源发电装机增长迅速,截至8月底达2574万千瓦,占全社会装机比例的19.5%。国庆、春节等长假期间企业放假,用电负荷明显下降,区内...
摘要:目前CAN-bus总线技术在工程机械行业中应用非常成熟,但是现场遇到故障问题,尤其是偶发性故障,依旧非常棘手。ZLG针对目前工程机械行业存在的痛点,提出一套切实可行的解决方案,助力工程机械行业进程。 一、ZWS-CAN智慧云如何赋能工程机械? 1. CAN-bus总线在工程机械中的应用 如图 1所示,中国作为“基建狂魔”,工程机械被广泛应用于城乡道路、城...
协作型机器人作为一种新型的工业机器人,扫除了人机协作的障碍,让机器人彻底摆脱护栏或围笼的束缚,其开创性的产品性能和广泛的应用领域,为工业机器人的发展开启了新时代。协作机器人脱颖而出的原因是它们能在原来全部由人工完成的工作领域中发挥作用。由于协作机器人固有的安全性,如力反馈和碰撞检测的应用,人与协作机器人并肩合作的安全性将得以保证...

史海拾趣

问答坊 | AI 解惑

关于485总线的接地问题

    在485总线的应用中,如果简单地只用一对双绞线将各个接口的“A”、“B”端连接起来,而忽略了信号地的互连,这种连接方法在许多场合是能正常工作的,但却埋下了很大的隐患,这有下面二个原因: 1.共模干扰问题:485总 ...…

查看全部问答∨

基于ARM9消防监控报警方案

          背景 随着微电子技术和计算机技术的飞速发展,32位的高性能、低功耗的嵌入式微处理器逐渐取代了传统的8位单片机,采用多线程多任务的嵌入式操作系统依然成为发展的趋势。当前,嵌入式技术已经广 ...…

查看全部问答∨

两种解决枪式摄像机画面晃动的办法

关键字:枪式摄像机        在工程实践中,常常遇到枪式摄像机抖动的问题,如安装在竿上或车上的枪式摄像机或快球,常常因风或震动而造成枪式摄像机不稳,引起图像不稳,导致图像看不清或视觉效果差,还会引起存储压缩时码流 ...…

查看全部问答∨

【藏书阁】磁性体手册 第二篇物质篇

目录: 第七章 金属与合金的磁性 第八章 化合物的磁性 第九章 氧化物的磁性 第十章 卤化物的磁性 第十一章 其他的磁性 参考文献 详细信息: 书名:磁性体手册   作者:(日)近角聪信编 出版社:冶金工业出版社   出 ...…

查看全部问答∨

为什么微软网站上有Mobile的镜像下载却没有CE的镜像下载?

如题,为什么微软网站上有Windows Mobile ****** Emulator Images 下载却没有Windows CE ****** Emulator Images的下载 ? 有个"Microsoft Windows CE 5.0 Device Emulator",应该只是模拟器吧?而且也无法安装...提示错误是:"无法打开此安装程 ...…

查看全部问答∨

海德汉的编码器用Fanuc替换问题

我厂有台德国产的车铣复合车床,带C轴,主轴角度编码器是海德汉的ERM180(已停产),新款是ERM280磁栅编码器,12针连线,苦于买不到备件,老款新款都很难买到,现手头上有一套fanuc的BZ编码器,a860-0392-V160的读数头和T013的磁环,11针接线,不知 ...…

查看全部问答∨

ST-Link2

                                 ST-Link2是什么东西啊,怎么才能和MDK配合使用呢?我买了Mxchip的SK,上面说带ST-Link2,可以和MDK配合使用,可我 ...…

查看全部问答∨

为啥我的板子还没到呢

                                 打电话去EDN问了,说还没发出来。说要我发邮件给她,可是找不着邮件地址在哪?怎么回事呢…

查看全部问答∨

430低功耗问题

我用MSP430作了一个系统,430用的是电池供电,其它部分是外接电源供电.当外部停电后430进入 LPM3(低功耗模式3)状态.且所有的管脚都是输入模式.现在发现通过430的I/O口与其它芯片的偶合,其它芯片上的电源脚上出现了1.7V左右的电压. 如此一来电池将不久 ...…

查看全部问答∨

STM32 RS232通信协议的编写

最近,在做一个项目,实现环境中温度数据的采集,我负责串口通信的部分,控制器使用的是STM32F107VC,想采用中断的方式收发消息,还需要与上位机之间制定协议,请问怎么弄啊,以前从来没有做过,现在还比较急,有哪位大侠会吗,帮帮我!尽量清晰点, ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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