📄 main.c
字号:
/*******************************************/
/* 广州天河双龙电子公司 */
/* http://www.sl.com.cn */
/* BOOT引导IAP应用演示程序 */
/* 作者:ntzwq@wx88.net */
/* 2002年5月11日 */
/* 目标MCU:MEGA8 晶振:外部(EXT) 8MHZ */
/*******************************************/
#include "self.h"
#include "assembly.h"
#include<iom8v.h>
#define fosc 8000000 //晶振8MHZ
#define baud 19200 //波特率
#define osc_address 0x1ff0 //晶振校准字节的地址,此地址也可以是eeprom单元。
extern unsigned char read_flash(unsigned int add);
/* 字符输出函数 */
void sendchar(unsigned char c)
{
while (!(UCSRA&(1<<UDRE)));
UDR=c;
}
/* 字符输入函数 */
unsigned char recchar(void)
{
while(!(UCSRA& (1<<RXC)));
return UDR;
}
/* UART初始化 */
void uart_init(void)
{
OSCCAL=read_flash(osc_address);//对内部RC OSC调整
UCSRB=(1<<RXEN)|(1<<TXEN);//允许发送和接收
UBRRL=(fosc/16/(baud+1))%256;
UBRRH=(fosc/16/(baud+1))/256;
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位STOP位
}
void iap(void)
{
unsigned int intval,address,data;
unsigned char val, ldata;
for(;;)
{
val=recchar();
if(val=='a') //Autoincrement?
{
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)
{
void (*funcptr)( void ) = 0x0000; // Set up function pointer
DDRD=0;
PORTD=0xff;
uart_init();
if ((PIND&0x04)==0)
{
PORTD=0;
iap();
}
else
funcptr();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -