我通过下面这个软件作为bootloader的上位机
编译工具是最新版avrstudio(atmelstudio 6)
我是这样操作的
首先生成hex,然后通过上位机烧写程序,上位机提示烧写成功,然后烧写的程序未运行。
下面是主程序:
- int main(void)
- {
- int i=0,bufferPoint=0;
- DataUnionByte crc;
- unsigned char timercount=0,packNO=1;
-
- cli();
-
- USARTInit(19200);
- TimerInit();
-
- for (;;)
- {
- if (USARTRecieveFind()=='d'){break;}
- else if(USARTRecieveFind()=='e')
- {
- USARTTransmit('e');run_app();
- }
- if ( TIFR&0X02 )
- {
- TIFR |= 0X02; /* 清除标志 */
- if(timercount++ >= 200)
- {
- USARTTransmit('e');
- run_app();
- }
- }
- }
- for (;USARTRecieveFind()!=XMODEM_SOH;)
- {
- if (TIFR&0X02)
- {
- TIFR |= 0X02;
- if (++timercount > 67)
- {
- USARTTransmit(XMODEM_RECIEVING_WAIT_CHAR);
- timercount = 0;
- }
- }
- }
- for (unsigned char temp=0;temp!=XMODEM_EOT;temp=USARTRecieve())
- {
- if ((packNO == USARTRecieve())&&(packNO==(USARTRecieve()^0XFF)))
- {
- for(i=0;i<128;i++)
- {
- databuff.databuff8[bufferPoint++]=USARTRecieve();
- }
- crc.databuff8[1] = USARTRecieve();
- crc.databuff8[0] = USARTRecieve();
- if (CRCCalculate(&databuff.databuff8[bufferPoint-128],128)==crc.databuff16)
- {
- if(bufferPoint >= DATA_BUFFER_SIZE)
- {
- boot_write_one_page();
- address += DATA_BUFFER_SIZE;
- bufferPoint = 0;
- }
- USARTTransmit(XMODEM_ACK);
- packNO++;
- }
- else
- {
- USARTTransmit(XMODEM_NAK);
- }
- }
- else
- {
- USARTTransmit(XMODEM_NAK);
- }
- }
- USARTTransmit(XMODEM_ACK);
- if(bufferPoint) boot_write_one_page();
-
- run_app();
- }
run_app();就是跳到0x0000的程序,代码就一条 jmp 0x0000
请问一下哪里有问题吗,为什么通过bootloader下载的程序不能运行。
可以确定烧进去的程序是正确的,因为我通过读FLASH看过。
|