新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > MSP430 FLASH讀寫

        MSP430 FLASH讀寫

        作者: 時間:2016-11-11 來源:網絡 收藏
        MSP430 FLASH型單片機的FLASH存儲器模塊根據不同的容量分為若干段,其中信息存儲器SegmengA及SegmentB各有128字節,其他段有512字節。SegmentB的地址是:0x01000h到0x107F,SegmentA的地址是:0x01080h到0x010FFh。其他段的地址根據容量不同,從0xFFFFh開始,每512字節為一段進行分配。
        FLASH存儲器寫入數據時,每一位只能由“1”變成“0”,不能由“0”變成“1“,因此,當我們有數據要保存到FLASH存儲器時,要先對目標段進行整段擦除操作,擦除操作使的對應段FLASH存儲器變成全“1”。下面是擦除FLASH段的子程序,配置好必要的寄存器后,向段中任意地址寫入數據,及擦除一段。
        void flash_clr(int *ptr)
        {
        _DINT(); //關中斷
        FCTL3 = 0x0A500; //* Lock = 0 開鎖
        FCTL1 = 0x0A502; //* Erase = 1 使能擦除
        *((int *) ptr) = 0; //* 擦除段
        }

        FLASH存儲器可以按字節寫入,也可以按字寫入。
        // 字節寫入
        void flash_write_int8(int8_t *ptr, int8_t value)
        {
        _DINT();
        FCTL3 = 0x0A500; // Lock = 0 開鎖
        FCTL1 = 0x0A540; // Write = 1使能寫入
        *((int8_t *) ptr) = value; // 寫入數據
        }
        // 字寫入
        void flash_write_int16(int16_t *ptr, int16_t value)
        {
        _DINT();
        FCTL3 = 0x0A500; /* Lock = 0 */
        FCTL1 = 0x0A540; /* Write = 1 */
        *((int16_t *) ptr) = value; /* Program the flash */
        }

        FLASH存儲器可以連續寫入
        // 按字節寫入指定的數量的數據
        void flash_memcpy(char *ptr, char *from, int len)
        {
        _DINT();
        FCTL3 = 0x0A500; /* Lock = 0 */
        FCTL1 = 0x0A540; /* Write = 1 */
        while (len)
        {
        *ptr++ = *from++;
        len--;
        }
        }

        本文引用地址:http://www.104case.com/article/201611/316578.htm

        在我們的應用程序中可以將要保存的數據放在一個自定義的結構中,例如:
        typedef struct Setup
        {
        float gain_ch0; // 0通道增益
        float gain_ch1; // 1通道增益
        float gain_ch2; // 2通道增益

        char init_flag; //初始化標記,恒為0xAA;
        }SETUP;

        我們定義了一個SETUP結構,存放三個AD通道的增益,以及其他要掉電保存的信息,init_flag的作用是標志FLASH的參數是否已被正確初始化,當我們設置了FLASH參數后,將init_flag置一個固定值,例如設為0xAAh,在程序開始運行時,檢查init_flag,當init_flag的值為0xAAh時,表明參數已被初始化。
        使用FLASH參數:在程序中定義一個SETUP類型的指針變量,通過這個指針訪問FLASH中的參數。例如:

        #define SegmentA 0x1080
        float temp;
        SETUP *p_setup_flash = (SETUP *) SegmentA

        if(p_setup_flash-> init_flag == 0xAA)
        {
        temp = p_setup_flash->gain_ch0;
        }

        修改FLASH信息:由于FLASH不能象RAM一樣直接修改,可以將FLASH信息拷貝到RAM中,修改相應參數后,重新保存到FLASH存儲器中,之前要先擦除FLASH存儲區。例如:

        SETUP *p_setup;
        SETUP buf; // 臨時變量
        p_setup = (SETUP *) SegmentA // 指向FLASH
        memcpy((char *) buf, (char *) p_setup_flash, sizeof(SETUP)); // 拷貝到RAM
        p_setup = &buf; // 指向RAM
        p_setup-> gain_ch0 = 1.02; // 修改參數
        flash_memcpy((char *) p_setup_flash, (char *) buf, sizeof(SETUP)); // 拷貝到FLASH



        關鍵詞: MSP430FLASH讀

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 清徐县| 太康县| 镇平县| 延安市| 罗山县| 华池县| 武川县| 巢湖市| 普宁市| 兴义市| 长顺县| 扶绥县| 潼南县| 荔浦县| 元谋县| 周口市| 龙江县| 马关县| 凭祥市| 乡宁县| 临洮县| 津市市| 车致| 潞西市| 呼伦贝尔市| 九江市| 裕民县| 淅川县| 赤水市| 乌海市| 当阳市| 策勒县| 屯留县| 莲花县| 措美县| 岑巩县| 吉木乃县| 桃园市| 舟曲县| 江川县| 双桥区|