⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flash_routines.c

📁 msp430串口程序 MSP430_UART_DEMO
💻 C
字号:
/***********************************************************************/
/* 7.6.2002修改:毛武斌                                                */
/*      增加段拷贝功能,从代码区指定地址拷贝128字节到FSEG_B            */
/* 2.25.2004   用 do..while 循环代替 for 循环,减少代码                */
/***********************************************************************/
#include "includes.h"

void flash_init(void)        //flash初始化  
{
   //FCTL2 = 0xA560;            //1/17MCLK
   FCTL2 ^= FXKEY + FN2 + FN1 + FN0;     // Set FLASH timing generator 447.5Khz
}


/***********************************************************************/
/*                         Flash_clr                                   */
/* erases 1 Segment of flash memory                                    */
/***********************************************************************/
void Flash_clr( int *Data_ptr )
{
  flash_init();
  FCTL3 = FWKEY;                        // Unlock the flash
  FCTL1 = FWKEY + ERASE;                // Enable flash segment erase
  *Data_ptr=0;              /* erase Flash segment */
}

/***********************************************************************/
/*                                                                     */
/* secure all flash    上锁,防止Flash被意外擦写                       */
/***********************************************************************/
void Flash_secure(void)
{
  FCTL1 = FWKEY;                        // Disable flash segment erase
  FCTL3 = FWKEY + LOCK;                 // Lock the flash
}
//************************************  *********************************/
//     从指定地址开始拷贝64字到FSEG_A或FSEG_B
//***********************************************************************/
int  Flash_copy_fseg( int *source_ptr, int *dest_ptr ){
     int   w;
     //stop_WDG;
     flash_init();
      //clear dest seg
     Flash_clr(dest_ptr);
                         //set to write mode to prepare for copy
     //_DINT();
     FCTL3 = 0x0A500;          /* Lock = 0 */
     FCTL1 = 0x0A540;          /* WRT = 1 */
                         //copy from source to dest
     w = 64 + 1;
     while(--w)
     {
       *dest_ptr++=*source_ptr++;
     };     
     Flash_secure();
       // 校验
     w = 64 + 1;
     while(--w)
     {
       if(*--dest_ptr != *--source_ptr)
        return(-1);
     };    
    return(1);
}
//************************************  *********************************/
//  从指定地址拷贝count字节到指定地址
//***********************************************************************/
int  Flash_copy_char(char *source_ptr,char *dest_ptr,unsigned char count)
{
     int    w;
     //stop_WDG;
     //clear dest seg
     flash_init();
     Flash_clr((int *)dest_ptr);
                         //set to write mode to prepare for copy
     _DINT();
     FCTL3 = 0x0A500;          /* Lock = 0 */
     FCTL1 = 0x0A540;          /* WRT = 1 */
                         //copy from source to dest
     w = count + 1;
     while(--w)
     {
       //while((FCTL3 & BUSY) == BUSY);
       *dest_ptr++=*source_ptr++;
     };
     //*/
     while((FCTL3 & BUSY) == BUSY);
     Flash_secure();
       // 校验
     w = count + 1;
     _EINT();
     while(--w)
     {
       if(*--dest_ptr != *--source_ptr)
        return(-1);
     };    
    return(1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -