STM32系列(HAL库)——串口IAP

news2024/11/17 23:52:13

前言

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

        设备具备IAP功能的情况下,一般闪存中存在2个程序,第一个程序称之为 Bootloader 程序,其主要作用是判断设备是否需要升级以及接收程序完成升级这两个功能;第二个功能称之为APP程序,就是设备正常运行时的程序。

        对于Bootloader 程序,需要完成串口接收,内部Flash读写等代码的编写;对于APP程序,在编写设备正常运行的代码后,还要设置地址偏移以及生成bin文件。

        本文适合有一定STM32基础的学者参考学习。

一.软硬件准备

        软件:CubeMX、Xcom(串口调试助手)

        硬件:SMT32F103C8T6系统板,2个LED,2个外部按键

        需要注意:C8的容量为:ROM=64KB,RAM=20KB ,实际项目中应用IAP功能这个容量是偏小的,但作为简单了解学习还是够用的。

二.CubeMX配置

        这里需要完成Bootloader和APP两个程序,因此需要创建2个工程,大致实现的是上电运行Bootloader程序,现象为蓝灯闪烁,同时等待串口接收bin文件,接收bin文件后,通过按键1将文件烧录至内部Flash,再通过按键2执行APP程序,此时变为蓝绿灯闪烁。

        CubeMX配置大致如下:

  • 对于Bootloader:配置串口及打开串口接收中断,配置2个LED引脚(上拉输出),配置2个外部按键引脚(上拉输入模式)
  • 对于APP:配置2个LED引脚(上拉输出模式)
     

三、程序配置

1. Bootloader程序

        Bootloader程序较多,在此不方便贴出来,源码下载链接:点击跳转​​​​​​​

        这里主要讲一下要注意的点:

  • 对于串口部分,printf打印配置可参考:使用串口打印的3种方式
  • usart.c中缓存数组的大小设置,即

         这里设置的是10K的大小,就是APP生成的bin文件不能大于10KB,不然接收会溢出。这里的 最大值可以先把缓存数组大小设为1,再通过芯片RAM容量减去RO-data,ZI-data的大小就能大致 判断出来,     ​

比如我现在的变量大概占5K大小,C8的RAM容量20K,所以这个缓冲数组我最大可以设置为1024*15,超了编译会报错。

  • iap.h头文件中需要注意

 这里的偏移地址要和APP的偏移地址一致(后面会讲),因为APP的地址不再是默认的0x08000000

  •  stmflash.h头文件中1需注意

         这里是芯片ROM大小,不同芯片数值大小不同。

2.APP程序

         APP程序主要在Keil中会设置偏移地址和生成bin文件即可。

1.对于地址的偏移,操作如下:

         C8T6的ROM大小为64KB,即10000H,这里我留前面32KB给Bootloader程序,所以APP起始地址变为0X8008000,剩下ROM大小为64-32=32KB,所以Size为0X8000。

2.生成bin文件,可参考:关于KEil5 / MDK5如何设置编译产生bin文件

3.中断向量表偏移,在APP程序初始化时(while循环前)执行如下语句:

    SCB->VTOR=FLASH_BASE|0X8000;

        这里的0x8000指的是APP程序的起始地址,因为前面32KB(=0X8000)给了Bootloader程序,所以这里可以理解为往后移0x8000。

4.编写APP程序,我做的功能就是2个LED灯闪烁。编译后检查APP程序的bin大小,不能超过Bootloader程序可接收的最大值,大小可以在生成的bin文件属性查看。         

四、程序验证

1.板子上单执行Bootloader程序(蓝灯闪烁,绿灯熄灭,转GIF画质拉胯了)

2.串口助手发送bin文件

 3.按下按键1将bin文件烧录至内部Flash区域

 4.按下按键2跳转至APP程序

 5.APP程序执行效果(蓝、绿灯闪烁,转GIF画质拉胯了)

         其它F1芯片移植可直接套用模板,F4系列的需要修改内部flash读写程序,可直接从原子哥的例程Copy过来。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

javaScript学习———变量概述 变量的使用 变量语法扩展 变量命名规范交换 变量案例

博主每篇博文的浪漫主义: 【东京girl秀场上那些甜度爆表的女孩子们。💖】 https://www.bilibili.com/video/BV1pG411F7KT/?share_sourcecopy_web&vd_source385ba0043075be7c24c4aeb4aaa73352 东京girl秀场上那些甜度爆表的女孩子们。💖…

计算机组成原理--------12.4---------开始

计算机硬件的基本组成 冯诺依曼计算机的特点 冯诺依曼首次提出“存储程序”概念 计算机由五大部件组成:I/O设备(输入输出),存储器(存放数据和程序),运算器(算术运算、逻辑运算&…

[附源码]JAVA毕业设计科研项目审批管理系统(系统+LW)

[附源码]JAVA毕业设计科研项目审批管理系统(系统LW) 目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目…

关于解释型语言和编译性语言的区别

关于博主每篇博文的浪漫主义 【初恋是整遍《手写的从前》】 https://www.bilibili.com/video/BV1JP411g7qF/?share_sourcecopy_web&vd_source385ba0043075be7c24c4aeb4aaa73352 初恋是整遍《手写的从前》能够知道解释性语言和编译型语言的特点能够知道标识符不能是关键字…

docker_重装mysql

1.docker ps 查看docker正在运行的容器 2.docker stop xxx 停止正在运行的mysql 3.docker pull mysql:5.7 docker拉取mysql指定版本的镜像 docker pull mysql docker拉取最新版本的镜像 4.docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD123456 mysql:…

PHP代码审计系列(一)

PHP代码审计系列&#xff08;一&#xff09; 本系列将收集多个PHP代码安全审计项目从易到难&#xff0c;并加入个人详细的源码解读。此系列将进行持续更新。 extract变量覆盖 源码如下 <?php$flagextractFlag.txt; extract($_GET);if(isset($shiyan)){ $contenttrim(f…

YOLO算法创新改进系列(项目汇总)

&#x1f680;&#x1f680;&#x1f680;——YOLO算法创新改进系列项目汇总——&#x1f384;&#x1f384;&#x1f384; &#x1f680; YOLO算法创新改进系列 &#xff08;项目汇总&#xff09;&#x1f384;&#x1f388; &#x1f340; 改进YOLOv5/YOLOv7——魔改YOLOv5/Y…

文件操作及IO

目录 一、文件的分类 二、文件路径 三、File 常见方法 1、get 相关方法使用 2、文件的创建和删除 3、遍历目录下所有文件 四、文件读写 一、文件的分类 站在程序员的角度&#xff0c;文件通常可以分为两类&#xff1a; 文本文件&#xff1a;以字符形式存储二进制文件&…

Java基于SSM的海淘商城系统

随着计算机网络的普及,电子商务的兴起,网络支付以及网络安全体系逐渐完善,人们的生活进入了网络时代,越来越多的人习惯于乐于网上购物,只需上网轻轻点击鼠标便能够买到心仪商品。 本系统主要是针对广大网络消费者而开发的,专为网络消费者打造,建设一个”全球购”海淘商城系统。…

Redis学习笔记(五)

主从复制 单机redis的风险和问题 机器故障&#xff1a;硬盘故障、系统崩溃容量瓶颈&#xff1a;内存不足&#xff0c;无限升级内存结论&#xff1a;为了避免单点redis服务器故障&#xff0c;准备多台服务器互相连通&#xff0c;将数据复制多个副本保存在不同的服务器上&#xf…

Vue 官方文档2.x教程学习笔记 1 基础 1.5 计算属性和侦听器 1.5.2 侦听器

Vue 官方文档2.x教程学习笔记 文章目录Vue 官方文档2.x教程学习笔记1 基础1.5 计算属性和侦听器1.5.2 侦听器1 基础 1.5 计算属性和侦听器 1.5.2 侦听器 虽然计算属性在大多数情况下更合适&#xff0c;但有时也需要一个自定义的侦听器。 这就是为什么 Vue 通过 watch 选项提…

图像处理:模糊图像判断

目录 上期回顾 采用Laplace算子的原因 实现的效果 图片素材 代码的展示与讲解 效果展示 项目资源 上期回顾 上一次的图像清晰度评价没有成功&#xff0c;主要的原因是那几张图像清晰度评价函数都实际都采用了梯度求解&#xff0c;不同的场景灰度的明暗不同&#xff0c;…

数据结构栈的实现

目录栈的概念栈的结构声明初始化数据入栈出栈判断栈是否为空取栈顶的值销毁栈栈的概念 栈是一种线性表&#xff0c;插入数据的一端叫栈顶&#xff0c;另一端叫栈底。 入栈&#xff1a;数据从栈顶进入栈中 出栈&#xff1a;数据从栈顶删除 所以&#xff0c;栈的特点就是先进后出…

Spark - OnYARN 模式搭建,并使用 Scala、Java、Python 三种语言测试

一、SparkOnYarn搭建 安装前需要提前安装好 hadoop 环境&#xff0c;关于 HDFS 和 Yarn 集群的搭建可以参考下面我的博客&#xff1a; https://blog.csdn.net/qq_43692950/article/details/127158935 下面是我 Hadoop 的安装结构 主机规划设置主机名角色192.168.40.172node1N…

1. STL六大组件

0. 介绍 STL提供六大组件&#xff0c;它们之间可以彼此套用&#xff0c;如下图所示&#xff1a; 容器&#xff08;containers&#xff09;&#xff1a;用于存放数据&#xff1b; 算法&#xff08;algorithms&#xff09;&#xff1a;包含各种常用算法&#xff1b; 迭代器&…

Dubbo-RPC核心接口介绍

前言 Dubbo源码阅读分享系列文章&#xff0c;欢迎大家关注点赞 SPI实现部分 Dubbo-SPI机制 Dubbo-Adaptive实现原理 Dubbo-Activate实现原理 Dubbo SPI-Wrapper 注册中心 Dubbo-聊聊注册中心的设计 Dubbo-时间轮设计 通信 Dubbo-聊聊通信模块设计 RPC 聊聊Dubbo协议 …

go语言日志实现详解(打印日志、日志写入文件和日志切割)

log包定义了Logger类型&#xff0c;该类型提供了一些格式化输出的方法。本包也提供了一个预定义的“标准”logger&#xff0c;可以通过调用函数Print系列(Print|Printf|Println&#xff09;、Fatal系列&#xff08;Fatal|Fatalf|Fatalln&#xff09;、和Panic系列&#xff08;P…

[附源码]计算机毕业设计JAVA医院挂号管理系统

[附源码]计算机毕业设计JAVA医院挂号管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybati…

简单的咖啡文化静态HTML网页设计作品 DIV布局咖啡馆文化网页模板代码 DW咖啡网站制作成品

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

达梦安装目录各个文件夹解析

达梦安装目录各个文件夹解析 总览&#xff1a; 1、bin目录 bin目录&#xff1a;存放常用命令和.so(shared object)文件&#xff08;动态链接库类似Windows的ddl文件、Linux的lib目录&#xff09; 2、bin2目录 bin2目录&#xff1a;存放utf8的lib库 3、data目录 data目录&#…