STM32F4 IAP升级 Bootloader程序+上位机下载程序源码

目录

一、硬件设计

二、软件设计

三、上位机设计

四、IAP说明

五、下载验证

资料下载地址:STM32F4 IAP升级 Bootloader程序+上位机下载程序源码

一、硬件设计

        升级下载程序采用外部硬件触发的方式。
        PB-20M4硬件板 预留一个IO口处理代码下载及更新的功能。
        功能简介:开机前若将 PB4接口与GND用杜邦线(改进硬件后可用跳帽)短接, LED6闪烁状态,即可进入固件下载功能程序,然后等待串口输入接收APP程序(.bin文件,生成方法见后面说明、分段接收每包2K数据,进行CRC校验),在接收完APP程序包后,断开PB4与地线的连接即可进入用户程序。
        用到的资源:
        
  •         指示灯DS6
  •         一根短接线,优化硬件后 可用跳帽
  •         串口(共地)
图一  硬件指示图
图二  串口连接

二、软件设计

总共涉及三部分代码:1、Bootloader;2、Flash App;3、上位机程序

1.Bootloader;
        主函数进行任务判断,以及IAP更新和跳转等各项操作。串口中断中运行数据处理,数据检测,与上位机及握手校验等任务。Bootloader大小仅16K左右。
2、Flash App;
        需要下载的程序,设置flash起始地址偏移量,由bootloader串口中断中写到flash中去。在初始化的时候执行跳转,运行该代码程序。
3、上位机发送校验程序
        协议如下:            
/*---------------------------------------------------------------------
protocol-----|#|remainSend|#|length|data[]|CRC_check
---------------------------------------------------------------------*/            
        IAP不是一下子把所有BIN文件都接收过来写入FLASH,而是根据自己硬件的RAM空间,把BIN文件分成若干包,如每1K,2K等传送一次,传送当中加上帧头,帧尾,CRC,及总共多少包,及这是第几包等信息封装好的数据包,每接收一包写相应FLASH,下一包对应的FLASH地址++,如此完成固件更新。

三、上位机设计

        打开应用程序IAP_Download_USART\IAP_Download_USART\obj\Debug中exe文件。
或直接打开附件中IAP_Download_USART.exe应用程序
        运行界面
        烧录过程:
        
开发环境如下:
VS2013上用C#设计的简单的串口应用程序,基于.net4.5。

 主要代码:

四、IAP说明

         IAP(In Application Programming)即应用编程,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,后期可以方便的通过预留通信口对产品进行更新升级。在实现IAP功能时,需要在设计固件程序时编写两个项目的代码,第一个项目程序(bootloader程序)不执行正常的功能操作,而是只通过某种通信方式接收程序和数据,执行对第二部分代码的更新;第二个项目代码是功能代码(APP程序)。这两部分项目代码都同时烧录在User Flash中,在芯片上电后,首先执行第一个项目的代码,进行如下操作:
  •       检查是否需要对第二部分代码进行更新
  •       如果不需要更新,则运行第二部分代码
  •       若需要更新,执行更新操
  •       更新完成,执行第二部分代码
        Bootloader代码必须通过其他手段,如JTAG或ISP烧录;第二部分代码使用Bootloader程序IAP功能烧录,也可以通过JTAG烧录,以后需要更新时可以通过IAP代码进行烧录。
两部分代码存放在flash不同的地址位置,从最低地址区开始存放Bootloader,在其后指定位置存放APP程序。
        STM32F4的内部闪存(flash)地址起始于0x08000000,一般情况下,程序文就从此地址开始写入。此外STM32是基于Cortex-M4 内核的微控制器,其内部通过一张“中断向量表”来响应中断,程序启动后,将首先从“中断向量表”取出复位中断向量执行复位中断程序完成启动,而这张“中断向量表”的起始地址是0x08000004,当中断来临,STM32F4 的内部硬件机制亦会自动将PC 指针定位到“中断向量表”处,并根据中断源取出对应的中断向量执行中断服务程序。
IAP程序满足的要求:
  •    新程序必须在IAP程序之后的某个偏移量为x 的地址开始;
  •    必须将新程序的中断向量表相应的移动,移动的偏移量为x;
        1.程序起始地址设置方法
        打开pbdr_v110工程,点击Options for Target /Target选项卡,如图所示:
        默认条件下,图中IROM1的起始地址(Start)一般为0x08000000,大小1M(Size)为0x100000。而我们设置APP程序起始地址为0X08010000,即偏移量为0x10000(64K字节),留给用户flash空间(size)是1024k-64k=960K。偏移量是定义留给bootloader程序的地址空间大小。发布者可以定义bootloader空间的大小这里我定义的是64K,偏移量为0x200的倍数即可。(本设计的bootloader只有16K左右),这里留有余量,方便bootloader以后的升级修改。
        1.中断向量表的偏移设置方法

            在pbdr_v110版本中在mian.c中设置如下:

        MDK编译默认生成.hex文件,而升级程序需要生成.bin文件。MDK自带的格式转换工具fromelf.exe,来实现.axf文件到.bin文件的转换。该工具在MDK的安装目录\ARM\BIN40文件夹下。通过下一步设置,可以在MDK编译成功之后,调用fromelf.exe (注意,MDK的安装路径,我的路径D:\Keil_v5\ARM\ARMCC\bin),根据当前工程pbdr.axf,生成一个pbdr.bin文件。存放在OBJ文件夹下。在得到.bin文件后,我们只需要将这个bin文件通过串口传送给单片机,即可执行代码的下载以及升级。

五、下载验证

        将JTDO(PB4)与GND短接,上电后,LED灯D6开始闪烁,说明进入下载更新状态。

        通过TTL转usb连上电脑端串口,打开IAP更新软件(打开应用程序IAP_Download_USART\IAP_Download_USART\obj\Debug文件夹中IAP_Download_USART.exe文件或直接打开附件中IAP_Download_USART.exe应用程序),打开串口即可选则发送BIN文件进行代码下载。

关闭下载窗口,断开短接线即可运行更新后的程序。

stm32 IAP Bootloader V1.4源码:

/*--------------------------------------------------------------------------------------
@file:    IAP_Serial
@version: V1.0
@author:  Shanwu.5_W && Potter_lv
@Introduction : Unlock flash   load_app from serial 
--------------------------------------------------------------------------------------*/
#include "sys.h"
#include "delay.h"  
#include "usart.h"   
#include "led.h"  
#include "stmflash.h" 
#include "iap.h"  

void Button_Switch_DFU_Init(void)    //按键升级初始化
{
  GPIO_InitTypeDef GPIO_InitStructure; 
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
}
#define  GET_BUTTON_STATE   GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_3)

int main(void)
{ 
        u8 t;
        
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
        delay_init(168);  //初始化延时函数
        uart_init(115200);                //初始化串口波特率为115200
        
        LED_Init();                                        //初始化LED 
        Button_Switch_DFU_Init();                //初始化跳转APP程序接口
        
        while(1)
        {
                        t++;
                        delay_ms(10);
                        if(t==30)
                        {
                                LED0=!LED0;                  //D6闪烁 等待更新状态
                                t=0;
                        }                        
                        if(GET_BUTTON_STATE != 0x00)        //悬空进入更新进程
                        {                                        
                                if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)   //判断是否为0X08XXXXXX.
                                {         
                                        USART_Cmd(USART2, DISABLE);                                //失能串口2 ,防止跳转到App程序时死机                                        
                                        iap_load_app(FLASH_APP1_ADDR);                             //执行FLASH APP代码                
                                }else 
                                {
                                        printf("非FLASH应用程序,无法执行!\r\n");           
                                }
                        }
                }                        
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/295670.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue-cli配置自定义打包命令

vue-cli配置自定义打包命令 一、目录结构二、.env.development三、.env.production四、 对应打包命令 一、目录结构 在vue项目中,env是全局配置文件,可以存储不同环境下的变量。 使用vue-cli搭建项目,默认会在根目录创建一个.env文件 如果需…

Efficient Classification of Very Large Images with Tiny Objects(CVPR2022)

文章目录 基本参数设置Colon Cancer10折交叉验证(不带对比学习N10)10折交叉验证(带对比学习N10)N5N50λ1.0λ0best 基本参数设置 dataset:colon cancer TenCrossValidation:True optimizer:ada…

聊聊spring事务12种场景,太坑了

前言 对于从事java开发工作的同学来说,spring的事务肯定再熟悉不过了。 在某些业务场景下,如果一个请求中,需要同时写入多张表的数据。为了保证操作的原子性(要么同时成功,要么同时失败),避免数…

基于YOLOv7算法的高精度实时安全背心目标检测识别系统(PyTorch+Pyside6+YOLOv7)

摘要:基于YOLOv7算法的高精度实时安全背心目标检测系统可用于日常生活中检测与定位安全背心,此系统可完成对输入图片、视频、文件夹以及摄像头方式的目标检测与识别,同时本系统还支持检测结果可视化与导出。本系统采用YOLOv7目标检测算法来训…

【python入门】day19:学生管理系统需求分析、系统设计、主函数设计

需求分析 应具备功能—— 添加学生及成绩信息; 将学生信息保存到文件中; 修改和删除学生信息; 查询学生信息; 根据学生成绩进行排序; 统计学生的总分 系统设计 1.录入学生信息模块 2.查找 3.删除 4.修改 5.成绩排名…

shell 获取主机IP 脚本中使用IP 打印出来IP

目录 查看ip查看网关只查看ens33过滤ip拿到网卡名字对内容进行切片获取第一网卡IP (head -1 表示第一个网卡)脚本中打印IP 查看ip ip a 查看网关 ip r只查看ens33 ip a show dev ens33过滤ip ip a | grep -oE [0-9]\.[0-9]\.[0-9]\.[0-9] 拿到网卡名…

H5通过getUserMedia拍照黑屏原因

项目需求背景:如同我上篇文章,https://blog.csdn.net/carfge/article/details/135417741 问题场景: 小米手机中访问H5,网页已获得摄像头授权(左上角相机出现图标),但页面黑屏。 原因排查&#x…

从零学Java - 面向对象 abstract

面向对象 abstract 文章目录 面向对象 abstract1.什么是抽象?1.1 生活中的抽象 2.抽象类2.1 不该被创建对象的类2.2 抽象类的语法2.3 抽象类的作用2.4 抽象类的特点 3.抽象方法3.1 不该被实现的方法3.2 抽象方法的语法3.3 抽象方法的特点 4.总结4.1 抽象类4.2 抽象方法 1.什么…

刷算法-- leetcode 96. 不同的二叉搜索树

思路 观察树的组成,可以发现n3时的二叉搜索树可以由,头节点分别为1、2、3时的所有结果组成!定义dp[i]为由i个节点组成的二叉搜索树的个数。确定递推公式,dp[i] 由1为头节点组成的二叉搜索树个数由2为头组成的个数…由i为头节点组…

Echarts—词云库(echarts-wordcloud)使用

echarts-wordcloud是基于echarts的一个插件,所以我们要首先安装echarts包,然后再安装echarts-wordcloud的包,这里我的练习项目安装的版本;当然,你可以随意安装你需要的版本; “echarts”: “^5.3.3”, “ec…

Linux的ping命令、wget命令、curl命令

一、ping命令 通过ping命令,可以检查指定的网络服务器是否是可联通状态 形式:ping [-c num] ip或主机名 -c:检查的次数,不使用-c,将无限次数持续检查 ip或主机名:被检查的服务器的ip地址或主机名地址 …

RoadMap8:C++中类的封装、继承、多态与构造函数

摘要:在本章中涉及C最核心的内容,本文以C中两种基础的衍生数据结构:结构体和类作为引子,从C的封装、继承与多态三大特性全面讲述如何在类这种数据结构进行体现。在封装中,我们讲解了类和结构体的相似性;在继…

C语言——指针

一、定义 指针也就是内存地址,指针变量是用来存放内存地址的变量。 将内存以一个字节分为一个个内存单元,每个内存单元都进行编号,这个编号就是地址,也就是指针。 int b 1;int *pb &b;//这里的pb变量是一个整型指针变量&a…

Databend 的安装配置和使用

介绍 Databend 是一个内置在 Rust 中的开源、弹性和工作负载感知的云数据仓库,为 Snowflake 提供了具有成本效益的替代方案,专门对最大的数据集进行复杂分析而设计。 性能: 在存储对象上,能快速进行数据分析。没有索引和分区&a…

CSS 放大翻转动画

<template><div class="container" @mouseenter="startAnimation" @mouseleave="stopAnimation"><!-- 旋方块 --><div class="box" :class="{ rotate-scale-up-hor: isAnimating }"><!-- 元素内…

vmware安装redhat 7.6 操作系统

vmware安装redhat 7.6 操作系统 1、下载redhat 7.6 操作系统镜像文件2、安装redhat 7.6操作系统3、配置redhat 7.6 操作系统3.1、配置静态IP地址 和 dns3.2、查看磁盘分区3.3、查看系统版本 1、下载redhat 7.6 操作系统镜像文件 链接: 盘盘 zwzg 文件名&#xff1a;rhel-serv…

LowB三人组(冒泡排序,插入排序,选择排序)(数据结构课设篇1,python版)(排序综合)

本章博客主要详细讲解一下LowB三人组排序&#xff0c;为什么叫LowB三人组呢&#xff1f;因为他们的时间复杂度都为O&#xff08;n^2&#xff09;。下篇博客会再讲解NB三人组&#xff08;堆排序&#xff0c;归并排序和快速排序&#xff09;&#xff0c;第三篇博客会讲解其他排序…

C语言全面学习基础阶段01—C生万物

如何学好 C 语言 1. 鼓励你&#xff0c;为你叫好。 C 生万物 编程之本 长远 IT 职业发展的首选 C 语言是母体语言&#xff0c;是人机交互接近底层的桥梁 学会 C/C &#xff0c;相当于掌握技术核心 知识点一竿子打通。 IT 行业&#xff0c;一般每 10 年就有一次变革 40 年间&a…

【GUI界面软件】抖音评论采集:自动采集10000多条,含二级评论、展开评论!

文章目录 一、背景说明1.1 效果演示1.2 演示视频1.3 软件说明 二、代码讲解2.1 爬虫采集模块2.2 软件界面模块2.3 日志模块 三、获取源码及软件 一、背景说明 1.1 效果演示 您好&#xff01;我是马哥python说&#xff0c;一名10年程序猿。 我用python开发了一个爬虫采集软件…

C语言学习NO.11-字符函数strlen,strlen函数的使用,与三种strlen函数的模拟实现

&#xff08;一&#xff09;strlen函数的使用 strlen函数的演示 #include <stdio.h> #include <string.h>int main() {char arr1[] "abcdef";char arr2[] "good";printf("arr1 %d,arr2 %d",strlen(arr1),strlen(arr2));return …