?? main.c
字號(hào):
/*******************************************************/
/*作者:ntzwq@wx88.net 廣州天河雙龍電子公司 */
/*******************************************************
2004-10-20 肖 鵬 修改
修改目的主要是配合我的串口控制器的軟件升級(jí)使用
1.原程序需要從BOOT啟動(dòng),現(xiàn)修改為從應(yīng)用程序區(qū)啟動(dòng)
2.為避免軟件下載后單片機(jī)要硬件復(fù)位的不便,在BOOT程序中
增加了看門(mén)狗復(fù)位功能
/******************************************************/
#include "self.h"
#include "assembly.h"
#include<iom8v.h>
extern unsigned char read_flash(unsigned int add);
/* 字符輸出函數(shù) */
void sendchar(unsigned char c)
{
while (!(UCSRA&(1<<UDRE)));
UDR=c;
}
/* 字符輸入函數(shù) */
unsigned char recchar(void)
{
while(!(UCSRA& (1<<RXC)));
return UDR;
}
/* UART初始化 */
void uart_init(void)
{
UCSRB=(1<<RXEN)|(1<<TXEN);//允許發(fā)送和接收
UBBR=51;
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位數(shù)據(jù)+1位STOP位
}
void iap(void)
{
unsigned int intval,address,data;
unsigned char val, ldata;
for(;;)
{
val=recchar();
if(val=='b') //啟動(dòng)看門(mén)狗對(duì)CPU復(fù)位
{
WDTCR=(1<<WDCE)|(1<<WDE);
}
if(val=='a')
{
sendchar('Y'); //Autoincrement is quicker
}
else if(val=='A') //write address
{
address=recchar(); //read address 8 MSB
address=(address<<8)|recchar();
address=address<<1; //convert from word address to byte address
sendchar('\r');
}
else if(val=='c') //Write program memory, low byte
{
ldata=recchar();
sendchar('\r');
}
else if(val== 'C') //Write program memory, high byte
{
data=ldata|(recchar()<<8);
fill_temp_buffer(data,(address)); //call asm routine.
address+=2;
sendchar('\r');
}
else if(val=='e') //Chip erase
{
for(address=0;address < APP_END;address += PAGESIZE) //Application section = 60 pages
{
write_page(address,0x03); //Perform page erase
}
sendchar('\r');
}
else if(val=='l') // write lockbits
{
write_lock_bits(recchar());
sendchar('\r');
}
else if(val== 'm') // write page
{
write_page((address),0x05);
sendchar('\r');
}
else if((val=='P')||(val=='L')) // Enter programming mode
{
sendchar('\r');
}
else if (val=='p')
{
sendchar('S');
}
else if(val=='R') //Read program memory
{
if (address>=APP_END)
{
sendchar(0xff);
sendchar(0xff);
address+=2;
}
else
{
intval=read_program_memory(address,0x00);
sendchar((char)(intval>>8)); //send MSB
sendchar((char)intval); //send LSB
address+=2;
}
}
else if (val == 'D')
{
EEARL = address;
EEARH = (address >> 8);
address++;
EEDR = recchar();
EECR |= (1<<EEMWE);
EECR |= (1<<EEWE);
while (EECR & (1<<EEWE))
;
sendchar('\r');
}
else if (val == 'd')
{
EEARL = address;
EEARH = (address >> 8);
address++;
EECR |= (1<<EERE);
sendchar(EEDR);
}
else if(val=='F') // read fuse bits
{
sendchar(read_program_memory(0x0000,0x09));
}
else if(val=='r') // read lock bits
{
sendchar(read_program_memory(0x0001,0x09));
}
else if(val=='N') // read high fuse bits
{
sendchar(read_program_memory(0x0003,0x09));
}
else if(val=='t') // Return programmer type
{
sendchar(device);
sendchar(0);
}
else if ((val=='x')||(val=='y')||(val=='T'))
{
recchar();
sendchar('\r');
}
else if (val=='S') // Return software identifier
{
sendchar('A');
sendchar('V');
sendchar('R');
sendchar('B');
sendchar('O');
sendchar('O');
sendchar('T');
}
else if (val=='V') // Return Software Version
{
sendchar('1');
sendchar('0');
}
else if (val=='s') // Return Signature Byte
{
sendchar(sig_byte3);
sendchar(sig_byte2);
sendchar(sig_byte1);
}
else if(val!=0x1b) // if not esc
{
sendchar('?');
}
}
}
void main(void)
{
uart_init();
sendchar('0'); //進(jìn)入BOOT區(qū)后,向串口發(fā)送“0upd”字符串
sendchar('u'); //通知PC機(jī)CPU已經(jīng)準(zhǔn)備好了軟件升級(jí)
sendchar('p');
sendchar('d');
iap();
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -