當前位置:編程學習大全網 - 編程語言 - 飛思卡爾 mc9s12xs128 單片機 怎樣才可以 在EPROM 或者在 FASH 中 保存運行的參數?

飛思卡爾 mc9s12xs128 單片機 怎樣才可以 在EPROM 或者在 FASH 中 保存運行的參數?

有相關資料可以參考的,妳搜壹下flash to epprom相關資料:

用Flash模擬EEPROM

本程序利用S08系列單片機的片內Flash模擬EEPROM。解決部分8位機沒有EEPROM導致在運用上的局限。本程序提供壹個初始化函數和三個功能函數。用戶必須在調用功能函數前調用調用初始化函數。三個功能函數分別是字節寫入、字節讀取、EEPROM全擦除。用戶必須保證調用功能函數前有至少30Bate的棧空間。

本程序參考飛思卡爾公司提供的《在 HCS08 微控制器上使用 FLASH 存儲器模擬 EEPROM》。並在源程序的基礎上精簡了部分功能,減少了RAM使用量。並嘗試使用分頁機制確定EEPROM地址。

接口函數的EEPROM地址尋址由頁地址和頁內偏移量組成。即把用戶定義的EEPROM分為若幹個大小為256字節的頁。其地址與FLASH地址的換算關系為:

FLASH真實地址=EEPROM空間起始地址+頁地址×256+頁內偏移地址

用戶在使用EEPROM是只用確定數據保存在EEPROM的相對地址即可。接口函數原型為:

EEPROM_WRITE_DATA(數據,頁地址, 頁內偏移地址);

Char EEPROM_READ_DATA(頁地址, 頁內偏移地址);

1. 程序流程分析與設計。

由於S08系列單片機在Flash寫入時序中不能進行任何的Flash讀操作,Flash寫入指令必須放到RAM中執行並關閉所有可屏蔽中斷。程序流程如圖13-1-?。

字節寫入/.全擦除程序流程 字節讀取程序流程

圖13-1-?

2.程序源代碼。此程序在CodeWarrior 6.0繼承編譯環境中編譯通過

/*****************************************************/

//河南工業大學Freescale MCU&DSP聯合實驗室

// 文件名:flash_program.h

// CPU :MC9S08AW60

// 版 本:v1.0

// 日 期:2008年8月12日

// 調試環境:CodeWarrior 6.0

// 作 者:曾 滔

// 描 述: 頭文件,用於保存初始化EEPROM設定、用戶定制參數、編譯器參數等信息。

/*****************************************************/

#include <hidef.h>

#include "derivative.h"

#include <stdio.h>

/*************flash編程指令(請勿改動)*****************/

#define BLACK_CHECK 0x05 //查空指令

#define BITE_PROGRAM 0x20 //字節編程指令

#define BURST_PROGRAM 0x25 //快速編程指令

#define PAGE_ERASE 0x40 //頁擦除指令(1頁=512字節)

#define MASS_ERASE 0x41 //全擦除指令

/******用戶定制參數(根據單片機型號和用戶flash使用情況定制)**********/

#define EEPROM_START_ADDRESS 0xE000 //EEPROM區起始地址。512B的倍數

#define EEPROM_PAGE_NUM 8 //EEPROM頁數。1page=256B

#define BUS_FREQUENCY 2000 //總線頻率。單位(KHz)

/********************編譯器相關參數**************************/

#define INT8U unsigned char //無符號字節變量。根據編譯器更改。默認CodeWarrior 6.0

#define INT16U unsigned short int //無符號字變量。根據編譯器更改。默認CodeWarrior 6.0

/***********EEPROM API函數原型***********/

//初始化程序。此函數必須在使用EEPROM前調用。建議用戶在系統初始化是調用。

void INIT_EEPROM(void);

//EEPROM擦除函數。擦除所有EEPROM數據。

void EEPROM_ERASE(void);

//EEPROM字節寫入函數。寫入壹個字節到EEPROM指定區域。

void EEPROM_WRITE_DATA(INT8U data,INT8U EEPROM_page,INT8U offset_address)

//EEPROM讀出函數。讀出壹個指定的區域所保存的字節的到函數返回值。

char EEPROM_READ_DATA(INT8U EEPROM_page,INT8U offset_address);

/****************************END************************************/

/*****************************************************/

//河南工業大學Freescale MCU&DSP聯合實驗室

// 文件名:flash_program.c

// C P U :MC9S08AW60

// 版 本:v1.0

// 日 期:2008年8月12日

// 調試環境:CodeWarrior 6.0

// 作 者:曾 滔

// 描 述:提供了壹個初始化函數和三個功能函數供用戶調用,沒有可更改參數。

/*****************************************************/

#include "flash_program.h"

