拜託一下,高手幫我看一下哪裡錯誤m128,bootloader
這是程式碼#include <inttypes.h>
#include <string.h>
#include <avr/io.h>
#include <avr/iom128.h>
#include <avr/boot.h>
#include <avr/sfr_defs.h>
#include <avr/pgmspace.h>
#define SPM_PAGESIZE 256 //M128的Flash 256字(128字)
#define BAUD 19200 //波特率采用19200bps
#define CRYSTAL 7372000 //系統頻率7.372MHz
//?算和定?M128的波特率?置??
#define BAUD_SETTING (unsigned char)((unsigned long)CRYSTAL/(16*(unsigned long)BAUD)-1)
#define BAUD_H (unsigned char)(BAUD_SETTING>>8)
#define BAUD_L (unsigned char)BAUD_SETTING
#define DATA_BUFFER_SIZE SPM_PAGESIZE //定義接收長度
//定義Xmoden控制字符
#define XMODEM_NUL 0x00
#define XMODEM_SOH 0x01
#define XMODEM_STX 0x02
#define XMODEM_EOT 0x04
#define XMODEM_ACK 0x06
#define XMODEM_NAK 0x15
#define XMODEM_CAN 0x18
#define XMODEM_EOF 0x1A
#define XMODEM_RECIEVING_WAIT_CHAR 'C'
const char startupString[]={'d','\r'};
unsigned char data;
uint16_t address = 0;
void write_one_page(void)
{
int i;
uint16_t dataword = 0;
for(i=0;i<SPM_PAGESIZE;i+=2)
{
dataword=((dataword=data)<<8);
dataword += data;
boot_page_fill(i,dataword);
}
boot_page_erase(address); //擦除一頁Flash
while(boot_rww_busy())
boot_rww_enable(); //等待擦除完成
boot_page_write(address); //將數據宰入下一個頁Flash
while(boot_rww_busy())
boot_rww_enable(); //等待寫入完成
}
//RS232發送一個字元
void uart_putchar(char c)
{
while(!(UCSR0A & 0x20));
UDR0 = c;
}
//RS232接收一個字元
unsigned char uart_getchar(void)
{
unsigned char status,res;
if(!(UCSR0A & 0x80)) return 0x20; //no data to be received
status = UCSR0A;
res = UDR0;
if (status & 0x1c) return 0X32; // If error, return -1
return res;
}
//等待收RS232接收一個有效的字元
unsigned char uart_waitchar(void)
{
unsigned char c;
while((c=uart_getchar())==0xd5);
return (unsigned char)c;
}
//計算CRC
unsigned int calcrc(unsigned char *ptr, int8_t count)
{
unsigned int crc = 0,i=0;
while (--count >= 0)
{
crc = crc ^ (unsigned int) *ptr++ << 8;
i = 8;
do
{
if (crc & 0x8000)
crc = crc << 1 ^ 0x1021;
else
crc = crc << 1;
} while(--i);
}
return crc;
}
//退出Bootloader程序,到0x0000運行程序
void quit(void)
{
uart_putchar('O');uart_putchar('K');
uart_putchar(0x0d);uart_putchar(0x0a);
while(!(UCSR0A & 0x20)); //等待?束提示信息回送完成
MCUCR = 0x01;
MCUCR = 0x00; //中段向量表移到應用程序
RAMPZ = 0x00; //RAMPZ清零初始化
asm("jmp 0x0000"); //跳到Flash的0x0000,應用的程序
}
//主程序
int main(void)
{
int i = 0;
unsigned char timercount = 0;
unsigned char packNO = 1;
unsigned char NO=0,NO1=0;
int bufferPoint = 0;
unsigned int crc;
DDRE =0x02;
//初始化M128的USART0
UCSR0B = (1<<RXEN)|(1<<TXEN); //Enable Receiver and Transmitter
UCSR0C = 0x0E; //Set frame format: 8data, 1stop bit
UBRR0H = BAUD_H;
UBRR0L = BAUD_L; //Set baud rate
//初始化M128的T/C0,15ms
OCR0 = 0x80;
TCCR0 = 0x0F;
//向PC机發送開始提示信息
while(startupString!='\0')
{
uart_putchar(startupString);
i++;
}
//3秒等待PC下?"d",否則退出Bootloader程序,到0x0000應用程序
while(1)
{
uart_getchar();
uart_putchar(uart_getchar());
if(uart_getchar()== 'd')
{break;}
if (TIFR & 0x02) //timer0 over flow
{
if (++timercount > 10) quit();
TIFR=TIFR | 0x02;
}
}
//每秒向PC机發送一個控制字符"C",等待控制字〈soh〉
while(uart_getchar()!=XMODEM_SOH) //receive the start of Xmodem
{
if(TIFR & 0x02) //timer0 over flow
{
if(++timercount > 67) //wait about 1 second
{
uart_putchar(XMODEM_RECIEVING_WAIT_CHAR); //send a "C"
timercount=0;
}
TIFR=TIFR | 0x02;
}
}
//開始接收
do
{
NO=uart_waitchar();
NO1=uart_waitchar();
NO1=~NO1;
if((packNO == NO) && (packNO == NO1))
{
for(i=0;i<128;i++) //接收128字串
{
data= uart_waitchar();
uart_putchar(data);
bufferPoint++;
}
crc=((crc = uart_waitchar())<<8); //接收2個字元的CRC效字
crc += uart_waitchar();
NO = crc; //檢查CRC接收是否正確
crc = crc >> 8;
NO1= crc;
uart_putchar(NO1);
uart_putchar(NO);
if(calcrc(&data,128)==crc) //CRC校正
{ //正确接收128?字數據
while(bufferPoint >= SPM_PAGESIZE)
{ //正确接受256字數據
write_one_page(); //收到256字寫入一頁Flash中
address += SPM_PAGESIZE; //Flash 頁加1
address ++;
bufferPoint = 0;
}
uart_putchar(XMODEM_ACK); //正卻收到一組字串
packNO++; //數據加一
}
else
{
uart_putchar(XMODEM_NAK); //要求重新傳送數據
}
}
else
{
uart_putchar(XMODEM_NAK); //要求重新傳送數據
}
}while(uart_waitchar()!=XMODEM_EOT); //連續接收接收,直到全部收完
uart_putchar(XMODEM_ACK); //通知PC机全部收到
if(bufferPoint) write_one_page(); //把剩余的數據寫入Flash中
quit(); //退出Bootloader程序,到0x0000應用程序
return 0;
}
程式有燒入進去,但是用AVRUBD作傳送導案時會出現這樣問題,各位高手幫幫我檢查一下哪裡錯誤
http://cache.amobbs.com/bbs_upload782111/files_32/ourdev_574789.JPG
(原文件名:11.JPG) 我也在做这个。能和楼主讨论下吗? 路过路过了顺便看看
页:
[1]