📄 demo.c
字号:
/*
LuckyProg Mega8 BootLoader 引导程序 V1.0
文件名 : demo.c
作 者: 芯 艺
更新时间: 2004-08-30
CPU : ATMEGA8
时 钟: 4MHz
编 译: WinAVR-20040720
E-mail : changfutong@sina.com
MSN : changfutong@hotmail.com
OICQ : 27796915
欢迎访问: http://BitFu.yeah.net
注:本程序在硬件上调试通过,
与计算机程序LuckyProg Mega8 BootLoader(LuckyProg M8BL)V1.0配合使用。
*/
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/boot.h>
#define uchar unsigned char
#define uint unsigned int
#define FREQ 4
#define UART_ACK 0XAA
#define PAGE_SIZE 64
uint g_wPageIndex=0; //
uchar g_aPageTemp[PAGE_SIZE];
void (*reset)(void)=0x0000;
void uart_putc(uchar c)
{
while( !(UCSRA & (1<<UDRE)) );
UDR=c;
}
uchar uart_getc(void)
{
while( !(UCSRA & (1<<RXC)) );
return UDR;
}
void WritePage(void)
{
uchar i;
// 接收当前页面数据
for(i=0;i<PAGE_SIZE;i++)
g_aPageTemp[i]=uart_getc();
// 页擦除操作
boot_page_erase(g_wPageIndex<<6);
while(boot_rww_busy())
boot_rww_enable();
// 填充缓冲页
for(i = 0; i < PAGE_SIZE; i += 2)
boot_page_fill((unsigned long)i,*((uint *)(g_aPageTemp +i)));
// 页写入操作
boot_page_write(g_wPageIndex<<6);
while(boot_rww_busy())
boot_rww_enable();
g_wPageIndex++;
}
void ReadPage(void)
{
uchar i;
for(i=0;i<PAGE_SIZE;i++)
uart_putc(pgm_read_byte(i+(g_wPageIndex*PAGE_SIZE)));
g_wPageIndex++;
}
int main(void)
{
uchar tmp;
//uart 初始化
UBRRH=0;
UBRRL=25;//9600 baud 6MHz:38 4MHz:25
UCSRB=(1<<RXEN)|(1<<TXEN);
while(1)
{
tmp=uart_getc();//recv command
switch(tmp)
{
case 0xB0://设置页地址
g_wPageIndex=uart_getc();
uart_putc(g_wPageIndex);
break;
case 0xBF://运行用户程序
reset();
break;
case 0xAF://写一页
WritePage();
uart_putc(UART_ACK);//应答
break;
case 0xA0://读一页
ReadPage();
break;
case UART_ACK://回应检测命令
uart_putc(UART_ACK);
break;
default:
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -