我通过下面这个软件作为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看过。
|