?? flash.c
字號(hào):
//[Flash.c]Flash擦寫(xiě)-------------------------------------------------------*
//本文件包含: *
// (1)Flash_Erase_Sector:擦除一個(gè)指定的扇區(qū) *
// (2)Flash_Write_Nword:向一個(gè)指定的區(qū)域?qū)懭肴舾蓚€(gè)字 *
// (3)Flash_unsecured:使用后門機(jī)制解除Flash的安全狀態(tài) *
// (4)Flash_SetKey:設(shè)置后門鑰匙 *
// (5)Flash_SetStatus:設(shè)置Flash的安全狀態(tài) *
//-------------------------------------------------------------------------*
//頭文件
#include "Flash.h" //Flash擦寫(xiě)頭文件
//內(nèi)部調(diào)用函數(shù)聲明
void Erase_Write_Pretreat(INT8U page); //擦寫(xiě)子函數(shù)內(nèi)部調(diào)用的函數(shù)聲明
//頁(yè)所對(duì)應(yīng)的塊對(duì)照表
//兩個(gè)flash塊,每塊4頁(yè) flash0 flash1
const INT8U pagetable[2][4] = {{0x3C,0x3D,0x3E,0x3F},{0x38,0x39,0x3A,0x3B}};
//Flash_Erase_Sector:擦除指定的扇區(qū)----------------------------------------*
//功 能:對(duì)頁(yè)號(hào)為page,扇區(qū)首地址為addr的一個(gè)扇區(qū)進(jìn)行擦除 *
//參 數(shù):page--頁(yè)映射地址(0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F) *
// addr--扇區(qū)首地址(偶數(shù)) *
//返 回:無(wú) *
//注 意:調(diào)用該函數(shù)之前,必須確定要擦除的區(qū)域可擦除 *
//-------------------------------------------------------------------------*
void Flash_Erase_Sector(INT8U page,INT16U addr)
{
//1 判斷是否已分頻、清相關(guān)錯(cuò)誤標(biāo)志、根據(jù)頁(yè)號(hào)選擇相應(yīng)的flash塊
Erase_Write_Pretreat(page); //擦寫(xiě)子函數(shù)共同調(diào)用的內(nèi)部子函數(shù)
PPAGE = page; //設(shè)置頁(yè)寄存器
//2 向要擦除的扇區(qū)首地址寫(xiě)任意值(注意:經(jīng)實(shí)驗(yàn)證實(shí),不可以寫(xiě)0x0000)
*(INT16U *)addr = 0xFFFF;
//3 向命令寄存器寫(xiě)扇區(qū)擦除命令
FCMD = 0x40;
//4 在加高壓期間,調(diào)用RAM區(qū)的機(jī)器碼,相當(dāng)于兩條語(yǔ)句:
// FSTAT=0x08;
// while(!(FSTAT&0x40));
asm("CALL PrgOfRam");
}
//Flash_Write_Nword:向指定的扇區(qū)寫(xiě)入若干個(gè)字-------------------------------*
//功 能:將從address_source開(kāi)始的len個(gè)字,寫(xiě)入頁(yè)號(hào)為 page,起始地址為 *
// address_destination的扇區(qū) *
//參 數(shù):page--頁(yè)映射地址(0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F) *
// address_destination--目標(biāo)扇區(qū)首地址(偶數(shù)) *
// address_source--源地址 *
// len--字節(jié)數(shù) *
//返 回:無(wú) *
//注 意:調(diào)用該函數(shù)之前,必須確定要寫(xiě)入的區(qū)域可寫(xiě)入 *
//-------------------------------------------------------------------------*
void Flash_Write_Nword(INT8U page,INT16U address_destination,
INT16U address_source,INT8U len)
{
INT8U m;
//1 判斷是否已分頻、清相關(guān)錯(cuò)誤標(biāo)志、根據(jù)頁(yè)號(hào)選擇相應(yīng)的flash塊
Erase_Write_Pretreat(page); //擦寫(xiě)子函數(shù)共同調(diào)用的內(nèi)部子函數(shù)
PPAGE = page; //設(shè)置頁(yè)寄存器
//2 寫(xiě)入若干個(gè)字
for (m=0; m<len; m++)
{
//(1) 將源地址的一個(gè)字寫(xiě)入目標(biāo)地址
*(INT16U *)address_destination = *(INT16U *)address_source;
//(2) 向命令寄存器寫(xiě)字寫(xiě)入命令
FCMD = 0x20;
//(3) 在加高壓期間,調(diào)用RAM區(qū)的機(jī)器碼,相當(dāng)于兩條語(yǔ)句:
// FSTAT=0x08;
// while(!(FSTAT&0x40));
asm("CALL PrgOfRam");
//(4) 源地址和目標(biāo)地址同時(shí)向后移一個(gè)字
address_destination = address_destination+2;
address_source = address_source+2;
}
}
//Erase_Write_Pretreat:開(kāi)始擦除或?qū)懭肭暗墓膊僮餍蛄凶雍瘮?shù)----------------*
//功 能:判斷是否已分頻;清相關(guān)錯(cuò)誤標(biāo)志;根據(jù)頁(yè)號(hào)選擇相應(yīng)的flash塊;如果頁(yè)號(hào)不*
// 為0,則設(shè)置PPAGE寄存器 *
//參 數(shù):page--頁(yè)映射地址(0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F) *
//返 回:無(wú) *
//-------------------------------------------------------------------------*
void Erase_Write_Pretreat(INT8U page)
{
INT8U i,j;
//1 判斷是否設(shè)置時(shí)鐘分頻,若無(wú)分頻,則先分頻
if ((FCLKDIV&0x80) == 0) FCLKDIV |= 0x03;
//2 清保護(hù)錯(cuò)誤和訪問(wèn)錯(cuò)誤標(biāo)志位
FCNFG |= 0x01; //FCNFG的第0位置1,選擇BLOCK1
FSTAT |= 0x30; //清保護(hù)錯(cuò)誤和訪問(wèn)錯(cuò)誤標(biāo)志位
FCNFG &= 0xFE; //FCNFG的第0位置0,選擇BLOCK0
FSTAT |= 0x30; //清保護(hù)錯(cuò)誤和訪問(wèn)錯(cuò)誤標(biāo)志位
//3 查表、選擇塊號(hào)
if (page != 0)
{
for (i = 0;i < 2;i++)
{
for (j = 0;j < 4;j++)
{
if (page == pagetable[i][j])
break;
}
if (j < 4)
break;
}
if (i == 0) FCNFG &= 0xFE; //頁(yè)號(hào)3C~3F,選擇BLOCK0
if (i == 1) FCNFG |= 0x01; //頁(yè)號(hào)38~3B,選擇BLOCK1
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -