找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2423|回复: 0
打印 上一主题 下一主题
收起左侧

stm32代码升级总结

[复制链接]
跳转到指定楼层
楼主
ID:104126 发表于 2016-1-23 01:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
看了那么多stm32代码升级的教程,有两个疑点:1,修改中断向量表偏移是bootloader修还是app代码要修?
答:app代码



2:,修改rom的起始地址或RAM的地址在哪里?
答:app代码



3,bootloader代码干啥?
答:就写段程序就行。
intmain(void)
{           
       u8t,key;
       u16oldcount=0;     //老的串口接收数据值
       u16applenth=0;     //接收到的app代码长度
       u8clearflag=0;
       uart_init(256000);      //串口初始化为256000
       delay_init();               //延时初始化
       LCD_Init();            //液晶初始化
       LED_Init();                 //初始化与LED连接的硬件接口
      KEY_Init();                  //按键初始化      
POINT_COLOR=RED;//设置字体为红色
       LCD_ShowString(60,50,200,16,16,"WarshipSTM32");   
       LCD_ShowString(60,70,200,16,16,"IAPTEST");     
       LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
       LCD_ShowString(60,110,200,16,16,"2012/9/24");
       LCD_ShowString(60,130,200,16,16,"WK_UP:CopyAPP2FLASH");
       LCD_ShowString(60,150,200,16,16,"KEY1:EraseSRAM APP");
       LCD_ShowString(60,170,200,16,16,"KEY0:RunSRAM APP");
       LCD_ShowString(60,190,200,16,16,"KEY2:RunFLASH APP");
       POINT_COLOR=BLUE;
       //显示提示信息
       POINT_COLOR=BLUE;//设置字体为蓝色  
       while(1)
       {
             if(USART_RX_CNT)
              {
                     if(oldcount==USART_RX_CNT)
//新周期内,没有收到任何数据,认为本次数据接收完成.
                     {
                            applenth=USART_RX_CNT;
                            oldcount=0;
                            USART_RX_CNT=0;
                            printf("用户程序接收完成!\r\n");
                            printf("代码长度:?ytes\r\n",applenth);
                     }elseoldcount=USART_RX_CNT;                    
              }
              t++;delay_ms(10);
              if(t==30)
              {
                     LED0=!LED0;t=0;
                     if(clearflag)
                     {
                            clearflag--;
                            if(clearflag==0)LCD_Fill(60,210,240,210+16,WHITE);//清除显示
                     }
              }            
              key=KEY_Scan(0);
              if(key==KEY_UP)
              {
                     if(applenth)
                     {
                            printf("开始更新固件...\r\n");     
                            LCD_ShowString(60,210,200,16,16,"CopyingAPP2FLASH...");
                           if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000)
//判断是否为0X08XXXXXX.
                            {           
iap_write_appbin(FLASH_APP1_ADDR,USART_RX_BUF,
applenth);//更新FLASH代码  
                                   LCD_ShowString(60,210,200,16,16,"CopyAPP Successed!!");
                                   printf("固件更新完成!\r\n");      
                            }else
                            {
                                   LCD_ShowString(60,210,200,16,16,"IllegalFLASHAPP!  ");         
                                   printf("非FLASH应用程序!\r\n");
                            }
                    }else
                     {
                            printf("没有可以更新的固件!\r\n");
                            LCD_ShowString(60,210,200,16,16,"NoAPP!");
                     }
                     clearflag=7;//标志更新了显示,并且设置7*300ms后清除显示         
              }
              if(key==KEY_DOWN)
              {
                     if(applenth)
                     {                                                                                                            
                            printf("固件清除完成!\r\n");   
                            LCD_ShowString(60,210,200,16,16,"APPErase Successed!");
                            applenth=0;
                     }else
                     {
                            printf("没有可以清除的固件!\r\n");
                            LCD_ShowString(60,210,200,16,16,"NoAPP!");
                     }
                     clearflag=7;//标志更新了显示,并且设置7*300ms后清除显示                                                        
              }
              if(key==KEY_LEFT)
              {

了解完上面的教程以后,开始动手实践,但问题来了:
1,必须找一个能打开bin文件的软件,如用ultraedit
2,将纯数据的二进制拷出来,然后用串口助手发送给单片机
3,发现升级失败,后来发现从ultraedit里拷贝出来的数据每一行后面都有一个换行,所以拷贝到word里,将所有的换行去掉,因为一个换行就是一个字节,尽管在用串口助手的HEX方式发送时,看不到那个换行的字节,但是实验发现,是多一个字节的。
4,具体操作如下:
第一步:按Ctrl + H
第二步:在“查找内容”后面,输入:^p (注意,^就是数字6上面的那个符号,p是小写的)
第三步:在“替换为”后面,不输入任何内容。
第四步:点“全部替换”。
5,发现好使。


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表