STM32串口IAP分享

什么是IAP?

IAPIn Application Programming的首字母缩写,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。

在重新编程过程中可以使用任意类型的通信协议,如UART、I2S、SPI等。这篇笔记分享的是使用UART方式IAP。

串口IAP实验

先理一理流程(本实验是以STM32F103ZET6为例):

1、实验说明

做这个实验需要准备两个keil工程,一个工程用于编写IAP程序,另一个工程用于编写我们的应用程序(要实现某些功能的程序),这里我们以一个点灯程序为例。最终,两份工程编译出来的可执行文件都需要烧写到芯片的FLASH中。只不过需要烧写到不同的地址,简单的示意图如下:

这里,使用的STM32的型号为STM32F103ZET6,其FLASH大小是512KB,0x08000000为其FLASH被映射的地址,程序被烧写到的就是这个地址。此处,我们的IAP程序烧写到这个地址,根据IAP程序的大小,我们在keil里可以设置合适的IAP结束地址。

注意:在没有IAP程序的情况下,0x08000000这个地址就是应用程序烧写的地址。

2、工程说明

本实验用到的两个工程可按照文末的方式获取,其中IAP工程移植至ST官方例程。下面对两个工程进行简单的说明

IAP工程:

(1)需要在target选项卡里设置我们IAP程序的起始地址与大小,如:

这里我们的IAP程序起始地址设为0x08000000,大小设为0x3000,即IAP所能用的FLASH空间为12KB。其中IAP所能占的占空间的大小可根据IAP的实际大小进行修改。

(2)需要修改程序中我们需要跳转到的应用程序的地址(即IAP程序的结束地址):

LED工程:

(1)需要在target选项卡里设置我们LED程序的起始地址与大小,如:

这里我们的LED程序起地址设为0x08003000,大小设为0x10000,即LED所能用的FLASH空间为64KB。其中结束地址可根据LED应用程序的实际大小进行修改。

(2)生成对应的.bin文件。这需要在User选项卡里添加如下命令(即编译后执行的命令):

其中,fromelf.exe是我们keil安装目录下的一个可执行程序,可以把.axf文件转换成.bin文件。要在keil中直接调用fromelf命令,必须要把fromelf.exe所在目录添加到环境变量中。添加环境变量的方法如下(该方法来自于《【野火】零死角玩转STM32—F429挑战者V2.pdf》):

本文以 Win7 系统为例添加工具链的路径到 PATH 环境变量,其它系统是类似的。

(1) 右键电脑系统的计算机图标,在弹出的菜单中选择属性 ,如图:

(2) 在弹出的属性页面依次点击高级系统设置 ->环境变量,在用户变量一栏中找到名为PATH的变量,若没有该变量,则新建一个。编辑PATH变量,在它的变量值中输入工具链的路径,如本机的是;D:\work\keil5\ARM\ARMCC\bin,注意要使用分号;让它与其它路径分隔开,输入完毕后依次点确定,如图:

(3) 打开 Windows 的命令行,点击系统的开始菜单,在搜索框输入cmd,在搜索结果中点击cmd.exe即可打开命令行, 如图:

(4) 在弹出的命令行窗口中输入fromelf回车,若窗口打印出 formelf 的帮助说明,那么路径正常,就可以开始后面的工作了;若提示不是内部名外部命令,也不是可运行的程序…信息,说明路径不对,请重新配置环境变量,并确认该工作目录下有编译工具链。

这个过程本质就是让命令行通过“PATH”路径找到fromelf.exe程序运行 。

3、IAP源码说明

(1)主函数:

int main(void)
{
    FLASH_Unlock(); /* FLASH解锁 */
    KEY_Init();     /* 按键初始化 */
    IAP_Init();     /* IAP初始化 */

    /* 按键按下则进入主菜单开始更新程序(注意:需要按下复位键的同时按下该按键触发程序更新) */
    if (GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)  == 0x00)
    {
        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 ();
    }
    /* 保持运行用户应用程序 */
    else
    {
        /* Test if user code is programmed starting from address "ApplicationAddress" */
        if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)
        {
          /* Jump to user application */
          JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
          Jump_To_Application = (pFunction) JumpAddress;
          /* Initialize user application's Stack Pointer */
          __set_MSP(*(__IO uint32_t*) ApplicationAddress);
          Jump_To_Application();
        }
    }

    while (1){}

    return 0;
}

可见,我们按下复位的同时按下PE2对应的按键即可触发应用程序更新操作,否则跳转到应用程序的起始地址执行应用程序(断点重启也是默认执行应用程序),这里的ApplicationAddress就是我们上面设置的0x08003000

(2)主菜单函数Main_Menu

这个函数里就是该IAP程序的功能,根据其中的打印信息:

可以知道,该IAP有三个功能(分别输入键盘上的数字1、2、3进行选择):一是下载程序(电脑->STM32);二是上传程序(STM32->电脑);三是执行新程序(即刚下载完成的程序)。

(3)下载程序功能函数SerialDownload

首先,上位机使用Ymodem协议进行数据下发,STM32根据协议解析数据,拿到有用的数据,并把这些数据写入FLASH对应的地址中,即ApplicationAddress。关于Ymodem协议及SerialDownload函数这里不展开讨论。

4、下载验证

(1)下载IAP程序

可以使用J-link等调试器进行下载,也可用串口ISP进行下载,我们选用的是串口ISP进行下载,借用的工具是FlyMcu

这里下载的是.hex文件,如果下载.bin文件,则会提示如下错误:

程序文件不是0x8000000和0x20000000区域的

使用ISP方式下载需要进行的硬件操作是:BOOT0引脚拉高,BOOT1引脚接地。即系统存储器被选为启动区域:

在点击开始编程按钮后,需要按下板子上的复位键,即可下载程序。

(2)通过IAP程序引导下载LED程序

上面提到下载程序使用的是Ymodem协议,所以得选用带有Ymodem协议传输方式的上位机软件来把应用程序下载到板子里。可以选用SecureCRT,也可以选用超级终端。这里选用的是超级终端:

首先按下数字键1触发下载程序操作,此时会不断打印CCCCC...。然后点传送->发送文件,选择要下载的.bin文件及Ymodem协议。下载完成后按下数字3即可执行新下载得应用程序:

终于,LED闪烁起来了,点灯项目成功~。断电重启之后默认执行的是这个点灯程序,要想下载新的程序,按下复位的同时按下PE2所对应的按键(需要一定的手速,哈哈)即可触发更新程序操作。

以上就是本次笔记分享的内容,如有错误,欢迎指出!



我的个人博客:https://zhengnianli.github.io/

我的微信公众号:嵌入式大杂烩

原文地址:https://www.cnblogs.com/zhengnian/p/11531527.html

时间: 2025-01-11 19:33:47

STM32串口IAP分享的相关文章

关于STM32的IAP与APP互相跳转

关于STM32的IAP与APP互相跳转 之前做了一个不带系统的IAP与APP互相跳转,在网上找了资料后,很顺畅就完成了,后来在IAR集成开发环境下,IAP无系统,APP用UCOS系统做互相跳转出现了很多问题.现将IAP学习过程和实际遇到问题总结一下. 首先说一下什么是IAP.IAP(In Application Programming)即在应用编程,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更

【STM32H7教程】第69章 STM32H7的系统bootloader之串口IAP固件升级

完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第69章       STM32H7的系统bootloader之串口IAP固件升级 本章节为大家讲解使用系统bootloader做程序升级的方法,即使不依赖外部boot引脚也可以方便升级. IAP的全称是In Application Programming,即在线应用编程. 69.1 初学者重要提示 69.2 跳转到系统bootloader的程序设计 69.3 STM

STM32串口USART1的使用方法和程序

通用同步异步收发器(USART)提供了一种灵活的方法来与使用工业标准NR 异步串行数据格式的外部设备之间进行全双工数据交换. USART利用分数波特率发生器提供宽范围的波特率选择,支持同步单向通信和半双工单线通信. 1.STM32固件库使用外围设备的主要思路 在STM32中,外围设备的配置思路比较固定.首先是使能相关的时钟,一方面是设备本身的时钟,另一方面如果设备通过IO口输出还需要使能IO口的时钟:最后如果对应的IO口是复用功能的IO口,则还必须使能AFIO的时钟. 其次是配置GPIO,GPI

炜煌E30 E31微型热敏打印机 STM32 串口驱动

设置为汉字模式 十六进制 命令:1C    26 USART_SendData(USART2,0x1C); while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET); USART_SendData(USART2,0x26); while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET); USART_OUT(USART2,"秦皇岛燕大滨沅科技发展有限公司\r\n"); 将会看到打印输

STM32串口控制步进电机(原创)

用的42步进电机: 厂家可能不一样,两项四线步进电机,里面有两个线圈.在电机什么电都没有接的情况下,用万用表测量四个管脚:两两短接(或者阻值很小)的为一组,可以分别接A+,a-剩余接B+,B-;顺序可以互换:  经测,我用的17hs4417  黑绿一组,红蓝一组. 建议还是买个步进电机驱动器,五六十一个,相当好用. 贴一下STM32串口控制步进电机的代码: #include "led.h" #include "delay.h" #include "key.

STM32串口中断的一些资料

在研究STM32串口接收发送中断的时候找到不少不错的资料,现在备份在这里.以供自己查阅,以及方便其他人. TC ====TXE 顺便预告下最近会写个有关串口处理数据的帖子,从查询和中断方面以及数据处理的方式,从队列以及FIFO方面写起. SECTION 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 /* 调试STM32串口过程中发现一个奇怪的问题,

stm32串口接收完整的数据包

借鉴了文章:<stm32串口中断接收方式详细比较> 文章地址:http://blog.csdn.net/kevinhg/article/details/40186169 串口的配置这里不做说明,仅对中断中的协议解析进行描述 数据帧协议: 帧头1 帧头2 数据长度 有效数据 crc_1 crc_2 B5 5B 03 00 57 0B 帧头1+帧头2+数据长度(包含有效数据.crc_1.crc_2)+有效数据 + crc_1 + crc_2(校验为帧头到有效数据) crc16校验未深入学习,代码也

stm32串口发送数据复位 第一个数据丢失

http://blog.csdn.net/kevinhg/article/details/40991655 STM32串口发送必须先检测状态,否则第一个字节无法发出,发送完毕,必须检测发送状态是否完成,否则,发送不成功,使用stm32f10x调试串口通讯时,发现一个出错的现象,硬件复位重启之后,发送测试数据0x01 0x02 0x03 0x04..接收端收到的数据为:0x02 0x03 0x04,第一个数据丢失.换成发送别的数值的数据,如0x06 0x0ff,则接收到0x0ff,0x06丢失.错

STM32串口接收小结

STM32串口接收数据 稍微理一下思路,一个数据从电脑发送到STM32,然后在从STM32返回到电脑显示出来. 如上图所示,发送(1所示的路线)前,STM32的淳口需要初始化的设置.包括:波特率,字长,硬件流,停止位,奇偶校验位,模式(接收,发送,接收和发送),串口的基地址(Instance).在初始化串口的函数里面,需要调用到HAL_UART_MspInit(),这是一个虚函数(_weak),HAL_UART_MspInit()会调用到HAL_GPIO_Init(),把IO口进行配置.(模式,