zoukankan      html  css  js  c++  java
  • [转]MSP430单片机实践篇内部FALSH的操作

    //******************************************************************************
    // 测试MSP430单片机向FLASH中写入操作
    //
    // 描述; 每次掉电或复位后都能看到数码管上显示的数值增1,说明对flash的写入与读取成功
    //
    // 注意:修改flash中的内容必须首先执行擦除操作,
    // 因为对FLASH的操作只能将1写成0,而不能将0写成1只有擦除才能将0写回1
    // 擦除操作至少将擦除1个段
    //
    // 如果使用其它型号的单片机,只需将头文件改为相应的<msp430xx.h>;
    // 并在Option的Target中的device改为相应的cpu即可。
    //
    // 硬件连接:如下图
    // MSP430F13x
    // -----------------
    // /|\| XIN|-
    // | | |
    // --|RST XOUT|-
    // | |
    // | P5.0|-->LED_DOUT
    // | P5.2|-->LED_CLK
    // | P5.4|-->LED_LATCH
    //
    // 时间:2007年12月
    // www.goodmcu.cn
    //
    // 硬件电路:MSP430F135核心实验板-I型 + TY-DIS1(8位数码管显示模块)
    // 硬件连接:
    //
    // 调试器:MSP430FET全系列JTAG仿真器
    // 调试软件: IAR Embedded Workbench Version: 3.41A 编译
    //******************************************************************************

    #include <msp430x13x.h>

    ////预定义函数//////////////////////////////////////////////////////////////////
    void LED_595(char SMG1,char SMG2,char SMG3,char SMG4);//4位LED数码管显示子程序
    void Led_out(unsigned char X);//74HC595串行输出子程序
    void A16(unsigned int dd);// 16进制到4位10进制转换
    const unsigned char LED_0_F[];//LED数码管段码转换表

    void Flash_clr( int *Data_ptr );
    void Flash_ww( int *Data_ptr, int word );
    void Flash_wb( char *Data_ptr, char byte );

    ////变量定义////////////////////////////////////////////////////////////////////
    unsigned char Buffer[4];

    void main(void)
    {
    char *point,*readaa; // 定义2个指针,分别指向flash和变量aa
    char aa;

    //初始化IO口用于显示
    P5DIR =0; //P5口全部设为输入口
    P5SEL =0; //将P5口所有的管脚设置为一般I/O口
    P5DIR |= BIT0; //将P5.0 P5.2 P5.4设置为输出方向
    P5DIR |= BIT2;
    P5DIR |= BIT4;

    WDTCTL = WDTPW + WDTHOLD; //停止watchdog
    _DINT(); //对FLASH操作之前必须关闭中断

    readaa=&aa; //读取变量aa的地址;
    //在watch观察窗中可以通过readaa看到aa所在的地址及内容
    point=(char*)0xcb10; //设置要读取的flash地址为“0xcb10”
    //在watch观察窗中可以通过point看到0xcb10所在地址的内容
    *readaa=*point; //将flash数据读入aa
    aa=*point; //另一种将flash数据读入aa的方法

    aa++;

    Flash_clr((int*)0xcb00); //擦除0xcb00所在段,只有擦除才能将0写回1
    Flash_wb((char*)0xcb10,aa); //向0xcb10写入新的aa(字节)


    while(1)
    {
    A16(aa);
    LED_595(Buffer[0],Buffer[1],Buffer[2],Buffer[3]);
    }
    }

    //***FLASH操作类函数集**********************************************************
    //-----------------------------------------------------------------
    // Flash_wb
    //-----------------------------------------------------------------
    // 将1个字节(8 bit)写入到flash memory中
    void Flash_wb( char *Data_ptr, char byte )
    {
    FCTL3 = 0x0A500; /* Lock = 0 */
    FCTL1 = 0x0A540; /* WRT = 1 */
    *Data_ptr=byte; /* program Flash word */
    FCTL1 = 0x0A500; /* WRT = 0 */
    FCTL3 = 0x0A510; /* Lock = 1 */
    }
    //-----------------------------------------------------------------
    // Flash_ww
    //-----------------------------------------------------------------
    // 将1个字节(16 bits)写入到flash memory中

    void Flash_ww( int *Data_ptr, int word )
    {
    FCTL3 = 0x0A500; /* Lock = 0 */
    FCTL1 = 0x0A540; /* WRT = 1 */
    *Data_ptr=word; /* program Flash word */
    FCTL1 = 0x0A500; /* WRT = 0 */
    FCTL3 = 0x0A510; /* Lock = 1 */
    }
    //-----------------------------------------------------------------
    // Flash_clr
    //-----------------------------------------------------------------
    // 擦除1个段的flash memory
    void Flash_clr( int *Data_ptr )
    {
    FCTL3 = 0x0A500; /* Lock = 0 */
    FCTL1 = 0x0A502; /* ERASE = 1 */
    *Data_ptr=0; /* erase Flash segment */
    FCTL1 = 0x0A500; /* ERASE = 0 */
    FCTL3 = 0x0A510; /* Lock = 1 */
    }

    //***显示类函数集***************************************************************
    //------------------------------------------------------
    // 4位LED数码管显示子程序
    //
    // 人口参数:SMG1,SMG2,SMG3,SMG4——待显示的数据
    //
    void LED_595(char SMG1,char SMG2,char SMG3,char SMG4)
    {
    char z;
    //最高位(最左侧)LED数码管显示---------------------
    z = LED_0_F[SMG1];
    Led_out(z); //段码输出
    z = 0xFE; //位码
    Led_out(z); //位码输出

    P5OUT &=~(BIT4); //显示输出
    P5OUT |=BIT4;

    //次高位(左数第2个)LED数码管显示---------------------
    z = LED_0_F[SMG2];
    Led_out(z); //段码输出
    z = 0xFD; //位码
    Led_out(z); //位码输出

    P5OUT &=~(BIT4); //显示输出
    P5OUT |=BIT4;

    //次低位(左数第3位)LED数码管显示---------------------
    z = LED_0_F[SMG3];
    Led_out(z); //段码输出
    z = 0xFB; //位码
    Led_out(z); //位码输出

    P5OUT &=~(BIT4); //显示输出
    P5OUT |=BIT4;

    //最低位(左数第4位)LED数码管显示---------------------
    z = LED_0_F[SMG4];
    Led_out(z); //段码输出
    z = 0xF7; //位码
    Led_out(z); //位码输出

    P5OUT &=~(BIT4); //显示输出
    P5OUT |=BIT4;
    }

    //------------------------------------------------------
    // 用于74HC595的LED串行移位子程序
    //
    // 人口参数:X——待输出的数据
    //
    void Led_out(unsigned char X)
    {
    unsigned char i;
    for(i=8;i>0;i--)
    {
    if (X&0x80) P5OUT |=BIT0; else P5OUT &=~(BIT0);
    X<<=1;
    P5OUT &= ~(BIT2); //P5.2管脚输出低电平
    P5OUT |= BIT2; //P5.2管脚输出高电平
    }
    }

    //------------------------------------------------------ // LED段码转换表0——F //------------------------------------------------------ const unsigned char LED_0_F[] = {// 0 1 2 3 4 5 6 7 8 9 A b c d E F 不显示 - o(18)H(19)h(20)C(21)0(22)n(23) 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xA7,0xA1,0x86,0x8e,0xFF,0xbf,0xa3,0x89,0x8b,0xc6,0xc0,0xab }; 

  • 相关阅读:
    InChatter系统之服务器开发(一)
    InChatter系统开源聊天模块前奏曲
    System.Lazy<T>延迟加载
    系统的层级架构
    Android网络通信库Volley简介(转)
    switch case 忘记 break
    switch case 忘记 break
    C# Lock 解读
    JSON资料整理(转载)
    [Leetcode]253. 会议室 II(数组/堆)
  • 原文地址:https://www.cnblogs.com/sky1991/p/2645532.html
Copyright © 2011-2022 走看看