MSP430F5438学习笔记 FLAHS操作

发布者:TranquilOasis最新更新时间:2020-04-21 来源: eefocus关键字:MSP430F5438  EEPROM  FLAHS操作 手机看文章 扫描二维码
随时随地手机看文章

1.前言

MSP430F5438的片内FLASH可以当做EEPROM使用,该部分FLASH称为INFO FLASH,总共有4块每块128Byte。虽然INFO FLASH容量比较少,但是多数情况还是够用的。


2.代码实现


// 时钟默认情况

// FLL时钟      FLL选择 XT1

// 辅助时钟     ACLK选择 XT1          32768Hz

// 主系统时钟   MCLK选择 DCOCLKDIV    8000000Hz

// 子系统时钟   SMCLK选择 DCOCLKDIV   8000000Hz

// UART时钟选择 ACLK

// 低频波特率产生 9600-8-N-1

#include

#include

#include

 

void clock_config(void);

void select_xt1(void);

void dco_config(void);

void uart_config(void);

 

void flash_writebuf(uint8_t *flash_ptr,uint8_t *buffer,uint8_t len);

void flash_readbuf(uint8_t *flash_ptr,uint8_t *buffer,uint8_t len);

 

int main(void)

{

    clock_config();                             // 初始化时钟

    uart_config();                              // 初始化UART

    _EINT();

 

    // 打印时间和提示信息

    printf("Date: %s %srn", __DATE__,__TIME__);

    printf("Flash Test!rn");

 

#if 0

    uint8_t test_buffer[8] = {1,2,3,4,5,6,7,8};

    flash_writebuf((uint8_t*)0x1800, test_buffer,8);

#endif

 

    uint8_t old_flash[8] = {0,};

    uint8_t new_flash[8] = {0,};

 

    // 从info flash 0x1800处连续读出8个字节

    flash_readbuf((uint8_t*)0x1800,old_flash,8);

    for( uint8_t i = 0 ; i < 8 ; i++ )

    {

        printf("ADDR:0X%4X,%-2Xrn",0x1800+i,old_flash[i]);

        new_flash[i] = old_flash[i] + 1;

    }

    // 累加之后再次写入

    flash_writebuf((uint8_t*)0x1800,new_flash,8);

 

    while(1)

    {

 

    }

}

 

void flash_writebuf(uint8_t *flash_ptr,uint8_t *buffer,uint8_t len)

{

    __disable_interrupt();                      // 禁止中断

    FCTL3 = FWKEY;                              // 设置写密钥并解锁

    FCTL1 = FWKEY+ERASE;                        // 段擦除

    *(unsigned int *)flash_ptr = 0;             // ??

    FCTL1 = FWKEY+WRT;                          // 字节写入

 

    for ( uint8_t i = 0; i < len; i++)

    {

        *flash_ptr++ = *buffer++;

    }

 

    FCTL1 = FWKEY;                              // 设置写密钥

    FCTL3 = FWKEY+LOCK;                         // 重新锁住

    __enable_interrupt();                       // 恢复中断

}

 

void flash_readbuf(uint8_t *flash_ptr,uint8_t *buffer,uint8_t len)

{

    __disable_interrupt();

 

    for( uint8_t i = 0 ; i < len ; i++ )

    {

        *buffer++ =  *flash_ptr++;

    }

 

    __enable_interrupt();

}

void clock_config(void)

{

    WDTCTL = WDTPW + WDTHOLD;                   // 停止看门狗

    select_xt1();                               // 选择XT1

    dco_config();                               // ACLK = XT1 = 32.768K

                                                // MCLK = SMCLK = 8000K

}

 

void select_xt1(void)

{

    // 启动XT1

    P7SEL |= 0x03;                              // P7.0 P7.1 外设功能

    UCSCTL6 &= ~(XT1OFF);                       // XT1打开

    UCSCTL6 |= XCAP_3;                          // 内部电容

    do

    {

        UCSCTL7 &= ~XT1LFOFFG;                  // 清楚XT1错误标记

    }while (UCSCTL7&XT1LFOFFG);                 // 检测XT1错误标记

}

 

void dco_config(void)

