神奇的bootloader !大神们进来看看!

2019-03-24 20:22发布

本帖最后由 285844685 于 2015-9-3 08:45 编辑
  1. 代码是往5922恒流led驱动里写数, 用jtag往里烧的时候都能正常运行,但是第三种写法用bootloader往里刷的程序就不能正常运行 ,上电后会卡死,程序跑飞。第一种写法用bootloader就正常。
复制代码Program Memory Usage         :        27030 bytes   19.4 % Full
Data Memory Usage                 :        1159 bytes   14.1 % Full

大神们帮看看是什么情况。

  1. void TLC5922_WriteDC(unsigned char dc)
  2. {
  3.         unsigned char i,j;
  4.         TLC5922_Mode_DC;   //MODE = 1;
  5.         XTAL1_Output_is_Low;  //XLAT = 0;
  6.         Sclk_Output_is_Low;   //SCLK = 0;
  7.         Sin1_Output_is_Low;   //SIN  = 0;
  8.         for(i=0;i<112;i++) //每?个?led一°?个?dc字á?节¨2
  9.         {
  10.                 for(j=0;j<7;j++)  //dc_number范¤?围¡ì0~127   dc7bit依°¨¤次ä?串ä?行D写¡ä入¨?
  11.                 {
  12.                         Sclk_Output_is_Low;  //SCLK = 0;
  13.                         if((dc&0x40)==0x40)
  14.                         {
  15.                                 Sin1_Output_is_Hig;  //SIN = 1;
  16.                         }
  17.                         else if((dc&0x40)==0)
  18.                         {
  19.                                 Sin1_Output_is_Low; //SIN = 0;
  20.                         }
  21.                         Sclk_Output_is_Low;
  22.                         delay_us(1);
  23.                         Sclk_Output_is_Hig;
  24.                         delay_us(1);
  25.                         Sclk_Output_is_Low;
  26.                         dc <<= 1;    //左ᨮ移°?一°?位?
  27.                 }
  28.                 dc=127;          //下?一°?个?字á?节¨2
  29.         }
  30.         XTAL1_Output_is_Low;
  31.         XTAL2_Output_is_Low;
  32.         XTAL3_Output_is_Low;
  33.         XTAL4_Output_is_Low;
  34.         XTAL5_Output_is_Low;
  35.         XTAL6_Output_is_Low;
  36.         XTAL7_Output_is_Low;
  37.         delay_us(1);
  38.         XTAL1_Output_is_Hig;
  39.         XTAL2_Output_is_Hig;
  40.         XTAL3_Output_is_Hig;
  41.         XTAL4_Output_is_Hig;
  42.         XTAL5_Output_is_Hig;
  43.         XTAL6_Output_is_Hig;
  44.         XTAL7_Output_is_Hig;
  45.         delay_us(1);
  46.         XTAL1_Output_is_Low;
  47.         XTAL2_Output_is_Low;
  48.         XTAL3_Output_is_Low;
  49.         XTAL4_Output_is_Low;
  50.         XTAL5_Output_is_Low;
  51.         XTAL6_Output_is_Low;
  52.         XTAL7_Output_is_Low;   //XLAT = 1//XLAT 高?电ì?平?将?点ì?校¡ê正y数oy据Y锁?存ä?到ì? 7Bit DC Register
  53.         delay_us(1);
  54. }




  55. void TLC5922_WriteDC(unsigned char dc)
  56. {
  57.         unsigned char i,j;
  58.         unsigned char temp;
  59.         TLC5922_Mode_DC;   //MODE = 1;
  60.         XTAL1_Output_is_Low;  //XLAT = 0;
  61.         Sclk_Output_is_Low;   //SCLK = 0;
  62.         Sin1_Output_is_Low;   //SIN  = 0;
  63.         temp=dc;
  64.         for(i=0;i<LED_NUMBER;i++) //每个led一个dc字节
  65.         {
  66.                 for(j=0;j<7;j++)  //dc_number范围0~127   dc7bit依次串行写入
  67.                 {
  68.                         Sclk_Output_is_Low;  //SCLK = 0;
  69.                         if((temp&0x40)==0x40)
  70.                         {
  71.                                 Sin1_Output_is_Hig;  //SIN = 1;
  72.                         }
  73.                         else if((temp&0x40)==0)
  74.                         {
  75.                                 Sin1_Output_is_Low; //SIN = 0;
  76.                         }
  77.                         Sclk_Output_is_Low;
  78.                         delay_us(1);
  79.                         Sclk_Output_is_Hig;
  80.                         delay_us(1);
  81.                         Sclk_Output_is_Low;
  82.                         temp <<= 1;    //左移一位
  83.                 }
  84.                 temp=dc;           //下一个字节
  85.         }
  86.        
  87.         XTAL1_Output_is_Low;
  88.         XTAL2_Output_is_Low;
  89.         XTAL3_Output_is_Low;
  90.         XTAL4_Output_is_Low;
  91.         XTAL5_Output_is_Low;
  92.         XTAL6_Output_is_Low;
  93.         XTAL7_Output_is_Low;
  94.         delay_us(1);
  95.         XTAL1_Output_is_Hig;
  96.         XTAL2_Output_is_Hig;
  97.         XTAL3_Output_is_Hig;
  98.         XTAL4_Output_is_Hig;
  99.         XTAL5_Output_is_Hig;
  100.         XTAL6_Output_is_Hig;
  101.         XTAL7_Output_is_Hig;
  102.         delay_us(1);
  103.         XTAL1_Output_is_Low;
  104.         XTAL2_Output_is_Low;
  105.         XTAL3_Output_is_Low;
  106.         XTAL4_Output_is_Low;
  107.         XTAL5_Output_is_Low;
  108.         XTAL6_Output_is_Low;
  109.         XTAL7_Output_is_Low;   //XLAT = 1//XLAT 高电平将点校正数据锁存到 7Bit DC Register
  110.         delay_us(1);
  111. }


  112. void TLC5922_WriteDC(unsigned char *dc)
  113. {
  114.         unsigned char i,j;
  115.         TLC5922_Mode_DC;   //MODE = 1;
  116.         XTAL1_Output_is_Low;  //XLAT = 0;
  117.         Sclk_Output_is_Low;   //SCLK = 0;
  118.         Sin1_Output_is_Low;   //SIN  = 0;
  119.        
  120.         for(i=0;i<LED_NUMBER;i++) //每个led一个dc字节
  121.         {
  122.                 for(j=0;j<7;j++)  //dc_number范围0~127   dc7bit依次串行写入
  123.                 {
  124.                         Sclk_Output_is_Low;  //SCLK = 0;
  125.                         if((*dc&0x40)==0x40)
  126.                         {
  127.                                 Sin1_Output_is_Hig;  //SIN = 1;
  128.                         }
  129.                         else if((*dc&0x40)==0)
  130.                         {
  131.                                 Sin1_Output_is_Low; //SIN = 0;
  132.                         }
  133.                         Sclk_Output_is_Low;
  134.                         delay_us(1);
  135.                         Sclk_Output_is_Hig;
  136.                         delay_us(1);
  137.                         Sclk_Output_is_Low;
  138.                         *dc <<= 1;    //左移一位
  139.                 }
  140.                 dc ++;           //下一个字节
  141.         }
  142.         XTAL1_Output_is_Low;
  143.         XTAL2_Output_is_Low;
  144.         XTAL3_Output_is_Low;
  145.         XTAL4_Output_is_Low;
  146.         XTAL5_Output_is_Low;
  147.         XTAL6_Output_is_Low;
  148.         delay_us(1);
  149.         XTAL1_Output_is_Hig;
  150.         XTAL2_Output_is_Hig;
  151.         XTAL3_Output_is_Hig;
  152.         XTAL4_Output_is_Hig;
  153.         XTAL5_Output_is_Hig;
  154.         XTAL6_Output_is_Hig;;
  155.         delay_us(1);
  156.         XTAL1_Output_is_Low;
  157.         XTAL2_Output_is_Low;
  158.         XTAL3_Output_is_Low;
  159.         XTAL4_Output_is_Low;
  160.         XTAL5_Output_is_Low;
  161.         XTAL6_Output_is_Low;;   //XLAT = 1//XLAT 高电平将点校正数据锁存到 7Bit DC Register
  162.         delay_us(1);
  163. }
