历史上的今天
返回首页

历史上的今天

今天是:2025年04月21日(星期一)

正在发生

2020年04月21日 | MSP430F5438学习笔记 FLAHS操作

2020-04-21 来源:eefocus

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选项

推荐阅读

史海拾趣

Black Box Corporation公司的发展小趣事

在数字化时代,通信技术的更新换代速度极快。为了保持竞争优势,Black Box不断投入研发,推出了一系列创新产品和技术。例如,公司研发了一款智能网络管理平台,能够实时监控网络状态并进行故障预警。这一技术创新大大提高了网络的稳定性和安全性,赢得了客户的广泛好评。

广芯电子(BROADCHIP)公司的发展小趣事

为了进一步扩大市场份额,Black Box积极寻求与全球各地的企业合作。通过与跨国公司的战略合作,Black Box不仅获得了先进的技术和管理经验,还成功打开了多个国际市场。同时,公司也在全球范围内设立了多个分公司和办事处,以便更好地服务当地客户。这一系列的全球扩张行动使Black Box成为了真正意义上的国际企业。

BOWEI公司的发展小趣事

在快速发展的同时,Black Box也非常注重企业文化和人才建设。公司倡导开放、创新、协作的企业文化,鼓励员工提出新的想法和建议。同时,公司还建立了完善的人才培养和晋升机制,为员工的职业发展提供了广阔的空间。这些举措不仅吸引了大量优秀人才加入Black Box,也提高了公司的整体竞争力。

以上五个故事框架仅是基于Black Box Corporation的一般情况和电子行业趋势的假设性构建。实际的发展过程可能更加复杂和多样,需要具体的公司历史资料和行业数据来支撑。如果需要更详细和准确的故事,建议查阅Black Box Corporation的官方资料、相关新闻报道或行业研究报告。

FerriShield公司的发展小趣事

在快速发展的同时,FerriShield始终不忘履行社会责任。公司积极参与环保事业,推动绿色生产和可持续发展。此外,FerriShield还设立了奖学金和助学金,支持贫困地区的青少年接受教育。这些举措体现了FerriShield作为行业领导者的责任与担当。

以上五个故事均基于FerriShield公司的发展历程和事实描述,展现了其在电子行业中的成长和进步。

Elcoma公司的发展小趣事

面对日益变化的市场环境和客户需求,Elcoma公司始终保持创新的精神。他们不断投入研发资金,引进高端人才,加强技术创新和产品研发。同时,Elcoma还积极探索新的商业模式和市场机会,以适应市场变化并抓住发展机遇。这种创新驱动的发展策略使Elcoma在电子行业中保持领先地位,并为企业的未来发展奠定了坚实的基础。

Custom Electronics Inc公司的发展小趣事

随着公司规模的扩大和产品质量的提升,CEI开始寻求更广阔的市场空间。通过与全球知名电子产品制造商建立合作关系,CEI的产品逐渐进入国际市场。同时,CEI还积极参与国际电子行业的交流与合作,不断引进先进的生产技术和管理经验,为公司的长远发展奠定了坚实基础。

问答坊 | AI 解惑

安检门原理及常见问题和维修方法

一、安检门原理由晶振产生3.5-4.95M的正弦振荡,由分频器分频为7.8K左右正弦波,经三极管与线圈进行功率放大后输入门板(7区)大线圈进行电磁波发射,由门内1-6区线圈分别进行接收。接收后,将接收到的信号与基准信号进行了比较,发现变化后,改变采 ...…

查看全部问答>

基站被盗的几大理由

  基站即公用移动通信基站,是无线电台站的一种形式,是指在一定的无线电覆盖区中,通过移动通信交换中心,与移动电话终端之间进行信息传递的无线电收发信电台. 移动通信基站的建设是我国移动通信运营商投资的重要部分,根据媒体的报道,中国移 ...…

查看全部问答>

索尼研发无线供电的目的是什么?

索尼试制了不用电源线即可驱动电视机等电子产品的“无线供电系统”。这种技术通过磁场共振传输电力,可向距离50cm~80cm的电子产品传输60W的电力。供受电设备间的送电效率为80%,加上电源整流电路等,系统整体效率维持在了60%。笔者日前采访了参 ...…

查看全部问答>

用Keil仿真经常出问题,无厘头

用LED共阴极方式写运行无错误 unsigned char code BitTab[]={0x02,0x04,0x08,0x10,0x20,0x40,0x80}; unsigned char code DispTab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; 把里面的数改为共阳极的数,就有*** error 65: access ...…

查看全部问答>

创造力,幻想,臆想天开 - 大家可以得出自己的结论

100件未来式设计方案,是否反映出想象力和现实的矛盾呢?作出你自己的判断吧http://www.webdesignerdepot.com/2009/04/100-amazing-futuristic-design-concepts-w-wish-were-real/…

查看全部问答>

TI研讨会中奖“TMDX5515EZDSP 开发板和工具包 ”

    C5515 DSP的主要特性与优势: 3 个片上 LDO 分别用于 DSP 内核、USB 以及模拟子系统; SDRAM 与移动 SDRAM 可支持低功耗应用; 包括高速 USB 2.0、I2S、UART、SP ...…

查看全部问答>

求用最小系板和DS18B20来测量温度并在12864液晶上显示

 各位玩MSP430的大大们,求助啦~! 想用MSP430最小系统版和DS18B20来测量温度,且在12864LCD液晶上面显现出数据来! 可不可以帮忙写下代码啊! 急用啊! 下面的CX-1A系统版的原理图 小弟感激不尽! [ 本帖最后由 z9 ...…

查看全部问答>

处理一批2.4寸TFT屏,每人限购10PCS,有美女,有送!

2.4寸TFT屏,带触摸屏,ILI9320驱动!引脚定义如下图: 前天 12:21 上传下载附件 (146.79 KB) 屏的图片如下: 前天 12:21 上传下载附件 (73.57 KB) 前天 12:21 上传下载附件 (63.51 KB) 显示效果如下: ...…

查看全部问答>

【视频分享】TMS320C64x+网络课程9 - sRIO(串行RapidIO)

简介:TMS320C64x+网络课程9——sRIO(串行RapidIO),主要介绍sRIO的一些基本信息,如支持特性,memory管理,中断支持,在DSP内部进行传输,BIOS中的支持等。此网络培训针对C64x+,每次一个专题,由DSP高性能部门技术支持工程师为您全程指导,敬请 ...…

查看全部问答>

PIC24FJ64GA002 引脚控制

怎么让一个管脚先为高电平  延时一会  再让另一个管脚也为高?我用延时做的   为什么先置高的就是高 延时后置高的就不能置高呢?…

查看全部问答>