kevin111638 发表于 2010-8-13 14:55:43

拜託一下,高手幫我看一下哪裡錯誤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)

haolei432370 发表于 2013-6-20 16:42:54

我也在做这个。能和楼主讨论下吗?

xuanfong1 发表于 2014-4-27 21:04:27

路过路过了顺便看看
页: [1]
查看完整版本: 拜託一下,高手幫我看一下哪裡錯誤m128,bootloader