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

📄 main.c

📁 IAR Embedded Workbench下编译的sst25lf080a操作的MSP430程序包括串口通讯
💻 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 + -