娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年05月01日(星期四)

2018年05月01日 | MSP430F149內部Flash操作

發布者:勾劍寒 來源: eefocus關鍵字:MSP430F149  內部Flash操作 手機看文章 掃描二維碼
隨時隨地手機看文章
  1. 硬件介紹:

    要對Flash讀寫,首先要了解MSP430的存儲器組織。430單片機的存儲器組織結構采用馮諾依曼結構,RAM和ROM統一編址在同一尋址空間中,沒有代碼空間和數據空間之分。

    一般430的單片機都統一編址在0-64k地址范圍中,只有少數高端的型號才能突破64k(如:FG461x系列)。絕大多數的msp430單片機都編址在64kB范圍內。地址的大概編碼方式如下:

    可以通過MERAS、ERASE 位來設置擦除的模式:段擦除,主Flash擦除,全部擦除。

    對要擦除段內的一個地址空寫入啟動擦出周期:空寫入可以啟動時序發生器和擦除操作。空寫入后BUSY位立即變高直到擦除周期結束,這一位變為低(0)。BUSY, MERAS和 ERASE位在擦除周期結束后會自動復位。擦除周期的時間和要擦出的Flash大小無關,每次擦除的時間對于MSP430F1xx系系列單片機來說,所需時間是一樣的。擦除的時序如下:

    從RAM中啟動擦除操作:任意擦除周期都可以從RAM啟動,這時CPU不再暫停而是繼續從RAM中運行接下來的程序。CPU可以訪問任何Flash地址之前,必須檢查BUSY位以確定擦除周期結束。如果BUSY = 1訪問Flash,這是一個訪問沖突,這時ACCVIFG將被設置,而擦除的結果將是不可預測的的。

    從RAM中啟動擦除操作時,過程如下:

    寫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 WDTDINT ; Disable interrupts
    MOV #FWKEY+FSSEL1+FN0,&FCTL2    ; SMCLK/2MOV #FWKEY,&FCTL3               ; Clear LOCKMOV #FWKEY+WRT,&FCTL1           ; Enable writeMOV #0123h,&0FF1Eh              ; 0123h ?> 0FF1EhMOV #FWKEY,&FCTL1               ; Done. Clear WRTMOV #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 WDTDINT                            ; Disable interruptsL1 BIT #BUSY,&FCTL3             ; Test BUSYJNZ L1                          ; Loop while busyMOV #FWKEY+FSSEL1+FN0,&FCTL2    ; SMCLK/2MOV #FWKEY,&FCTL3               ; Clear LOCKMOV #FWKEY+WRT,&FCTL1           ; Enable writeMOV #0123h,&0FF1Eh              ; 0123h ?> 0FF1EhL2 BIT #BUSY,&FCTL3             ; Test BUSYJNZ L2                          ; Loop while busyMOV #FWKEY,&FCTL1               ; Clear WRTMOV #FWKEY+LOCK,&FCTL3          ; Set LOCK...                             ; Re-enable WDT?EINT                            ; Enable interrupts

    塊寫入:當需要寫入連續的多個字或字節時,塊寫入能夠能夠提高Flash訪問速度。塊寫入時,內部產生的編程電壓一直存在在64個字節的塊寫入期間。塊寫入不能有Flash存儲器內啟動,必須從RAM中發起塊寫入操作。塊寫入期間,BUSY位被置位。在寫入每個字節或字時必須檢測WAIT位。下一個字或字節能夠被寫入時,WAIT位被置位。

    image_thumb16

    塊寫入的過程如下:

     image_thumb19

    ; 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 counterMOV #0F000h,R6                  ; Write pointerMOV #WDTPW+WDTHOLD,&WDTCTL      ; Disable WDTDINT                            ; Disable interruptsL1 BIT #BUSY,&FCTL3             ; Test BUSYJNZ L1 ; Loop while busy
    MOV #FWKEY+FSSEL1+FN0,&FCTL2    ; SMCLK/2MOV #FWKEY,&FCTL3               ; Clear LOCKMOV #FWKEY+BLKWRT+WRT,&FCTL1    ; Enable block writeL2 MOV Write_Value,0(R6)        ; Write locationL3 BIT #WAIT,&FCTL3             ; Test WAITJZ L3                           ; Loop while WAIT=0INCD R6                         ; Point to next wordDEC R5                          ; Decrement write counterJNZ L2                          ; End of block?MOV #FWKEY,&FCTL1               ; Clear WRT,BLKWRTL4 BIT #BUSY,&FCTL3             ; Test BUSYJNZ L4                          ; Loop while busyMOV #FWKEY+LOCK,&FCTL3          ; Set LOCK...                             ; Re-enable WDT if neededEINT                            ; 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執行中斷服務程序而不是正確的中斷程序的地址。

    停止寫入或擦除:任何寫入和擦除操作都可以在正常完成之前,通過設置緊急退出位EMEX退出操作。設置EMEX時,立即停止當前活動的操作,停止Flash控制器;所有的Flash操作停止,Flash返回可讀模式,FCTL1的所有位復位;操作的結果不可預料。

    設置和訪問Flash控制器:FCTLx是16位的、密碼保護的、可讀寫的寄存器。寫入這些寄存器都必須在高位包含密碼0A5H,如果寫入的不是0A5H,將會引起復位。讀寄存器時高位讀出的是96H。

    在擦除或寫入字或字節時寫FCTL1寄存器將會引起訪問沖突,置位ACCVIFG.塊寫入時,WAIT=1時可以寫FCTL1寄存器,當WAIT=0時寫FCTL1寄存器是訪問沖突,置位ACCVIFG。BUSY=1時,所有寫入FCTL2寄存器都是訪問沖突。BUSY=1時,所有的FCTLx都可以讀操作,不會引起訪問沖突。

    Flash的中斷:Flash控制器有兩個中斷源:KEYV, 和ACCVIFG。ACCVIFG在訪問沖突的時候被置位。當ACCVIE在Flash操作完成后被重新使能后ACCVIFG會引起中斷請求。ACCIFG和NMI同樣的中斷向量,所以這個中斷不需要GIE位允許即可產生中斷請求。必須通過軟件檢測ACCVIFG位,以確定發生了訪問沖突;ACCVIFG位必須軟件復位。KEYV是關鍵值錯誤當寫Flash的寄存器時沒有寫正確的高位密碼時被置位,這是會立刻引起PUC信號復位整個硬件。

    編程Flash的硬件:編程430的Flash內容有三種選擇,通過JTAG、通過BSL和用戶定制。用戶定制即是通過單片機的程序訪問自己的Flash。

    image_thumb24

    Flash的寄存器列表如下:

    Register                            Short Form      Register Type   Address     Initial State
    Flash memory control register 1     FCTL1           Read/write      0128h       09600h with PUC
    Flash memory control register 2     FCTL2           Read/write      012Ah       09642h with PUC
    Flash memory control register 3     FCTL3           Read/write      012Ch       09618h with PUC
    Interrupt Enable 1                  IE1             Read/write      000h        Reset with PUC

    Flash的硬件部分就介紹這么多了,有什么不大懂的地方請參考TI提供的用戶指南。

  2. 程序實現:

    首先設置Flash的時鐘,初始化Flash控制器:

    void FlashInit()
    {
        FCTL2 = FWKEY + FSSEL_2 + FN1;          // 默認 SMCLK/3 =333KHz 
    }

    這個函數僅僅設置了時鐘。

    擦除函數:

    void FlashErase(unsigned int Addr)  
    { 
        char *FlashPtr;
        FlashPtr = (char *)Addr;
        FCTL1 = FWKEY + ERASE;                      // Set Erase bit    FCTL3 = FWKEY;                              // Clear Lock bit    DINT;
        *FlashPtr = 0;                              // Dummy write to erase Flash segment B    WaitForEnable();                            //Busy    EINT;
        FCTL1 = FWKEY;                              // Lock    FCTL3 = FWKEY + LOCK;                       // Set Lock bit  
    }

    這個和上面給出的流程一樣,參數是要被擦除的段的首地址。WaitForEnable函數等等待BUSY標志變回零即操作完成。

    void WaitForEnable()
    {    while((FCTL3 & BUSY) == BUSY);      //Busy}

    寫入字節:

    void FlashWriteChar(unsigned int addr,char Data)
    {    char *FlashPtr = (char *)addr;              // Segment A pointer    FCTL1 = FWKEY + WRT;                        // Set WRT bit for write operation    FCTL3 = FWKEY;                              // Clear Lock bit    DINT;
        *FlashPtr = Data;                           // Save Data    WaitForEnable();                            //Busy    EINT;
        FCTL1 = FWKEY;                              // Clear WRT bit    FCTL3 = FWKEY + LOCK;                       // Set LOCK bit}

    寫入字:

    void FlashWriteWord(unsigned int addr,unsigned int Data)
    {    unsigned int *FlashPtr = (unsigned int *)addr;
        FCTL1 = FWKEY + WRT;                        // Set WRT bit for write operation    FCTL3 = FWKEY;                              // Clear Lock bit    DINT;
        *FlashPtr = Data;                           // Save Data    WaitForEnable();                            //Busy    EINT;
        FCTL1 = FWKEY;                              // Clear WRT bit    FCTL3 = FWKEY + LOCK;                       // Set LOCK bit}

    寫入字或字節兩個函數差別僅僅是指針類型不同。

    讀取字或字節:

    char FlashReadChar(unsigned int Addr)
    { 
        char Data;    char *FlashPtr = (char *) Addr; 
        Data = *FlashPtr;    return(Data);
    }unsigned int FlashReadWord(unsigned int Addr)
    { 
        unsigned int Data;    unsigned int *FlashPtr = (unsigned int *)Addr; 
        Data = *FlashPtr;    return(Data);
    }

    這兩個函數的差別也是僅僅指針類型不同。

    這些函數和前面硬件介紹部分的程序流程相同,這里不再詳細說明。

  3. 使用示例: 

    使用方法和之前的一樣,工程中加入C文件,源代碼文件中文件包含H文件,即可使用,具體參考示例項目:

    演示主要程序主要如下:

    #include #include "Flash.h"int a;void main( void )
    {    // Stop watchdog timer to prevent time out reset    WDTCTL = WDTPW + WDTHOLD;
        ClkInit();
        FlashInit();
        FlashWriteChar(InfoB,0x25);
        a=FlashReadChar (InfoB);        //InfoB在H文件中有宏定義    FlashWriteWord(InfoB+2,0x5669);
        a = FlashReadWord(InfoB+2);
        FlashErase(InfoB);
        LPM0;
    }

    這里向InfoB(1000h)首地址開始寫數據,先寫一個字節 再寫入一個字(注意寫入字時,必須是偶數地址,奇數地址會寫在這個地址所在的前一個偶數地址),讀出,然后擦除。這里的程序都是在Flash中運行的,沒有演示RAM中運行的程序。如果在RAM運行程序,則需要先把程序從Flash中移到RAM中,然后跳轉到RAM中運行。

    調試截圖如下:

    image_thumb[2]

    調試時,view-Memory菜單,調出存儲器窗口;觀察Flash內容。

    image_thumb[4]

    這里寫入的是Info Flash部分,觀察這部分的結果,和寫入的結果同。

Flash程序控制器的程序就到這兒了。Flash可以用于存儲長期保存的數據。有什么不足之處,歡迎討論。


關鍵字:MSP430F149  內部Flash操作 引用地址:MSP430F149內部Flash操作

上一篇:MSP430應用技巧7:MSP430F5438A時鐘的設置
下一篇:nand flash 讀寫(基本操作)

推薦閱讀

1 Msp430Flash型單片機內部Flash存儲器介紹MSP430的Flash存儲器是可位、字節、字尋址和編程的存儲器。該模塊由一個集成控制器來控制編程和擦除的操作。控制器包括三個寄存器,一個時序發生器及一個提供編程、擦除電壓的電壓發生器。Msp430的Flash存儲器的特點有:1) 產生內部編程電壓2) 可位、字節、字編程,可以單個操作,也可以連續多個操作3) 超...
《復仇者聯盟4:終局之戰》是漫威從11年前開始打造的漫威宇宙系列的第22部作品,同時也是最后一部作品,目前這部電影正在席卷全球的影院票房。《復仇者聯盟4:終局之戰》的演員陣容充斥著各種好萊塢一線明星,因此只要漫威想要拍攝一部大片,那么就會在演員片酬中支付一大筆開支。不過,在這部電影的大部分時間里,許多演員都使用電腦生成的虛擬畫面進行幫...
2020年3月18日,蘋果上線的iPad Pro搭載了ToF模組,這對于3D視覺感知市場產業是一個重磅的信息。有著蘋果的加入,這相信會對整個ToF產業發展帶來光明前景。除了蘋果外,在最新的華為P40 Pro和Pro+上也確認搭載ToF模組,而安卓陣型早已經是ToF的堅定擁護者。目前在3D視覺感知領域,主要有三種:TOF (Time of Flight)、雙目成像(雙攝3D 建模)和結...
近年來,數字經濟規模不斷擴張,已成為國民經濟的重要組成部分,美、英、德等國的數字經濟GDP占比超過60%,居主導地位。目前,我國正積極推進數字產業化、產業數字化,引導數字經濟和實體經濟深度融合,推動經濟高質量發展。其中,隨著數字經濟向能源領域加速滲透,能源行業加快數字化、網絡化、智能化轉型。作為一種應運而生的新經濟形態,能源數字經濟...

史海拾趣

問答坊 | AI 解惑

基于CAN總線的多視覺傳感器測控系統的設計2

5   CAN總線通訊    CAN總線是一個多主站現場總線,各節點都有權向其他節點發送信息,其協議簡單,實時性強,可靠性及抗干擾能力好,總線利用率高,硬件成本低。主要特點如下:1)CAN總線的任一節點在任一時刻 ...…

查看全部問答∨

MSP430系列超定功耗16位單片機原理與應用

MSP430系列超定功耗16位單片機原理與應用…

查看全部問答∨

6410+DDR1 256MB

我現在用的是三星官方的BSP,里面使用的是128MB的mDDR,而我們現在要使用DDR1,由4片32M x 16的DDR1組成一個256MB的內存,先當128MB使用,為了好調試,現在遇到的問題如下: 1、在下載NK時出錯, Download BIN file information: --------------- ...…

查看全部問答∨

CDMA和GPRS的判別

各位,我現在想用VC寫一個程序來判別手機用的是CDMA或者GPRS,然后建立連接. 請問程序里面怎么判別手機用的是CDMA還是GPRS?謝謝…

查看全部問答∨

ARM怎么對物理地址直接操作?

原來在MIPS下加上偏移量0xA0000000就行了 那ARM下呢?該怎么做? 小弟用的是S3C2440…

查看全部問答∨

關于EVC的控件

請問 有沒有哪個地方可以下載到EVC的第三方的控件,就像VC下面的BCGCBPRO,TreeChart之類的…

查看全部問答∨

【設計工具】MicroBlaze發的硬件加速實現技巧

  在實際應用中,有很多算法可以轉化為純硬件來加速你的處理器。平均標準偏差算法,給定時間內創建最小值或最大值,濾波器以及FFT均屬于可輕松移植到硬件上的典型算法。不過。諸如位反轉等一些不常見的算法可采用合適的硬件加速器也能夠移植到硬 ...…

查看全部問答∨

LM3S9997如何擴展SRAM

本人新手,前幾天從TI的官網上申請了LM3s9997  ,想做個核心板用于學習,但是看到網上的原理圖都是通過EPI 來擴展SRAM的,可是LM3S9997沒有EPI,請問如何擴展SRAM呢?還有可以擴展什么類型的ram 呢?小弟先謝過了。…

查看全部問答∨

為何我的stm32在keil調試時,光標沒有在代碼區,只在反匯編去呢

不知道為什么,我在硬件調試的時候,pc指針只在反匯編區,不在c代碼區,很郁悶,求高手求解。我的芯片為stm32系列,jlink仿真器。 …

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 女性| 马尔康县| 宜宾市| 汉寿县| 巴青县| 宁化县| 太保市| 固始县| 于都县| 安塞县| 常熟市| 兰考县| 宜川县| 特克斯县| 开江县| 天镇县| 兖州市| 日喀则市| 烟台市| 成武县| 平南县| 大渡口区| 清苑县| 商都县| 孝义市| 阿拉善左旗| 磴口县| 温泉县| 清苑县| 乌兰县| 喀喇| 忻州市| 额尔古纳市| 离岛区| 静宁县| 定西市| 益阳市| 海宁市| 磴口县| 禄丰县| 阳江市|