音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng)
驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

bootloader找毛病

作者:daf55 欄目:嵌入式系統(tǒng)
bootloader找毛病
我的程序的FLASH刷寫有問題,但是不知道問題出在哪里。還有我程序調(diào)轉(zhuǎn)到0x0000后又從BOOTLOADER開始執(zhí)行,感覺的跳轉(zhuǎn)有問題。
我的編譯其實WINAVR2005

請大家指點一下。


#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>
#include <avr/delay.h>

#define SPM_PAGESIZE 256                //M128的一個FLASH頁為256字節(jié)(128字)
#define BAUD 38400              //波特率采用38400bps
#define CRYSTAL 16000000        //系統(tǒng)時鐘16MHZ

//計算和定義M128的波特率設(shè)置參數(shù)
#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        //定義接收緩沖區(qū)長度

//定義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[]="Type 'd' download, Others run app.\n\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[i])<<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);         //將緩沖頁數(shù)據(jù)寫入一個FLASH
    while(boot_rww_busy())
        boot_rww_enable();              //等待寫入完成
}         
//從RS232發(fā)送一個字節(jié)
void uart_putCHAR(CHAR c)
{
    while(!(UCSR0A & 0x20));
    UDR0 = c;
}
void uart1_putCHAR(CHAR c)
{
    while(!(UCSR1A & 0x20));
    UDR1 = c;
}  
//從RS232接收一個字節(jié)
unsigned CHAR uart_getCHAR(void)
{
    unsigned CHAR status,res;
    if(!(UCSR0A & 0x80)) return 0xd5;                //no data to be received
    status = UCSR0A;
    res = UDR0;
    if (status & 0x1c) return 0Xd5;                // If error, return -1
    return res;
}
//等待從RS232接收一個有效的字節(jié)
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處執(zhí)行應(yīng)用程序
void quit(void)
{
    uart_putCHAR('O');uart_putCHAR('K');
    uart_putCHAR(0x0d);uart_putCHAR(0x0a);
    while(!(UCSR0A & 0x20));               //等待結(jié)束提示信息回送完成
    MCUCR = 0x01;
    MCUCR = 0x00;                            //將中斷向量表遷移到應(yīng)用程序區(qū)頭部
    RAMPZ = 0x00;                            //RAMPZ清零初始化
    asm("jmp 0x0000\n");                    //跳轉(zhuǎn)到FLASH的0x0000處,執(zhí)行用戶的應(yīng)用程序
}
//void (*reset)(void)= 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;
    
//初始化IP口,PE.5使能串口,此一點有硬件電路決定
//為端口引腳定義方向
    DDRE =0xFF;
    PORTE=0x00;
    DDRA =0xFF;
    PORTA=0x00;

//初始化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的USART1
    UCSR1B = (1<<RXEN)|(1<<TXEN);            //Enable RECEIVER and Transmitter
    UCSR1C = 0x0E;               &n
2樓: >>參與討論
daf55
FLASH問題
FLASH的問題可能是出在void write_one_page(void)函數(shù)里。好像是燒寫FLASH不成功。請指教

3樓: >>參與討論
stycx
用別的方法在0x0000寫小段代碼確定能否轉(zhuǎn)到0x0000處執(zhí)行
 
參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
請問,嵌入式軟件開發(fā)和驅(qū)動程序開發(fā)有什么區(qū)別啊?
大家?guī)兔纯催@個開發(fā)板的性價比
大家?guī)兔聪逻@個程序,WINCE下的RTC時鐘設(shè)置
有什么usb2.0轉(zhuǎn)rs232的芯片,有dip封裝的么?能在面包班上做試驗
軟考:嵌入式系統(tǒng)設(shè)計師???
免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進(jìn)入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號