const INT8U FLASH_CODE[]={ // ; flash操作代碼

0x45, 0x18, 0x26, // LDHX #$1826 ; FCMD地址寫入H:X

0xA6, 0x00, // LDA #$00 ; 0x00為命令占位符

0xF7, // STA ,X ; 將命令寫入FCMD命令緩存器

0x5A, // DECX ; 指針指向 FSTAT

0xF6, // LDA ,X ;

0xAA, 0x80, // ORA #$80 ;

0xF7, // STA ,X ; 置位FSTAT_FCBEF。啟動flash寫入命令

0xF6, // LDA ,X ; 等待3個時鐘周期(請勿刪除此代碼)

0xF6, // LDA ,X ; 讀取FSTAT

0xA5, 0x30, // BIT #$30

0x26, 0x05, // BNE *+6 ; 錯誤則返回

//LOOP

0xF6, // LDA ,X ; 等待寫操作結束

0xA5, 0x40, // BIT #$40

0x27, 0xFB, // BEQ *-3 ; 跳轉到LOOP

//EXIT:

0X81 //RTS ; 返回

};

/*********************初始化函數**********************************/

#if BUS_FREQUENCY >= 12000

void INIT_EEPROM(void){FCDIV=(((BUS_FREQUENCY/(8*175)))|0x40)-1;}

#endif

#if BUS_FREQUENCY < 12000

void INIT_EEPROM(void){FCDIV=(BUS_FREQUENCY/175)-1;}

#endif

/***********************EEPROM字節寫入函數****************************/

void EEPROM_WRITE_DATA(INT8U data,INT8U EEPROM_page,INT8U offset_address)

{

INT16U address; //存放寫入地址

INT8U code_space[23]; //初始化代碼空間

if(EEPROM_page>=EEPROM_PAGE_NUM)return; //地址錯誤返回,保護用戶代碼

address=offset_address+EEPROM_page*256+EEPROM_START_ADDRESS; //地址轉化

(void)memcpy(code_space,FLASH_CODE,23); //復制flash操作代碼到RAM

code_space[4] = BITE_PROGRAM; //修改命令占位符為寫入命令

DisableInterrupts; //關中斷

if (FSTAT&0x10){ //清錯誤標誌

FSTAT = FSTAT|0x10;

}

_asm

{ //寫入初始化

LDHX address;

LDA data;

STA ,X; //寫入緩存

TSX;

JSR 2,x; //跳入RAM執行

}

EnableInterrupts; //開中斷

__RESET_WATCHDOG();

}

/********************EEPROM字讀取入函數********************************/

char EEPROM_READ_DATA(INT8U EEPROM_page,INT8U offset_address){

unsigned short int address; //地址變量

char rusult; //數據變量

address=offset_address+EEPROM_page*0x100+EEPROM_START_ADDRESS; //地址轉換

asm{

LDHX address;

LDA ,X; //讀取地址到數據變量

STA rusult;

}

__RESET_WATCHDOG();

return(rusult); //返回

}

/**********************EEPROM擦除函數********************************/

void EEPROM_ERASE(void)

{

INT16U address;

INT8U i; //循環變量

INT8U code_space[23];

for(i=0;i<(EEPROM_PAGE_NUM/2);i++){ //分頁擦除

address=i*0x200+EEPROM_START_ADDRESS;

(void)memcpy(code_space,FLASH_CODE,23); //復制flash操作代碼到RAM

code_space[4] = PAGE_ERASE; //修改命令占位符為擦除命令

DisableInterrupts; //關中斷

if (FSTAT&0x10){ //清錯誤標誌

FSTAT = FSTAT | 0x10;

}

_asm

{

LDHX address; //擦除地址寫入緩存

STA ,X;

TSX;

JSR 3,x; //跳入RAM執行

}

EnableInterrupts; //開中斷

__RESET_WATCHDOG();

}

}

/****************************END************************************/

/*****************************************************/

// 版權所有(c)河南工業大學

// 文件名:mian.c

// C P U :MC9S08AW60

// 版 本:v1.0

// 日 期:2008年8月12日

// 調試環境:CodeWarrior 6.0

// 作 者:曾 滔

// 描 述: 測試Flash模擬EEPROM程序。

/*****************************************************/

#include <hidef.h>

#include "derivative.h"

#include "flash_program.h"

void main(void){

char temp;

PTADD=0XFF;

INIT_EEPROM(); //初始化Flash控制寄存器。

do{

EEPROM_WRITE_DATA(88,0,0); //寫入壹個字節。

temp=EEPROM_READ_DATA(0,0); //讀取壹個字節

}while(temp!=88); //若寫入失敗則再次寫入

PTAD_PTAD0=1;

do{

EEPROM_ERASE();

}while(EEPROM_READ_DATA(0,0)!=0xff); //擦除Flash

PTAD_PTAD1=1;

for(;;)__RESET_WATCHDOG(); //死循環

}

  • 上一篇:工作範圍是指機器人什麽或手腕中心所能到達的點的集合
  • 下一篇:如何評價北大保安小哥英語詞匯量壹萬五?
  • copyright 2024編程學習大全網