复制代码

此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
dcexpert
1楼-- · 2019-03-25 02:31
不同用法在哪里?
285844685
2楼-- · 2019-03-25 04:42
dcexpert 发表于 2015-9-3 09:57
不同用法在哪里?

就是一个是常值  一个是去数组里按地址取数
285844685
3楼-- · 2019-03-25 10:20
用的是xmega128
285844685
4楼-- · 2019-03-25 13:35
  1. #include "usart.h"
  2. #include "bootcfg.h"
  3. #include "sp_driver.h"
  4. #include "XMODEM.h"
  5. #include "timer.h"
  6. #include "clksys_driver.h"
  7. //使用UARTD0  定义下载串口
  8. #define USART      USARTD0
  9. #define USART_PORT PORTD
  10. #define USART_TX   PIN3_bm
  11. #define USART_RX   PIN2_bm
  12. //flash页的大小
  13. #define BUFSIZE  SPM_PAGESIZE
  14. //用户程序起始地
  15. #define PROG_START  PROGMEM_START
  16. //flashaddr偏移地址
  17. #define flashAddr_offset   51200
  18. //----------------------------------------------------------------------------
  19. //接收缓冲区
  20. uint8_t  XmodemBuffer[128];            //用于接收XMODEM发送的128字节一帧数据
  21. uint8_t  WriteBuffer[BUFSIZE];       //用于装载flash缓冲页
  22. uint8_t  buf1[BUFSIZE];  
  23. uint8_t  ReadBuffer[BUFSIZE]; //读取flash页缓冲区
  24. uint8_t  upgrade_ok_flag=0;
  25. uint8_t  Packnum=0;
  26. uint8_t  temp_ch,temp_cl;
  27. uint8_t Update_state[10]={0x5B,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x5B};
  28. uint8_t cnt,j;
  29. uint8_t blockcount=0;
  30. uint8_t App_sourcecodes_page_count;
  31. //Flash地址指针
  32. unsigned long int FlashAddr= PROG_START;
  33. unsigned long int FlashAddr_temp;
  34. //unsigned long int FlashAddr= PROG_START;
  35. //----------------------------------------------------------------------------
  36. void putstr(const char *str);
  37. void repay_sysclk();
  38. //写入数据到串口
  39. void WriteCom(unsigned char data)
  40. {
  41.                 do{
  42.                 /* Wait until it is possible to put data into TX data register.
  43.                  * NOTE: If TXDataRegister never becomes empty this will be a DEADLOCK. */
  44.                 }while(!USART_IsTXDataRegisterEmpty(&USART));
  45.                 USART_PutChar(&USART, data);
  46. }
  47. //----------------------------------------------------------------------------
  48. //发送字符串并添加回车
  49. void putstr(const char *str)
  50. {
  51.   while(*str)
  52.   WriteCom(*str++);
  53. // WriteCom(0x0D);
  54. //  WriteCom(0x0A);  //发送回车
  55.   //WriteCom(0x0A);  //发送回车
  56. }
  57. //----------------------------------------------------------------------------
  58. //等待串口数据
  59. unsigned char WaitCom(void)
  60. {
  61.   do{
  62.   /* Wait until data received */
  63.   }while(!USART_IsRXComplete(&USART));
  64.   return(USART_GetChar(&USART));
  65. }
  66. //----------------------------------------------------------------------------
  67. //更新一个Flash页
  68. void write_one_page(unsigned char *buf,unsigned long int flashaddr)
  69. {
  70.         FlashAddr_temp=flashaddr;
  71.     //数据填入Flash缓冲页
  72.         /* Load the flashbuffer with the test buffer. */
  73.         SP_LoadFlashPage(buf);
  74.                 /* Perform page erase. *///将缓冲页数据写入一个Flash页
  75.         SP_EraseWriteApplicationPage(FlashAddr_temp);
  76.         /* Wait for NVM to finish. */
  77.         SP_WaitForSPM();//等待页编程完成         
  78.         //FlashAddr=FlashAddr+BUFSIZE;            
  79. }
  80. //----------------------------------------------------------------------------
  81. //跳转到用户程序
  82. void quit()
  83. {
  84.   // putstr(msg7);         //提示进入Application
  85.   EIND=0x00;
  86.   asm("ldi r30,0x00");
  87.   asm("ldi r31,0x00");
  88.   asm("eijmp");                     

  89. }
  90. void jmp_bootloader()
  91. {
  92.    //putstr(msg5);        //提示写入Flash数据错误,重新操作一次
  93.   // putstr(msg6);
  94.   WriteCom(0x5a);
  95.   WriteCom(0x02);
  96.   WriteCom(0x5a);
  97.    EIND=0x01;
  98.   asm("ldi r30,0x00");
  99.   asm("ldi r31,0x00");
  100.   asm("eijmp");
  101. }       
  102. //----------------------------------------------------------------------------
  103. //串口初始化9600,8,N,1,@32M CPU时钟
  104. void USART_initial(void)
  105. {
  106.         /* (TXD) as output. */
  107.         USART_PORT.DIRSET = USART_TX;
  108.         /* (RXD) as input. */
  109.         USART_PORT.DIRCLR = USART_RX;
  110.         /* USART, 8 Data bits, No Parity, 1 Stop bit. */
  111.         USART_Format_Set(&USART, USART_CHSIZE_8BIT_gc, USART_PMODE_DISABLED_gc, 0);
  112.         /* Set Baudrate to 9600 bps:
  113.          * Use the default I/O clock fequency that is 16 MHz.
  114.          * Do not use the baudrate scale factor
  115.          * Baudrate select = (1/(16*(((I/O clock frequency)/Baudrate)-1)
  116.          *                 = 103
  117.          */
  118.         //USART_Baudrate_Set(&USART, 2484 , 12);  //9600
  119.         USART_Baudrate_Set(&USART, 1539 , 9);  //9600
  120.         /* Enable both RX and TX. */
  121.         USART_Rx_Enable(&USART);
  122.         USART_Tx_Enable(&USART);
  123. }
  124. //----------------------------------------------------------------------------
  125. //设置系统时钟 为外部晶振 12M
  126. //----------------------------------------------------------------------------
  127. void sysclk_XOSCinitial()
  128. {
  129.                 /*  Enable
  130.                 internal 32 MHz ring oscillator and wait until it's
  131.                  *  stable. Divide clock by two with the prescaler C and set the
  132.                  *  32 MHz ring oscillator as the main clock source.
  133.                  */
  134.                 CLKSYS_XOSC_Config(OSC_FRQRANGE_12TO16_gc,1,OSC_XOSCSEL_XTAL_1KCLK_gc);
  135.                 CLKSYS_Enable( OSC_XOSCEN_bm );
  136.                 //OSC_XOSCCTRL=0x83;
  137.                 CLKSYS_Prescalers_Config( CLK_PSADIV_1_gc, CLK_PSBCDIV_1_1_gc );  //Pc为2分频,T0工作在16M
  138.                 do {} while ( CLKSYS_IsReady( OSC_XOSCRDY_bm ) == 0 );
  139.                 //CLKSYS_Prescalers_Config( CLK_PSADIV_1_gc, CLK_PSBCDIV_1_1_gc );  //Pc为2分频,T0工作在16M
  140.                 CLKSYS_Main_ClockSource_Select( CLK_SCLKSEL_XOSC_gc );
  141. }
  142. //----------------------------------------------------------------------------
  143. //设置系统时钟 锁相环倍频 24M
  144. //----------------------------------------------------------------------------
  145. void sysclk_PLLinitial()
  146. {
  147.                 /*  Enable
  148.                 internal 32 MHz ring oscillator and wait until it's
  149.                  *  stable. Divide clock by two with the prescaler C and set the
  150.                  *  32 MHz ring oscillator as the main clock source.
  151.                  */
  152.                 CLKSYS_XOSC_Config(OSC_FRQRANGE_12TO16_gc,1,OSC_XOSCSEL_XTAL_1KCLK_gc);
  153.                 //CLKSYS_Enable( OSC_XOSCEN_bm );
  154.                 CLKSYS_Enable( OSC_XOSCEN_bm | OSC_RC2MCREF_bm);
  155.                 do {} while ( CLKSYS_IsReady( OSC_XOSCRDY_bm ) == 0 );
  156.                 //CLKSYS_PLL_Config(OSC_PLLSRC_XOSC_gc,OSC_PLLFAC1_bm);
  157.                 CLKSYS_PLL_Config(OSC_PLLSRC_XOSC_gc,4);   //change 20140916
  158.                 CLKSYS_Enable( OSC_PLLEN_bm );
  159.                 //CLKSYS_Prescalers_Config( CLK_PSADIV_1_gc, CLK_PSBCDIV_1_1_gc );  
  160.                 CLKSYS_Prescalers_Config( CLK_PSADIV_2_gc, CLK_PSBCDIV_1_1_gc );    //change 20140916
  161.         //        CLKSYS_Configuration_Lock(  );
  162.                 do {} while ( CLKSYS_IsReady( OSC_PLLRDY_bm ) == 0 );
  163.                 //CLKSYS_Prescalers_Config( CLK_PSADIV_1_gc, CLK_PSBCDIV_1_1_gc );  
  164.                 CLKSYS_Main_ClockSource_Select( CLK_SCLKSEL_PLL_gc );
  165. }
  166. //----------------------------------------------------------------------------
  167. //设置系统时钟 为内部RC 32M
  168. //----------------------------------------------------------------------------
  169. void sysclk_initial()
  170. {
  171.                 /*  Enable internal 32 MHz ring oscillator and wait until it's
  172.                  *  stable. Divide clock by two with the prescaler C and set the
  173.                  *  32 MHz ring oscillator as the main clock source.
  174.                  */
  175.                 CLKSYS_Enable( OSC_RC32MEN_bm );
  176.                 CLKSYS_Prescalers_Config( CLK_PSADIV_1_gc, CLK_PSBCDIV_1_2_gc );  //Pc为2分频,T0工作在16M
  177.                 do {} while ( CLKSYS_IsReady( OSC_RC32MRDY_bm ) == 0 );
  178.                 CLKSYS_Main_ClockSource_Select( CLK_SCLKSEL_RC32M_gc );
  179. }
  180. //设置系统时钟 为内部RC 2M
  181. //----------------------------------------------------------------------------
  182. void repay_sysclk()
  183. {
  184.                 /*  Select 2 MHz RC oscillator as main clock source and diable
  185.                  *  unused clock.
  186.                  */
  187.                 do {} while ( CLKSYS_IsReady( OSC_RC2MRDY_bm ) == 0 );
  188.                 CLKSYS_Prescalers_Config( CLK_PSADIV_1_gc, CLK_PSBCDIV_1_1_gc );  
  189.                 CLKSYS_Main_ClockSource_Select( CLK_SCLKSEL_RC2M_gc );
  190.                 CLKSYS_Disable( OSC_PLLEN_bm );  //关掉PLL
  191. }
  192. void delay(uint32_t delay)
  193. {
  194.         uint32_t i;
  195.         for (i=delay;i>0;i--)
  196.         {
  197.                 asm("NOP");
  198.         }
  199. }
  200. uint16_t calcrc(uint8_t *ptr, int count)
  201. {
  202.     int crc = 0;
  203.     char i;
  204.    
  205.     while (--count >= 0)
  206.     {
  207.         crc = crc ^ (int) *ptr++ << 8;
  208.         i = 8;
  209.         do
  210.         {
  211.         if (crc & 0x8000)
  212.             crc = crc << 1 ^ 0x1021;
  213.         else
  214.             crc = crc << 1;
  215.         } while(--i);
  216.     }
  217.     return (crc);
  218. }
  219. void LED_initial()
  220. {
  221.   PORTF_DIR=0xff;
  222.   PORTF_OUTSET=0xff;
  223.   LED1_select_enable;
  224.   LED2_select_enable;
  225.   LED3_select_enable;
  226.   LED4_select_enable;
  227.   delay(1200000);
  228.   PORTF_OUTCLR=0xff;
  229.   delay(1200000);
  230.   PORTF_OUTSET=0xff;
  231.   delay(1200000);
  232.   PORTF_OUTCLR=0xff;
  233.   delay(1200000);
  234.   PORTF_OUTSET=0xff;
  235.   delay(1200000);
  236.   PORTF_OUTCLR=0xff;
  237.   delay(1200000);
  238.   PORTF_OUTSET=0xff;
  239.   LED1_select_enable;
  240.   LED1_select_LOCK;
  241.   LED3_select_enable;
  242.   LED3_select_LOCK;
  243.   LED4_select_enable;
  244.   LED4_select_LOCK;  
  245.   PORTF_OUTCLR=3<<6;
  246.   LED2_select_enable;
  247.   LED2_select_LOCK;
  248. }
  249. //主程序
  250. //----------------------------------------------------------------------------
  251. int main(void)
  252. {
  253. uint8_t get_char,signal=0;
  254. uint8_t  crch, crcl;
  255. uint16_t crc0;
  256. uint16_t i,k;
  257. sysclk_PLLinitial();    //设定系统时钟
  258. USART_initial();      //串口初始化
  259. Timertc0_initial();   //定时器初始化 时隙:200MS
  260. USB_INTFLAGSACLR=0x00;
  261. USB_INTFLAGSASET=0x00;
  262. cnt = TimeOutCntC;
  263. signal=0;
  264.   while(signal==0)
  265.   {
  266.     if(TC_GetOverflowFlag(&TCC0))  //T1溢出
  267.     {
  268.             TC_ClearOverflowFlag(&TCC0);
  269.             WriteCom(XMODEM_RWC);      //发送 "C"
  270.             cnt--;
  271.             if(cnt==0)                //超时
  272.             {
  273.                   /*  Update_state[1]=0x02;
  274.                     Update_state[8]=0x00;
  275.                     for(j=0;j<10;j++)
  276.                     {
  277.                             WriteCom(Update_state[j]);
  278.                                 //delay_us(240000);
  279.                     }
  280.                         //delay_us(240000);
  281.                         FlashAddr=flashAddr_offset-BUFSIZE*2;
  282.                         SP_ReadFlashPage(ReadBuffer,FlashAddr);
  283.                         App_sourcecodes_page_count=ReadBuffer[0];
  284.                         FlashAddr=flashAddr_offset-BUFSIZE;
  285.                         SP_ReadFlashPage(WriteBuffer,FlashAddr);
  286.                         for(i=0;i<10;i++)
  287.                            {
  288.                                  if(i!=WriteBuffer[i])
  289.                                    {
  290.                                          FlashAddr=0;
  291.                                  j=0;
  292.                                  while(j<App_sourcecodes_page_count)
  293.                                      {
  294.                                            SP_ReadFlashPage(WriteBuffer,(FlashAddr+flashAddr_offset+512*j));
  295.                                            write_one_page(WriteBuffer,(FlashAddr+512*j));
  296.                                            SP_ReadFlashPage(ReadBuffer,(FlashAddr+512*j));
  297.                                            j++;
  298.                                            for(i=0;i<512;i++)
  299.                                               {
  300.                                                     if(ReadBuffer[i]!=WriteBuffer[i])
  301.                                                       {
  302.                                                             j--;
  303.                                                             break;
  304.                                                       }
  305.                                                }
  306.                                        }
  307.                                                 for(k=0;k<512;k++)
  308.                                                 WriteBuffer[k]=k;
  309.                                                 FlashAddr=flashAddr_offset-BUFSIZE;
  310.                                                 write_one_page(WriteBuffer,FlashAddr);
  311.                                             while(1)
  312.                                                  {
  313.                                                       write_one_page(WriteBuffer,FlashAddr);
  314.                                                       SP_ReadFlashPage(ReadBuffer,FlashAddr);
  315.                                                       if((ReadBuffer[1]==WriteBuffer[1])&&(ReadBuffer[1]==1))
  316.                                                     break;
  317.                                                 }          
  318.                                                 break;                             
  319.                                      }
  320.                               }*/
  321.                         delay_us(240000);         
  322.                         repay_sysclk();  //change 20140827
  323.                     quit();                   //退出 bootloader
  324.             }
  325.     }          
  326.     if(USART_IsRXComplete(&USART)) //收到字符?
  327.     {
  328.           get_char=USART_GetChar(&USART);
  329.       if(get_char == XMODEM_SOH)  //XMODEM命令开始
  330.         {
  331.           signal=1;
  332.                   break;
  333.                 }
  334.     }
  335.        
  336.   }
  337. //已经收到一个起启字符了 开始更新Application
  338. //----------------------------------------------------------------
  339.   Timertc0_Stop(); //关闭定时器0
  340.   //开始接受数据
  341.   cnt = 0;
  342.   do
  343.   {
  344.           Packnum++;
  345.           temp_ch=WaitCom();
  346.           temp_cl=WaitCom();
  347.     if((Packnum==temp_ch)&&(temp_cl==(255-temp_ch)))    //包序号对上了!
  348.        {
  349.       for(i =0; i <128; i++)          //接收完整一帧数据
  350.          {
  351.            XmodemBuffer[i] = WaitCom();
  352.          }
  353.     temp_ch = WaitCom();                    //获取校验字节
  354.         temp_cl = WaitCom();               
  355.         crc0=calcrc(&XmodemBuffer[0],128);          //计算校验
  356.         crch=(crc0>>8)&0xff;
  357.         crcl=crc0&0xff;
  358.     if((crch == temp_ch) && (crcl == temp_cl))   //校验成功
  359.       {                                    
  360.                    for(i=0;i<128;i++)
  361.                   {
  362.                           if((XmodemBuffer[i]==0x1a)&&(XmodemBuffer[i]==XmodemBuffer[127]))
  363.                              XmodemBuffer[i]=0xff;
  364.                   }
  365.                   for(i=0;i<128;i++)
  366.                   {
  367.                         WriteBuffer[128*blockcount+i]=XmodemBuffer[i];  //凑满flash缓冲页256字节
  368.                   }
  369.                   blockcount++;                     
  370.                   if(blockcount>=4)
  371.                   {
  372.                         blockcount=0;
  373.                         write_one_page(WriteBuffer,(FlashAddr+flashAddr_offset));  //写入flash一页
  374.                         SP_ReadFlashPage(ReadBuffer,(FlashAddr+flashAddr_offset)); //读取flash内容
  375.                         FlashAddr=FlashAddr+512;
  376.                         for(i=0;i<512;i++)
  377.                         {
  378.                                 if(ReadBuffer[i]!=WriteBuffer[i])     //flash内容与缓冲区内容进行比较,不同则重新进入bootloader
  379.                                 {
  380.                                         WriteCom(XMODEM_CAN);
  381.                                         jmp_bootloader();                                       
  382.                                 }
  383.                         }
  384.                         for (i=0;i<512;i++)
  385.                           {
  386.                                 WriteBuffer[i]=0xff;
  387.                           }
  388.                         //PORTE_IN&0xff;  
  389.                   }
  390.                 WriteCom(XMODEM_ACK);
  391.           }
  392.           else
  393.           {
  394.                 WriteCom(XMODEM_NAK);
  395.           }
  396.         }       
  397.         else
  398.         {
  399.           WriteCom(XMODEM_NAK);
  400.         }
  401.   }while(WaitCom()!=XMODEM_EOT);         
  402.         WriteCom(XMODEM_ACK);
  403.         write_one_page(WriteBuffer,(FlashAddr+flashAddr_offset));
  404.         SP_ReadFlashPage(ReadBuffer,(FlashAddr+flashAddr_offset));
  405.         for(i=0;i<512;i++)
  406.            {
  407.             if(ReadBuffer[i]!=WriteBuffer[i])
  408.             jmp_bootloader();                               
  409.            }
  410.         for(i=0;i<512;i++)
  411.            {
  412.          WriteBuffer[i]=0xff;
  413.                  ReadBuffer[i]=0x00;
  414.            }
  415.         App_sourcecodes_page_count=FlashAddr>>9;
  416.         FlashAddr=flashAddr_offset-BUFSIZE;
  417.         while(1)
  418.              {
  419.                    // SP_EraseApplicationPage(FlashAddr);
  420.                     write_one_page(WriteBuffer,FlashAddr);
  421.                         SP_ReadFlashPage(ReadBuffer,FlashAddr);
  422.                         if((ReadBuffer[1]==WriteBuffer[1])&&(ReadBuffer[1]==0xff))
  423.                         break;
  424.                  }
  425.         for(i=0;i<512;i++)
  426.         WriteBuffer[i]=App_sourcecodes_page_count;
  427.         FlashAddr=flashAddr_offset-BUFSIZE*2;
  428.         while(1)
  429.         {
  430.           write_one_page(WriteBuffer,FlashAddr);
  431.           SP_ReadFlashPage(ReadBuffer,FlashAddr);       
  432.           if(ReadBuffer[0]==App_sourcecodes_page_count)
  433.           break;
  434.         }
  435.         FlashAddr=0;
  436.         j=0;
  437.         while(j<App_sourcecodes_page_count)
  438.            {
  439.              SP_ReadFlashPage(WriteBuffer,(FlashAddr+flashAddr_offset+512*j));
  440.              write_one_page(WriteBuffer,(FlashAddr+512*j));
  441.                  SP_ReadFlashPage(ReadBuffer,(FlashAddr+512*j));
  442.                  j++;
  443.                  for(i=0;i<512;i++)
  444.                     {
  445.                           if(ReadBuffer[i]!=WriteBuffer[i])
  446.                             {
  447.                                   j--;       
  448.                                   break;
  449.                                 }
  450.                         }
  451.            }       
  452.         FlashAddr=0;   
  453.         for(i=0;i<512;i++)
  454.         WriteBuffer[i]=i;
  455.         FlashAddr=flashAddr_offset-BUFSIZE;
  456.         //write_one_page(WriteBuffer,FlashAddr);   
  457.     while(1)
  458.             {
  459.               write_one_page(WriteBuffer,FlashAddr);
  460.               SP_ReadFlashPage(ReadBuffer,FlashAddr);       
  461.               if((ReadBuffer[1]==WriteBuffer[1])&&(ReadBuffer[1]==1))
  462.               break;
  463.             }
  464.         /*for(i=0;i<512;i++)
  465.         WriteBuffer[i]=App_sourcecodes_page_count;
  466.         FlashAddr=flashAddr_offset-BUFSIZE*2;
  467.         write_one_page(WriteBuffer,FlashAddr);*/       
  468.          Update_state[1]=0x02;
  469.          Update_state[8]=0x01;
  470.          for(j=0;j<11;j++)
  471.            {
  472.                  WriteCom(Update_state[j]);
  473.            }
  474.          delay_us(240000);
  475.          repay_sysclk();  //change 20140827
  476.      quit();
  477. }


复制代码

感觉像是boot代码有问题。有大神帮看看擦写的部分吗

一周热门 更多>