{

    __bis_SR_register(SCG0);                    // 禁止FLL功能

    UCSCTL0 = 0x0000;                           // Set lowest possible DCOx, MODx

    UCSCTL1 = DCORSEL_5;                        // DCO最大频率为16MHz

    UCSCTL2 = FLLD_1 + 243;                     // 设置DCO频率为8MHz

                                                // MCLK = SMCLK= Fdcoclkdiv = (N+1)X(Ffllrefclk/n)

                                                // N为唯一需要计算的值

                                                // Ffllrefclk FLL参考时钟,默认为XT1

                                                // n取默认值,此时为1

                                                // (243 + 1) * 32768 = 8MHz

    __bic_SR_register(SCG0);                    // 使能FLL功能

 

    // 必要延时

    __delay_cycles(250000);

 

    // 清楚错误标志位

    do

    {

        UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);

                                                // 清除所有振荡器错误标志位

        SFRIFG1 &= ~OFIFG;                      // 清除振荡器错误

    }while (SFRIFG1&OFIFG);                     // 等待清楚完成

}

 

void uart_config(void)

{

    P3SEL = 0x30;                               // 选择P3.4和P3.5的复用功能

 

    UCA0CTL1 |= UCSWRST;                        // 软件复位

    UCA0CTL1 |= UCSSEL_1;                       // 选择ACLK时钟

    UCA0BR0 = 3;                                // 查表获得

    UCA0BR1 = 0;                                // UCA0BRX和UCA0MCTL数值

    UCA0MCTL |= UCBRS_3 + UCBRF_0;              //

    UCA0CTL1 &= ~UCSWRST;                       //

 

    UCA0IE |= UCRXIE;                           // 使能接收中断

}

 

int putchar(int ch)

{

UCA0TXBUF = ch;

while(!(UCA0IFG & UCTXIFG));

return ch;

}


3.运行结果

代码先输出一些提示信息,例如编译的时间和代码意图等。然后从INFO FLASH开头连续读出8字节数据,INFO FLASH的起始地址为0x1800。读出的内容被逐个加1,再写入先前的地址中。掉电之后重新上电,便会得到以下结果。每次复位之后相同地址的内容逐渐增加,说明程序运行正常。

图1 运行结果


4.注意事项

在下载程序是仿真器可以设置擦除FLASH的范围,可以只擦除主FLASH(可以理解为程序部分),也可以擦除主FLAHS和INFO FLASH部分,这些设置具体如何使用要看具体情况。如果需要INFO FLASH内的所有内容复位,则可以选择Erase main  and Information memory——擦除主FLASH和INFO FLASH。

图2 擦除FLASH选项

关键字:MSP430F5438  EEPROM  FLAHS操作 引用地址:MSP430F5438学习笔记 FLAHS操作

上一篇:MSP430单片机__中断服务
下一篇:MSP430F5438A升级失败

推荐阅读最新更新时间:2024-11-17 12:14

合泰单片机内部EEPROM,4*4按键及存储区切换
;内容:按按键调用EEPROM内部数据通过数码管显示出来 ;数码管段码接法A-PD0,B-PD1....G-PD6,H-PD7 ;数码管位码接法OM0-PC0...COM4-PC3 ;按键接法行PA.4-PA.7列PA.0-PA.3 ;完整源码下载:http://www.51hei.com/f/hteepr.rar ;1.内部EEPROM写与读操作 ;2.4*4按键 ;3.存储区切换 include HT66F50.inc ORG0000H JMPA1 ORG0014H ;多功能中断入口地址 JMPZD1 ORG002DH Q1: DC03FH; 0 DC006H; 1 DC05BH; 2 DC04FH; 3 DC066H; 4
[单片机]
msp430 EEPROM调试记录
总结一下出现的问题 1、使用1Mhz频率,并通过修改分频系数将主机频率降至100Khz左右,项目需要,将频率改成16Mhz,发现数据写入不成功,分频系数没有错误,判断应该是没有那么大的分频可以分(这个还未确定),通过选择ACLK,并在基础时钟上设置分频,分到最低2Mhz,再在usci_i2c中设置分频系数,就可以了 2、读写数据不一致 万思不得其解,写入一段数据,发现有些地址写进去,竟然只有几个字节有效,其他数据读出来均为0xff,也就是写未成功。这个是因为我的EEPROM如果使用页写入的话,是支持64字节的写入,这样,假如写入地址为0x30,后续只能写入16个字节,如果同时写入超过16个字节,数据只有部分写入。
[单片机]
MAX16047A/MAX16049A EEPROM可配置系
 MAX16047A /MAX16049A EEPROM 可配置系统管理器能够对多个系统电压进行监测、排序和跟踪。MAX16047A可以同时管理12路系统电压,MAX16049A可以管理8路电源电压。该系列器件都集成了用于监控电源电压的模/数转换器(ADC)和用于排序、跟踪电源(在上电和掉电时)的可配置输出。非易失EEPROM寄存器可配置用于记录电压的上限和下限,根据要求设置定时和排序,也可以存储关键的故障数据,以便在发生故障后回读故障信息。   内部1%精度的10位ADC对每路输入进行测量,并将结果与上、下限电压门限以及一路可配置为上限或下限的电压进行比较。当检测电压超出设定门限时,产生故障报警信号。针对不同的故障条件可以
