stm32f030xx移植st官方串口IAP(bootloader)过程记录

为了产品到现场使用后不拆壳就可升级跟新程序,最近学习了bootloader的移植,现在把移植过程和中间遇到的问题分享给大家,希望相互学习。

ST官方的例程使用的是Ymodem协议。我们需要准备2个程序,一个是IAP(bootloader),一个是APP应用程序(.bin文件)。

一、使用的平台和工具

1、硬件:单片机为stm32F030K6T6,ST-LINK下载器,USB转串口工具,USB转485工具。

2、软件:Keil,SecureCRT8.3,ST官方IAP。

二、软件工具的下载

1、SecureCRT8.3下载链接:

链接:https://pan.baidu.com/s/1GOICsxjxLIQbBdaj_ohQeQ 
提取码:scrt 
2、ST官网IAP下载链接:

网盘链接:链接:https://pan.baidu.com/s/1EOdtgTVvRmCa_vT-Lxzcnw 
提取码:a1bg 

官方链接:https://www.st.com/zh/embedded-software/stsw-stm32116.html#overview

如图:文件里边有相应的说明文档

三、实操

1、将下载好的IAP解压并打开

打开文档IAP项目后可以看到主函数如下:

int main(void)
{
  /*!< At this stage the microcontroller clock setting is already configured, 
       this is done through SystemInit() function which is called from startup
       file (startup_stm32f0xx.s) before to branch to application main.
       To reconfigure the default setting of SystemInit() function, refer to
       system_stm32f0xx.c file  USE_STDPERIPH_DRIVER,STM32F0XX,USE_STM320518_EVAL,STM320518_EVAL_REVB
     */ 
  
  /* Initialize Key Button mounted on STM320518-EVAL board */       
  STM_EVAL_PBInit(BUTTON_KEY, BUTTON_MODE_GPIO); 
  RS485_InitTXE();  
  
  /* Test if Key push-button on STM320518-EVAL Board is pressed */
  if (STM_EVAL_PBGetState(BUTTON_KEY) == 0x00)
  { 
    /* If Key is pressed, execute the IAP driver in order to re-program the Flash */
    IAP_Init();
        
    
    /* Display main menu */
    Main_Menu ();
  }  
  else
  {/* Keep the user application running */

    /* Test if user code is programmed starting from address "APPLICATION_ADDRESS" */
    if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
    { 
      /* Jump to user application */
      JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
      Jump_To_Application = (pFunction) JumpAddress;
      
      /* Initialize user application's Stack Pointer */
      __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
      
      /* Jump to application */
      Jump_To_Application();
    }
  }

  /* Infinite loop */
  while (1)
  {
  }
}

大概流程时是这样的,上电前按住编程键进入程序下载模式,在SecureCRT上可以看到菜单如下:

从键盘输入1,进入下载模式,stm32f030k6t6一直发送字符“C”,等待下载程序,如下图

点击Transfer->Send Ymodem,选择要下载的.bin文件,确定开始下载。知道大概的流程以后,我们就可以对代码进行编译移植,主要是更改编程键的硬件和所用的串口硬件

更改按键,打开工程文件中的stm320518_eval.h,如下图所示,172-178行就是编程键的硬件配置,改成自己要使用的IO口就可以了,别和其他IO重复。

更改串口,在同一个.h文件下找到下图程序段,改成自己用的串口即可。

改完这些以后,在Ymodem.c文件中还有一处需要更改,这里的擦除FLash有点问题,如下所示:

NbrOfPage = FLASH_PagesMask(size);   /*计算需要擦除Flash的页*/
                    /* erase user application area */
                    for (EraseCounter = 0; (EraseCounter < NbrOfPage) && (FLASHStatus == FLASH_COMPLETE); EraseCounter++)
                                        {
                                                FLASHStatus = FLASH_ErasePage(flashdestination + (PageSize * EraseCounter));
                                        }   

uint32_t FLASH_PagesMask(__IO uint32_t Size)
{
    uint32_t pagenumber = 0x0;
    uint32_t size = Size;

    if ((size % FLASH_PAGE_SIZE) != 0)
    {
        pagenumber = (size / FLASH_PAGE_SIZE) + 1;
    }
    else
    {
        pagenumber = size / FLASH_PAGE_SIZE;
    }
    return pagenumber;

}

最后配置一下flash空间大小,

这样就完事大吉了,串口IAP下载程序的bootloader就可以使用了。

如果想使用485的话,需要定义一个收发使能切换输出IO口,

打开common.c文件找到如下图函数

在发送的前后加上485的发送使能和接收使能,把串口的发送标志中断改为发送完成标志,发送的数据回出现错误。

2、APP的配置和编程

配置keil输出.bin文件:$K\ARM\ARMCC\bin\fromelf.exe --bin --output=@L.bin !L

配置Flash和SRAM的大小,

在主函数中定义APP程序存储的起始地址和中断向量表

在main函数中加入上边这段代码,将中断向量表复制到SRAM中(这里和stm32f103不一样)。

这样准备好IAP程序和APP的bin文件就可以验证程序了。

  • 22
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值