[AVR单片机] atmega32的bootloader问题,请大神帮忙指点指点

[复制链接]
1266|2
 楼主| wakojosin 发表于 2015-4-23 19:13 | 显示全部楼层 |阅读模式
我通过下面这个软件作为bootloader的上位机
编译工具是最新版avrstudio(atmelstudio 6)

我是这样操作的
首先生成hex,然后通过上位机烧写程序,上位机提示烧写成功,然后烧写的程序未运行。

下面是主程序:
  1. int main(void)
  2. {
  3.         int i=0,bufferPoint=0;
  4.         DataUnionByte crc;
  5.         unsigned char timercount=0,packNO=1;
  6.        
  7.         cli();
  8.        
  9.         USARTInit(19200);
  10.         TimerInit();
  11.        
  12.         for (;;)
  13.         {
  14.                 if (USARTRecieveFind()=='d'){break;}
  15.                 else if(USARTRecieveFind()=='e')
  16.                 {
  17.                         USARTTransmit('e');run_app();
  18.                 }
  19.                 if ( TIFR&0X02 )
  20.                 {
  21.                         TIFR |= 0X02;                /* 清除标志 */
  22.                         if(timercount++ >= 200)
  23.                         {
  24.                                 USARTTransmit('e');
  25.                                 run_app();
  26.                         }
  27.                 }
  28.         }
  29.         for (;USARTRecieveFind()!=XMODEM_SOH;)
  30.         {
  31.                 if (TIFR&0X02)
  32.                 {
  33.                         TIFR |= 0X02;
  34.                         if (++timercount > 67)
  35.                         {
  36.                                 USARTTransmit(XMODEM_RECIEVING_WAIT_CHAR);
  37.                                 timercount = 0;
  38.                         }
  39.                 }
  40.         }
  41.         for (unsigned char temp=0;temp!=XMODEM_EOT;temp=USARTRecieve())
  42.         {
  43.                 if ((packNO == USARTRecieve())&&(packNO==(USARTRecieve()^0XFF)))
  44.                 {
  45.                         for(i=0;i<128;i++)
  46.                         {
  47.                                 databuff.databuff8[bufferPoint++]=USARTRecieve();
  48.                         }
  49.                         crc.databuff8[1] = USARTRecieve();
  50.                         crc.databuff8[0] = USARTRecieve();
  51.                         if (CRCCalculate(&databuff.databuff8[bufferPoint-128],128)==crc.databuff16)
  52.                         {
  53.                                 if(bufferPoint >= DATA_BUFFER_SIZE)
  54.                                 {
  55.                                         boot_write_one_page();
  56.                                         address += DATA_BUFFER_SIZE;
  57.                                         bufferPoint = 0;
  58.                                 }
  59.                                 USARTTransmit(XMODEM_ACK);
  60.                                 packNO++;
  61.                         }
  62.                         else
  63.                         {
  64.                                 USARTTransmit(XMODEM_NAK);
  65.                         }
  66.                 }
  67.                 else
  68.                 {
  69.                         USARTTransmit(XMODEM_NAK);
  70.                 }
  71.         }
  72.         USARTTransmit(XMODEM_ACK);
  73.         if(bufferPoint) boot_write_one_page();
  74.        
  75.         run_app();
  76. }
run_app();就是跳到0x0000的程序,代码就一条  jmp 0x0000

请问一下哪里有问题吗,为什么通过bootloader下载的程序不能运行。

可以确定烧进去的程序是正确的,因为我通过读FLASH看过。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
s17701332 发表于 2015-4-29 17:16 | 显示全部楼层
程序存在bootloader区了么
 楼主| wakojosin 发表于 2015-4-29 20:57 | 显示全部楼层
解决了,是烧写的程序跟bootloader程序有冲突,也是bootloader的一个bug,现在解决了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

83

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部