📄 main.c
字号:
/************************************************************************************
**函数名 :main.c
**描 述 :系统主函数
**版 本 :
**备 注 :
**时 间 :2007-5-25
**设 计 :
**修 改 :
************************************************************************************/
#include "msp430x14x.h"
#include "In430.h"
#include "main.h"
#include "m430io.h"
unsigned long ulCurrent_Time;
unsigned char ucOut_Shift_Data;
unsigned long ulDb_Address;
unsigned long ulStart_Db_Address;
unsigned int uiRepon_Data_Num;
extern unsigned char ucTax_Rcv_Stage;
extern unsigned int ex_uart_tx_pointer;
extern unsigned char ex_tx_data_go_flag;
extern unsigned int tax_tx_num;
extern unsigned char tax_rx[MAX_RECV_LEN],tax_tx[MAX_SEND_LEN];
extern unsigned int tax_uart_var;
extern unsigned char ucOut_Shift_Data;
void ini_system(void);
void ini_system(void);
void Wrt_Database(void);
void Snd_Repon_Cmd(void);
void Store_Sector_Addr(void);
void Read_Last_Address(void);
void Read_Store_Data(unsigned long sector_addr);
extern void init_430(void);
extern void Chip_Erase(void);
extern void WRDI(void);
extern void WREN(void);
extern void EWSR(void);
extern void WRSR(unsigned char w_byte);
extern void Sector_Erase(unsigned long Dst);
extern void Auto_Add_IncB(unsigned char byte);
extern void Auto_Add_IncA(unsigned long Dst, unsigned char byte);
extern unsigned char Read(unsigned long Dst);
extern void ex_shift_reg(unsigned char ex_data);
extern void ex_tx_data(void);
/************************************************************************************
**函数名 :WDTTimerISR
**描 述 :看门狗定时器中断处理8ms
**时 间 :2007-5-25
**修 改 :
**备 注 :
************************************************************************************/
interrupt[WDT_VECTOR] void WDTTimerISR (void)
{
ulCurrent_Time += 1;
}
/************************************************************************************
**函数名 :ini_system
**描 述 :系统初始化
**时 间 :2007-5-25
**修 改 :
**备 注 :
************************************************************************************/
void ini_system(void)
{
TXBUF1 = 0x00;
ucOut_Shift_Data=0;
ucOut_Shift_Data |=0x08;
ucOut_Shift_Data &=0xfb;
ex_shift_reg(ucOut_Shift_Data);
P2OUT |= AUD_PTT + SUB_PTT;
tax_uart_var=0;
tax_tx_num=0;
ex_tx_data_go_flag=0;
ex_uart_tx_pointer=0;
ulDb_Address=0;
ulCurrent_Time=0;
ucTax_Rcv_Stage=COM0_RCV_STAGE_IDLE;
//ulStart_Db_Address=0x4000;
//ulDb_Address=0x4000;
uiRepon_Data_Num=0;
}
/************************************************************************************
**函数名 :main
**描 述 :函数主程序
**时 间 :2007-5-25
**修 改 :
**备 注 :
************************************************************************************/
void main(void)
{
unsigned long tmp_time;
init_430();
ini_system();
IE1 |= WDTIE;
_EINT();
tmp_time=ulCurrent_Time;
while(tmp_time+375>ulCurrent_Time)
{
}
Read_Last_Address();
while(1)
{
tmp_time=0;
Wrt_Database();
_NOP();
}
}
/************************************************************************************
**函数名 :Read_Store_Data
**描 述 :读取一定个数的数据
**时 间 :2007-5-25
**修 改 :
**备 注 :
************************************************************************************/
void Read_Store_Data(unsigned long sector_addr)
{
unsigned long tmp_loop;
unsigned long tmpr_time;
unsigned char tmpr_data;
WRDI();
tax_tx[0]=0x03;
tax_tx[1]=0x10;
for(tmp_loop=0;tmp_loop<uiRepon_Data_Num;tmp_loop++)
{
tmpr_data=Read(sector_addr+tmp_loop);
tax_tx[tmp_loop+2]=tmpr_data; //读取指定数目的数据
}
tax_tx[uiRepon_Data_Num+2]=0x02;
tax_tx[uiRepon_Data_Num+3]=0x10;
tax_tx_num=uiRepon_Data_Num+4; //向串口发送数据的个数
ex_tx_data();
tmpr_time=ulCurrent_Time;
while(tmpr_time+50>ulCurrent_Time)
{
}
}
/************************************************************************************
**函数名 :Read_Last_Address
**描 述 :接着上次地址读
**时 间 :2007-5-25
**修 改 :
**备 注 :
************************************************************************************/
void Read_Last_Address(void)
{
unsigned char tmpc_data;
unsigned int tmpc_data1;
unsigned long tmpc_data2;
tmpc_data2=0;
tmpc_data=0;
tmpc_data1=0;
WRDI();
tmpc_data=Read(0x3000);
tmpc_data2=tmpc_data;
ulDb_Address=tmpc_data2<<24;
tmpc_data=Read(0x3001);
tmpc_data2=tmpc_data;
ulDb_Address+=(tmpc_data2<<16);
tmpc_data=Read(0x3002);
tmpc_data1=tmpc_data;
ulDb_Address+=(tmpc_data1<<8);
tmpc_data=Read(0x3003);
ulDb_Address+=tmpc_data;
if(ulDb_Address==0xffffffff) //如果是第一次写入,则从4000开始
{
ulDb_Address=0x4000;
}
ulStart_Db_Address=ulDb_Address; //更新存储器地址
}
/************************************************************************************
**函数名 :Wrt_Database
**描 述 :写数据
**时 间 :2007-5-25
**修 改 :
**备 注 :
************************************************************************************/
void Wrt_Database(void)
{
unsigned char tmp_data[1000];
unsigned int tmp_ttt;
unsigned int tmp_kkk;
unsigned long tmpw_addr;
unsigned long tmpw_addr1;
if(ucTax_Rcv_Stage==COM0_RCV_STAGE_FULL)
{
ucTax_Rcv_Stage=COM0_RCV_STAGE_IDLE;
if((tax_rx[0]==0x99)&&(tax_rx[1]==0xaa)) //读取数据命令
{
tmpw_addr=tax_rx[2];
tmpw_addr=tmpw_addr<<24;
tmpw_addr1=tax_rx[3];
tmpw_addr+=((tmpw_addr1<<16)&0xff0000);
tmpw_addr1=tax_rx[4];
tmpw_addr+=((tmpw_addr1<<8)&0xff00);
tmpw_addr+=tax_rx[5]; //读取数据地址
uiRepon_Data_Num=((tax_rx[6]<<8)&0xff00);
uiRepon_Data_Num+=tax_rx[7]; //读取数据个数
Read_Store_Data(tmpw_addr);
}
else if((tax_rx[0]==0x99)&&(tax_rx[1]==0xbb))//整片擦除flash
{
EWSR();
WRSR(0);
WREN();
Chip_Erase();
WRDI();
Snd_Repon_Cmd();
}
else if((tax_rx[0]==0x99)&&(tax_rx[1]==0xcc))//擦除扇区命令
{
tmpw_addr=tax_rx[2];
tmpw_addr=tmpw_addr<<24;
tmpw_addr1=tax_rx[3];
tmpw_addr+=((tmpw_addr1<<16)&0xff0000);
tmpw_addr1=tax_rx[4];
tmpw_addr+=((tmpw_addr1<<8)&0xff00);
tmpw_addr+=tax_rx[5];
ulStart_Db_Address=tmpw_addr; //扇区地址
EWSR();
WRSR(0);
WREN();
Sector_Erase(tmpw_addr);
WRDI();
Snd_Repon_Cmd();
}
else if((tax_rx[0]==0x99)&&(tax_rx[1]==0xdd))
//输入要下载数据的扇区
{
EWSR();
WRSR(0);
WREN();
Sector_Erase(0x3000);
Auto_Add_IncA(0x3000,tax_rx[2]);
for(tmp_ttt=3;tmp_ttt<6;tmp_ttt++)
{
Auto_Add_IncB(tax_rx[tmp_ttt]); //输入要写入地址
}
WRDI();
tmpw_addr=tax_rx[2];
tmpw_addr=tmpw_addr<<24;
tmpw_addr1=tax_rx[3];
tmpw_addr+=((tmpw_addr1<<16)&0xff0000);
tmpw_addr1=tax_rx[4];
tmpw_addr+=((tmpw_addr1<<8)&0xff00);
tmpw_addr+=tax_rx[5];
ulStart_Db_Address=tmpw_addr;
Snd_Repon_Cmd(); //发送回应地址
}
else
{
if(ulStart_Db_Address!=0x4000)
{
Read_Last_Address();
}
ulDb_Address=ulStart_Db_Address;
tmp_kkk=0;
for(tmp_ttt=0;tmp_ttt<tax_uart_var;tmp_ttt++)
{
tmp_data[tmp_ttt]=tax_rx[tmp_kkk];
tmp_kkk++;
}
EWSR();
WRSR(0);
WREN();
Sector_Erase(ulDb_Address);
Auto_Add_IncA(ulDb_Address,tmp_data[0]);
ulDb_Address++;
for(tmp_ttt=1;tmp_ttt<tax_uart_var;tmp_ttt++)
{
Auto_Add_IncB(tmp_data[tmp_ttt]);
ulDb_Address++;
} //从预留的数据区中写入数据
WRDI();
Snd_Repon_Cmd(); //发送回应命令
Store_Sector_Addr();
}
}
_NOP();
}
/************************************************************************************
**函数名 :Store_Sector_Addr
**描 述 :存储地址
**时 间 :2007-5-25
**修 改 :
**备 注 :
************************************************************************************/
void Store_Sector_Addr(void)
{
unsigned char tmps_data;
unsigned char tmps_array[4];
unsigned long tmps_data1;
unsigned long tmps_data2;
ulStart_Db_Address=(ulStart_Db_Address+0x1000); //加上1000
tmps_data2=ulStart_Db_Address;
if(tmps_data2==0x100000)
{
tmps_data2=0x4000;
}
tmps_array[0]=((tmps_data2>>24)&0xff);
tmps_array[1]=((tmps_data2>>16)&0xff);
tmps_array[2]=((tmps_data2>>8)&0xff);
tmps_array[3]=(tmps_data2&0xff);
tmps_data1=0x3000;
EWSR();
WRSR(0);
WREN();
Sector_Erase(tmps_data1);
Auto_Add_IncA(tmps_data1,tmps_array[0]);
tmps_data1++;
for(tmps_data=1;tmps_data<4;tmps_data++)
{
Auto_Add_IncB(tmps_array[tmps_data]); //向0x3000写入数据地址
tmps_data1++;
}
WRDI();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -