|
|||||||||||
| 技術(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) |
我的程序的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 于 2006/12/9 9:48:00 發(fā)布:
FLASH問題 FLASH的問題可能是出在void write_one_page(void)函數(shù)里。好像是燒寫FLASH不成功。請指教 |
|
| 3樓: | >>參與討論 |
| 作者: stycx 于 2006/12/9 21:36:00 發(fā)布:
用別的方法在0x0000寫小段代碼確定能否轉(zhuǎn)到0x0000處執(zhí)行 |
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |