我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 570|回复: 1

STM32F103 通过串口IAP升级单片机程序

[复制链接]

该用户从未签到

34

主题

12

回帖

0

积分

二级逆天

积分
0

终身成就奖

发表于 2020-11-26 08:19:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区

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

×
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "stmflash.h"
#include "iap.h"

iapfun jump2app;
u16 iapbuf[1024];   
//appxaddr:应用程序的起始地址
//appbuf:应用程序CODE.
//appsize:应用程序大小(字节).
void iap_write_appbin(u32 appxaddr,u8 *appbuf,u32 appsize)
{
    u16 t;
    u16 i=0;
    u16 temp;
    u32 fwaddr=appxaddr;//当前写入的地址
    u8 *dfu=appbuf;
    for(t=0;t<appsize;t+=2)
    {                           
        temp=(u16)dfu[1]<<8;
        temp+=(u16)dfu[0];      
        dfu+=2;//偏移2个字节
        iapbuf[i++]=temp;        
        if(i==1024)
        {
            i=0;
            STMFLASH_Write(fwaddr,iapbuf,1024);   
            fwaddr+=2048;//偏移2048  16=2*8.所以要乘以2.
        }
    }
    if(i)STMFLASH_Write(fwaddr,iapbuf,i);//将最后的一些内容字节写进去.  
}

//跳转到应用程序段
//appxaddr:用户代码起始地址.
void iap_load_app(u32 appxaddr)
{
    if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)    //检查栈顶地址是否合法.
    {
        jump2app=(iapfun)*(vu32*)(appxaddr+4);        //用户代码区第二个字为程序开始地址(复位地址)        
        MSR_MSP(*(vu32*)appxaddr);                    //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
        jump2app();                                    //跳转到APP.
    }
}         

#include "sys.h"
#include "usart.h"        
#include "delay.h"   
#include "led.h"        
#include "key.h"                 
#include "lcd.h"
#include "stmflash.h"   
#include "iap.h"     

//FLASH分区: 0X0800 0000~0x0800 8000,给IAP使用,共32K字节,FLASH APP还有256-32=224KB可用.
// SRAM分区: 0X2000 1000处开始,用于存放SRAM IAP代码,共44K字节可用,用户可以自行对44K空间进行ROM和RAM区的分配
//           特别注意,SRAM APP的ROM占用量不能大于41K字节,因为本例程最大是一次接收41K字节,不能超过这个限制。

              
int main(void)
{         
    u8 t;
    u8 key;
    u16 oldcount=0;    //老的串口接收数据值
    u16 applenth=0;    //接收到的app代码长度
    u8 clearflag=0;  
     Stm32_Clock_Init(9);    //系统时钟设置
    uart_init(72,256000);    //串口初始化为256000
    delay_init(72);                //延时初始化
    LED_Init();                  //初始化与LED连接的硬件接口
    LCD_Init();                   //初始化LCD
     KEY_Init();                //按键初始化

     POINT_COLOR=RED;//设置字体为红色
    LCD_ShowString(60,50,200,16,16,"Mini STM32");   
    LCD_ShowString(60,70,200,16,16,"IAP TEST");   
    LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
    LCD_ShowString(60,110,200,16,16,"2014/3/15");  
    LCD_ShowString(60,130,200,16,16,"WK_UP:Copy APP2FLASH");
    LCD_ShowString(60,150,200,16,16,"KEY0:Run SRAM APP");
    LCD_ShowString(60,170,200,16,16,"KEY1:Run FLASH APP");
    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("代码长度:%dBytes\r\n",applenth);
            }else oldcount=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==WKUP_PRES)            //WK_UP按键按下
        {
            if(applenth)
            {
                printf("开始更新固件...\r\n");   
                LCD_ShowString(60,210,200,16,16,"Copying APP2FLASH...");
                 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,"Copy APP Successed!!");
                    printf("固件更新完成!\r\n");   
                }else
                {
                    LCD_ShowString(60,210,200,16,16,"Illegal FLASH APP!  ");      
                    printf("非FLASH应用程序!\r\n");
                }
             }else
            {
                printf("没有可以更新的固件!\r\n");
                LCD_ShowString(60,210,200,16,16,"No APP!");
            }
            clearflag=7;//标志更新了显示,并且设置7*300ms后清除显示                                    
        }
        if(key==KEY1_PRES)
        {
            printf("开始执行FLASH用户代码!!\r\n");
            if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
            {     
                iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
            }else
            {
                printf("非FLASH应用程序,无法执行!\r\n");
                LCD_ShowString(60,210,200,16,16,"Illegal FLASH APP!");      
            }                                    
            clearflag=7;//标志更新了显示,并且设置7*300ms后清除显示      
        }
        if(key==KEY0_PRES)
        {
            printf("开始执行SRAM用户代码!!\r\n");
            if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x20000000)//判断是否为0X20XXXXXX.
            {     
                iap_load_app(0X20001000);//SRAM地址
            }else
            {
                printf("非SRAM应用程序,无法执行!\r\n");
                LCD_ShowString(60,210,200,16,16,"Illegal SRAM APP!");      
            }                                    
            clearflag=7;//标志更新了显示,并且设置7*300ms后清除显示     
        }                  
         
    }         
}
回复

使用道具 举报

  • TA的每日心情
    开心
    2024-11-7 12:45
  • 签到天数: 135 天

    [LV.7]常住居民III

    6

    主题

    6778

    回帖

    1万

    积分

    三级逆天

    积分
    14290

    终身成就奖特殊贡献奖原创先锋奖

    发表于 2020-11-26 08:52:04 | 显示全部楼层
    回复

    使用道具 举报

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

    本版积分规则

    公告:服务器刚移机,
    大家请不要下载东西。
    会下载失败


    Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

    本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

    ( 闽ICP备2024076463号-1 ) 论坛技术支持QQ群171867948 ,论坛问题,充值问题请联系QQ1308068381

    平平安安
    TOP
    快速回复 返回顶部 返回列表