[模拟电子]
MAX16047A/MAX16049A <font color='red'>EEPROM</font>可配置系
飞思卡尔单片机DZ60---EEPROM读写
//向EEPROM中写入数据,然后读出数据,赋值给PORTD,点亮相应的LED灯 #include hidef.h /* for EnableInterrupts macro */ #include derivative.h /* include peripheral declarations */ #define uint unsigned int #define uchar unsigned char #define LED PTDD #define LED_DIR PTDDD #define LED_OFF 0XFF void Read_EEPROM(uint start_addr, uchar
[单片机]
51单片机学习:I2C-EEPROM实验
实验名称:I2C-EEPROM实验 接线说明: 实验现象:下载程序后,数码管右4位显示0,按K1键将数据写入到EEPROM内保存, 按K2键读取EEPROM内保存的数据,按K3键显示数据加1,按K4键显示数据清零, 最大能写入的数据是255。 注意事项: ***************************************************************************************/ #include public.h #include 24c02.h #include key.h #include smg.h #define EEPROM_ADDRESS 0 //定义数据存入EEP
[单片机]
msp430f5438定时器1s的程序
void time_init_1s() { TA1CCTL0 = CCIE; // CCR0 interrupt enabled TA1CCR0 = 16383; TA1CTL = TASSEL_1 + MC_1 + TACLR; // ACLK, Up to CCR0 , clear TAR } //中断服务程序 #pragma vector=TIMER1_A0_VECTOR __interrupt void TIMER1_A0_ISR(void) { P5OUT ^=BIT4; TA1CCR0 += 16383; // Add Offset to CCR
[单片机]
AT28C系列EEPROM中数据的保护
1 前言   EEPROM是一种具有掉电记忆功能的存贮器,其内容可以象普通RAM一样进行改写,而且改写时能够自动擦除并换成新内容。它不象EPROM那样需要紫外线擦除;而只需用电即可擦除并改写存贮在其内部的内容。EEPROM通常在内部带有编程电源。由于它只需外接单一+5V电源,因此使用起来十分方便。和串行芯片相比,并行EEPROM的电路接口和编程设计均简单得多,所以在对电路板面积要求不很苛刻的情况下,使用EEPROM存贮器还是十分的方便。 2 并行EEPROM中数据丢失的原因   并行EEPROM通常采用总线扩展接口方法,图1所示是基于AT28C256的接口电路,其中为地址译码产生的片选信号为单片机的读、写信号。 编程时,只需
[单片机]
AT28C系列<font color='red'>EEPROM</font>中数据的保护
利用STM32的FLASH模拟 EEPROM(F103)系列
STM32的FLASH是用来存储主程序的,ST公司为了节约成本,没有加入 EEPROM,但是许多场合下我们需要用EEPROM;不过FLASH的容量还是可观的,我们可以利用FLASH模拟EEPROM。 根据《STM32F10X闪存编程》中的介绍,FLASH除了保存用户代码的部分,其余部分我们是可以利用其作为数据存储使用的。stm32的FLASH分为主存储块和信息块。主存储块用于保存具体的程序代码和用户数据,信息块用于负责由stm32出厂是放置2KB的启动程序(Bootloader)并锁死,用户无法更改。选项字节存储芯片的配置信息及对主存储块的保护信息。STM32的FLASH主存储块按页组织,有的产品每页1KB,有的产
[单片机]
利用STM32的FLASH模拟 <font color='red'>EEPROM</font>(F103)系列
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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