搜索
bottom↓
回复: 2

拜託一下,高手幫我看一下哪裡錯誤m128,bootloader

[复制链接]

出0入0汤圆

发表于 2010-8-13 14:55:43 | 显示全部楼层 |阅读模式
這是程式碼


#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[DATA_BUFFER_SIZE];
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[i+1];
                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[bufferPoint]= uart_waitchar();
                        uart_putchar(data[bufferPoint]);
                                        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[bufferPoint-128],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作傳送導案時會出現這樣問題,各位高手幫幫我檢查一下哪裡錯誤

(原文件名:11.JPG)

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2013-6-20 16:42:54 | 显示全部楼层
我也在做这个。能和楼主讨论下吗?

出0入0汤圆

发表于 2014-4-27 21:04:27 | 显示全部楼层
路过路过了  顺便看看
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 11:12

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表