STM32升级方法(一):IAP升级 您所在的位置:网站首页 iap支付失败是什么 STM32升级方法(一):IAP升级

STM32升级方法(一):IAP升级

2023-11-06 22:10| 来源: 网络整理| 查看: 265

此博客主要用于记录学习过程中的心得以及防止遗忘,下面的一些图片来源于网上,如有侵犯请联系。

STM32芯片的升级方式众多,这里简单介绍下,主要有ICP((In-Circuit Programming – ICP)、ISP(In-System Programming)、IAP((In-Application Programming – IAP),定义和区别如下:

ISP(In-System Programming)在系统可编程,指电路板上的空白器件可以编程写入最终用户代码, 而不需要从电路板上取下器件,已经编程的器件也可以用 ISP 方式擦除或再编程。在线编程(In-Circuit Programming – ICP)方式用于更新闪存存储器的全部内容,它通过JTAG、SWD协议或系统加载程(Bootloader)下载用户应用程序到微控制器中。ICP是一种快速有效的编程方法,消除了封装和管座的困扰。在程序中编程(In-Application Programming – IAP)可以使用微控制器支持的任一种通信接口(如I/O端口、USB、CAN、UART、I 2 C、SPI等)下载程序或数据到存储器中。IAP允许用户在程序运行时重新烧写闪存存储器中的内容。然而,IAP要求至少有一部分程序已经使用ICP烧到闪存存储器中。

其中ISP属于ICP中的一种,在下载的时候需要控制boot0/boot1引脚,使用系统自带的加载程序(bootloader)进行升级用户程序,优点是:快递编程、芯片内部可以不需要任何的程序(即空白芯片也可以升级)、芯片占用的资源少。缺点是:只能使用固定的外设和协议,其中stmf10x只能通过USART1来进行升级,灵活性不高。

IAP使用的boot loader是用户自己编写的,所以需要提前把这部分程序烧入flash中。其优点是:很灵活,可以通过各种外设给芯片进行升级,如USART、SPI、以太网、以及SD卡等等,协议完全可以有自己定义,只要上位机和下位机一致既可。缺点是IAP占用一部分flash资源,需要提前把程序烧入进去。

ISP和IAP是STM32芯片升级的趋势,JTAGA和SWD方式在调试程序的时候使用的会多些,但是在出厂后,使用这些方式升级相对来说很麻烦。所以基本上使用ISP和IAP,我做的项目中上位机使用的是3399,采集信号使用的是stm32f10r8,使用SPI外设直接进行升级,3399上面跑安卓系统,只要把升级文件下载下来就可以进行升级。当然这只是其中的一种方式,还可以通过无线通信等方式对stm32进行升级,非常的灵活。

STM32 IAP升级原理简介 STM32 IAP 升级官方资料汇总,这些都是标准库。 STM32F10xxx in-application programming using the USART (AN2557) STM32F2xx in-application programming using the USART (AN3374) STM32F4 in-application programming (IAP) using the USART (AN3965) STM32L1xx in-application programming (IAP) using the USART (AN3310) STM32F3xx in-application programming (IAP) using the USART (AN4045) STM32F0xx in-application programming using the USART (AN4065) STM32F107 in-application programming (IAP) over Ethernet (AN3226) STM32F2x7 in-application programming (IAP) over Ethernet based on LwIP TCP/IP stack (AN3376) LwIP TCP/IP stack demonstration for STM32F2x7 microcontrollers based on LwIP TCP/IP stack and FreeRTOS (AN3384) STM32F4x7 in-application programming (IAP) over Ethernet based on LwIP TCP/IP stack (AN3968)

上面的链接是下载官方的IAPdemo,理解了官方的demo后可以自己编写符合自身要求的boot loader程序,需要注意的是这demo使用的固件库是3.3的比较旧。

STM32 IAP原理

咱们都知道IAP升级是使用客户自己编写的boot loader而不是系统自带的,所以flash需要为两部分,一部分用来存放IAP(boot loader)程序,另外一部分用于存放用户程序,即芯片真正需要跑的程序。

咱们需要知道芯片从上电到运行的过程。M3的启动流程是:上电后从0x0800 0004取出复位中断向量地址,然后跳转到复位中断程序入口(主要是初始化系统时钟,以及调用_main),执行结束后跳转到main函数。流程如下:

上图是针对运行一个程序的流程图,咱们的IAP+user Programs属于两个程序,所以咱们需要把IAP放在flash的起始地址,即上电后先执行boot loader,查看升级条件是否满足(如按键、引脚的电位等),满足的话就进行升级用户程序,不满足的话直接跳转到之前的用户程序。升级其实就是把flash内的内容擦除然后写入新的程序。

IAP执行流程

板子上电,依然从0x08000004处取出复位中断向量地址,执行复位中断函数后跳转到IAP的main(标号①所示),在IAP的main函数判断升级条件,如果升级条件满足则进行升级,否则强制跳转到0x08000004+N+M处(标号②所示),即用户程序中断向量表的复位中断地址处,执行复位中断,最后跳转到用户main函数中(标号③所示),运行应用程序。 当发生中断请求后,程序跳转到新的中断向量表中取出新的中断服务函数入口地址,再跳转到新的中断服务函数中执行(标号④⑤所示),执行完中断函数后再返回到main函数中来(标号⑥所示)。所以在执行应用程序的时候,需要先设置中断向量表的偏移。要不然用户程序中的中断还是会去原来的中断向量表中获取中断服务函数,这里可能会导致运行死机的情况。

 对于步骤④⑤,在main函数的执行过程中,如果CPU得到一个中断请求,PC指针本来应该跳转到0x08000004处的中断向量表,由于我们设置了中断向量表偏移量为N+M,因此PC指针被强制跳转到0x08000004+N+M处的中断向量表中得到相应的中断函数地址,再跳转到相应新的中断服务函数,执行结束后返回到main函数中来

原理就是这么简单,下面分析下官方的demo,这里以stm32f10x为例(AN2557)。

IAP/src/main.c int main(void) { /* Flash unlock */ /*flash解锁,因为需要操作flash*/ FLASH_Unlock(); /* Initialize Key Button mounted on STM3210X-EVAL board */ /*初始化按键,demo中的升级触发条件为按键按下*/ STM_EVAL_PBInit(BUTTON_KEY, BUTTON_MODE_GPIO); /* Test if Key push-button on STM3210X-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 */ /*初始化串口,demo里面使用的是usart1 + Y-MODe协议*/ IAP_Init(); SerialPutString("\r\n================================================================"); SerialPutString("\r\n= (C) COPYRIGHT 2010 STMicroelectronics ="); SerialPutString("\r\n= ="); SerialPutString("\r\n= In-Application Programming Application (Version 3.3.0) ="); SerialPutString("\r\n= ="); SerialPutString("\r\n= By MCD Application Team ="); SerialPutString("\r\n============================================================"); SerialPutString("\r\n\r\n"); /*升级菜单*/ Main_Menu (); } /* Keep the user application running */ else { /* Test if user code is programmed starting from address "ApplicationAddress" */ /*升级条件不满足,跳转到用户程序处执行用户程序*/ if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000) { /* Jump to user application */ /*ApplicationAddress为用户程序的栈地址,+4便为用户程序的复位中断向量地址*/ JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4); Jump_To_Application = (pFunction) JumpAddress; /* Initialize user application's Stack Pointer */ __set_MSP(*(__IO uint32_t*) ApplicationAddress); /*执行用户空间的复位中断向量函数,里面主要是进行系统时钟配置,执行用户空间的main函数数*/ Jump_To_Application(); } } while (1) {} }

上述的就是IAP的入口,先查看是否触发了升级条件,触发了进行升级处理,要是没有触发则跳转到用户中断向量表中获取复位中断函数的入口,然后执行复位中断服务函数,最后运行用户空间的main函数。note:只要修改触发方式,根据自己的板子来选择相应的触发方式,以及相应的外设传输。

升级条件满足后进入升级主菜单中, IAP/src/common.c 文件里面,升级主菜单主要是选择相应的操作指令,进行相应的操作。这里有下载用户程序指令、获取用户程序指令、跳转到用户程序指令以及解除写保护指令。note:咱们根据自己的情况可以适当的裁剪,比如不想使用过多的存储器资源的话,可以只实现下载升级指令。

void Main_Menu(void) { uint8_t key = 0; /* Get the number of block (4 or 2 pages) from where the user program will be loaded */ /*计算IAP占用的flash页数*/ BlockNbr = (FlashDestination - 0x08000000) >> 12; /* Compute the mask to test if the Flash memory, where the user program will be loaded, is write protected */ #if defined (STM32F10X_MD) || defined (STM32F10X_MD_VL) UserMemoryMask = ((uint32_t)~((1


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有