📄 flash.c
字号:
/***********************************************************/
/* */
/* CPU:AT89c55 20MHZ */
/* Copyright 2004.09 Comelit */
/* AUTHOR: LV_XIAO_LU */
/* */
/***********************************************************/
#include "reg52.h"
#include "string.h"
#include "define.h"
#include "variable.h"
#include "typedef.h"
#include "function.h"
//sbit LED_CTR = P1^1 ;
#define BRIGHT_ON 0
#define BRIGHT_OFF 1
void Mes_init(void);
void Write_sector(register unsigned char xdata *des_adr,register unsigned char xdata *s_adr);
void Write_flash_hd(void);
void Code_init(void);
void Copy_var_to_mem(void);
void Copy_mes_to_mem(void);
void Copy_mem(void);
void Store_mes(void);
void Message_hd(void);
void Write_flash_hd(void);
//unsigned char Test_hardware(void);
/*const code unsigned char rom_verify_data_tbl[] =
{0x00,0x00,0x00,0x8f,0x8d,0x8c,0x67,0x65,0x66,0x6a,0x64,0x5d,
0x80,0x80,0x80,0x88,0x85,0x82,0x6a,0x6a,0x6d,0x8f,0x8d,0x90,
0x80,0x80,0x80,0x7e,0x7e,0x7e,0x68,0x6b,0x70,0x7b,0x7d,0x7c,
0x80,0x80,0x80,0x71,0x6d,0x69,0x84,0x82,0x81,0x8d,0x8f,0x8f};
const unsigned int rom_test_addr[] =
{0x8000,0x9999,0xaaaa,0xd555};*/
/**************************************************/
/* dst_adr指向外部FLASH MEMORY的要写的段地址 */
/* s_adr指向SRAM里要写入FLASH MEMORY里的内容的地址*/
/**************************************************/
void Write_sector(register unsigned char xdata *dst_adr,register unsigned char xdata *s_adr)
{
register unsigned int i;
/*保护段数据特殊功能码:3个*/
special_addr1 = 0xaa;
special_addr2 = 0x55;
special_addr1 = 0xa0;
// EA = 0; // 禁止中断以防写FLASH时出错
/*费时3.4MS*/
for(i=0;i<256;i++)
{
*(dst_adr+i) = *(s_adr+i) ;
}
// EA = 1;
}
/***************************************************/
/* init_code用于指示系统是否进行过系统工作初始化 */
/***************************************************/
void Code_init(void)
{
init_code[0] = init_code_b[0];
init_code[1] = init_code_b[1];
init_code[2] = init_code_b[2];
}
/***************************************************/
/***************************************************/
void Mes_init(void)
{
unsigned char i;
Page_switch(PAGE_0);
Code_init();
if((init_code[0]==0xa5)&&(init_code[1]==0x5a)&&(init_code[2]==0xaa)) //已初始化信息列表
{
Copy_mem();
}
else
{
Mes_tcb_init();
init_code[0]=0xa5;
init_code[1]=0x5a;
init_code[2]=0xaa;
/*以下函数实现将从SRAM里0X00开始128个字节(1段)送到FLASH MEMORY 0X1000开始的128*/
/*个字节中去,即在FLASH MEMORY中备份重要数据*/
Page_switch(PAGE_0);
Write_sector((unsigned char xdata*)(0x1000),(unsigned char xdata*)0x00);
Delay_10ms();
/*备份mes_control 到FLASH MEMORY中的mes_control_b*/
for(i=0;i<8;i++)
{
Write_sector((unsigned char xdata*)(0x1100 + i*256),(unsigned char xdata*)(0x100 + i*256));
Delay_10ms(); //延时10MS
}
}
}
/*******************************************************/
/*该函数用于将FLASH 内存块内变量COPY到SRAM中的变量区 */
/*******************************************************/
void Copy_var_to_mem(void)
{
register unsigned char i;
unsigned char xdata *source = (unsigned char xdata*)(0x1000);
unsigned char xdata *dest = (unsigned char xdata*)0x00;
for(i=0;i<7;i++)
*(dest+i) = *(source+i);
}
/**********************************************************************/
/*该函数用于将FLASH 内存块内mes_control_b COPY到SRAM中的mes_control */
/**********************************************************************/
void Copy_mes_to_mem(void)
{
register unsigned char i;
register unsigned int j;
unsigned char xdata *source = (unsigned char xdata*)(0x1100);
unsigned char xdata *dest = (unsigned char xdata*)0x100;
if(write_F == 0)
{
for(i=0;i<8;i++)
{
for(j=0;j<256;j++)
{
*dest = *source;
dest++;
source++;
}
Delay_10ms();
}
}
}
/*******************************************************/
/*******************************************************/
void Copy_mem(void)
{
Page_switch(PAGE_0);
Copy_var_to_mem();
Copy_mes_to_mem();
}
/**************************************************************/
/*actual_store_p: 在写数据时实际指向FLASH的地址指针 */
/*actual_fetch_p: 在写数据时实际从rx_prc_buff中读时指向的指针*/
/**************************************************************/
void Store_mes(void)
{
register unsigned int i=0;
Page_switch(page_addr); //切换到要存贮的那一块64K区域
/*数据保护*/
special_addr1 = 0xaa;
special_addr2 = 0x55;
special_addr1 = 0xa0;
// EA = 0;
while((i<256)&&(*actual_fetch_p != '\0'))
{
*actual_store_p = *actual_fetch_p ;
actual_store_p++;
actual_fetch_p++;
i++;
}
if(*actual_fetch_p == '\0')
{
*actual_store_p = '\0' ;
store_prc_F = 0; //不须要再存贮
}
// EA = 1;
write_delay_time = TM20MS;
write_F = 1 ;
}
/*******************************************************/
/* struct MES_CON_BLOCK xdata *prc_ctr_block 表示指向
/*从链表中分配到的用于存贮信息的内存块
/*******************************************************/
void Message_hd(void)
{
if((received_mes_F == 1)&&(store_prc_F == 0)&&(write_F == 0))
{
prc_ctr_block = Create_tcb_block(); //得到内存块并先将其挂回disp_tcb_list中
received_mes_F = 0 ;
actual_store_p =(unsigned char xdata*)prc_ctr_block->mes_addr.address.address; //得到信息放置的地址
actual_fetch_p = mes_data; //从何处开始取得存贮的信息
page_addr = (unsigned char)prc_ctr_block->mes_addr.address.page_addr;
store_prc_F = 1;
pre_store_prc_F = 1;
// Bank_switch(page_addr); //存贮信息时先切换页
Store_mes();
}
else if(write_F == 0)
{
if(store_prc_F == 1) //写flash操作结束却信息没存完,继续
Store_mes();
else if(pre_store_prc_F == 1) //如果存信息刚结束
{
pre_store_prc_F = 0;
Page_switch(PAGE_0);
prc_ctr_block -> new_old_F = NEW;
}
}
}
/*******************************************************/
/*******************************************************/
void Write_flash_hd(void)
{
if(write_F == 1)
{
if(write_delay_time != 0)
write_delay_time--;
if(write_delay_time == 0)
write_F = 0;
}
}
/*******************************************************/
/* 此函数用于测试硬件线路所用,向特定的RAM和FLASH中写入*/
/* 特定的数据,然后读出,就可据此判别硬件线路是否正常 */
/*******************************************************/
/*
unsigned char Test_hardware(void)
{
unsigned char hard_status = 0;
unsigned char test_step = 0;
while(test_step<3)
{
switch(test_step)
{
case 0: //测试RAM硬件线路
test_ram_adr1 = 0x00;
test_ram_adr2 = 0x55;
test_ram_adr3 = 0xaa;
if((test_ram_adr1 == 0x00)&&(test_ram_adr2 == 0x55)
&&(test_ram_adr3 == 0xaa))
test_step++; //如果RAM硬件没问题,再测试FLASH硬件线路
else //RAM硬件有问题,
{
hard_status = 1;
test_step = 3;
}
break;
case 1: // 先测试FLASH的首64K的硬件线路
Page_switch(PAGE_0);
special_addr1 = 0xaa;
special_addr2 = 0x55;
special_addr1 = 0xa0;
test_flash_adr1 = 0x00;
Delay_10ms();
special_addr1 = 0xaa;
special_addr2 = 0x55;
special_addr1 = 0xa0;
test_flash_adr2 = 0x55;
Delay_10ms();
special_addr1 = 0xaa;
special_addr2 = 0x55;
special_addr1 = 0xa0;
test_flash_adr3 = 0xaa;
Delay_10ms();
if((test_flash_adr1 == 0x00)&&(test_flash_adr2 == 0x55)
&&(test_flash_adr3 == 0xaa)) //FLASH 硬件没问题
test_step++;
else
{
hard_status = 2;
test_step = 3;
}
break;
case 2:
Page_switch(PAGE_1); // 测试FLASH的次64K的硬件线路
special_addr1 = 0xaa;
special_addr2 = 0x55;
special_addr1 = 0xa0;
test_flash_adr1 = 0x00;
Delay_10ms();
special_addr1 = 0xaa;
special_addr2 = 0x55;
special_addr1 = 0xa0;
test_flash_adr2 = 0x55;
Delay_10ms();
special_addr1 = 0xaa;
special_addr2 = 0x55;
special_addr1 = 0xa0;
test_flash_adr3 = 0xaa;
Delay_10ms();
if((test_flash_adr1 == 0x00)&&(test_flash_adr2 == 0x55)
&&(test_flash_adr3 == 0xaa))
test_step++;
else
{
hard_status = 3;
test_step++;
}
Page_switch(PAGE_0); //切换回正常状态
break;
default:
test_step = 3;
break;
}
}
Page_switch(PAGE_0);
return(hard_status);
}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -