STM32单片机实现串口IAP升级

news2024/11/13 18:18:24

一.概述

1.要实现串口IAP升级,首先要编写一个bootloader程序,然后再写支持IAP的app程序;

2.keil下bootloader的程序rom和ram设置

3.app程序要用bin文件

注:本文以STM32H743举例,其他stm32单片机IAP升级原理类似。

二.实现

1.bootloder程序实现

(1)基本知识

     stm32的flash地址起始于0x0800 0000,结束地址是0x0800 0000加上芯片实际的flash大小,不同的芯片flash大小不同。

     RAM起始地址是0x2000 0000,结束地址是0x2000 0000加上芯片的RAM大小。不同的芯片RAM也不同。

(2)STM32H743 bootloader设置

说明:由于 STM32H7 的扇区大小固定为 128KB 一个,最小擦除单位也是以扇区为单位的,因此,至少分配一个扇区给 Bootloader,否则后续擦写 APP 的时候,可能把 Bootloader 也给擦了!所以,我们使用 128K(0X20000)字节来存放 Bootloader。

(3)代码实现

int main(void)

{

u8 t;

u16 wait_s = 0;

u8 key;

u32 applenth=0;         //接收到的app代码长度

u8 clearflag=0;  

u32 Buffer[4];

Cache_Enable();               //打开L1-Cache

HAL_Init();          //初始化HAL库

Stm32_Clock_Init(160,5,2,4);       //设置时钟,400Mhz

delay_init(400); //延时初始化

uart_init(115200); //串口初始化

LED_Init(); //初始化LED

KEY_Init(); //初始化按键

SDRAM_Init();             //初始化SDRAM

while(1)

{

  if(USART_RX_STA&0x8000)

{

        USART_RX_STA=0;     //清空   

applenth=USART_RX_CNT;    //  applenth

USART_RX_CNT=0;

printf("用户程序接收完成!\r\n");

printf("代码长度:%dBytes\r\n",applenth);

}

else

{

  if(wait_s >= 500)

{

  wait_s = 0;

  printf("等待用法发送程序...  \r\n");

}

}

t++;

wait_s ++;

delay_ms(10);

if(t==30)

{

LED0_Toggle;

t=0;

if(clearflag)

{

clearflag--;

}

}     

key=KEY_Scan(0);

if(key==WKUP_PRES) //WK_UP按键按下

{

if(applenth)

{

printf("开始更新固件...\r\n");

  if(((*(vu32*)(0x24001000+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.

{  

iap_write_appbin(FLASH_APP1_ADDR,USART_RX_BUF,applenth);//更新FLASH代码   #define FLASH_APP1_ADDR 0x08020000

printf("固件更新完成!\r\n");

}else

{

printf("非FLASH应用程序!\r\n");

}

  }else

{

printf("没有可以更新的固件!\r\n");

}

clearflag=7;//标志更新了显示,并且设置7*300ms后清除显示  

}

if(key==KEY1_PRES) //KEY1按下

{

if(applenth)

{  

printf("固件清除完成!\r\n");    

applenth=0;

}else  

{

printf("没有可以清除的固件!\r\n");

}

clearflag=7;//标志更新了显示,并且设置7*300ms后清除显示  

}

if(key==KEY2_PRES) //KEY2按下

{

printf("开始执行FLASH用户代码!!\r\n");

if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.

{  

iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码  

}else

{

printf("非FLASH应用程序,无法执行!\r\n");   

}  

clearflag=7;//标志更新了显示,并且设置7*300ms后清除显示   

}

}      

}

(4)代码功能逻辑:

需要先按下 KEY_UP 按键,将串口接收到的 APP 程序存放到 STM32 的内部 FLASH;

再按 KEY2 既可以执行这个 FLASH APP 程序。

通过 KEY1 按键,可以手动清除串口接收到的APP 程序。

DS0 用于指示程序运行状态。

2.app程序及逻辑

(1)IAP流程逻辑

(2)keil设置

(3)代码实现

int main(void)

{

  SCB->VTOR = FLASH_BASE|0x20000;//设置偏移量  FLASH_BASE :  (uint32_t)0x08000000

RTC_TimeTypeDef RTC_TimeStruct;

  RTC_DateTypeDef RTC_DateStruct;

  u8 tbuf[40];

u8 t=0;

HAL_Init();          //初始化HAL库

Stm32_Clock_Init(160,5,2,4);       //设置时钟,400Mhz

delay_init(400);     //延时初始化

uart_init(115200); //串口初始化

usmart_dev.init(200);      //初始化USMART

    printf("RTC APP running\r\n");

LED_Init(); //初始化LED

KEY_Init(); //初始化按键

SDRAM_Init();                    //初始化SDRAM

    RTC_Init();                     //初始化RTC

    RTC_Set_WakeUp(RTC_WAKEUPCLOCK_CK_SPRE_16BITS,0); //配置WAKE UP中断,1秒钟中断一次  

    while(1)

    {

t++;

if((t%100)==0) //每100ms更新一次显示数据

{

            HAL_RTC_GetTime(&RTC_Handler,&RTC_TimeStruct,RTC_FORMAT_BIN);

sprintf((char*)tbuf,"Time:%02d:%02d:%02d",RTC_TimeStruct.Hours,RTC_TimeStruct.Minutes,RTC_TimeStruct.Seconds);

      printf("RTC time=%s\r\n",tbuf);

            HAL_RTC_GetDate(&RTC_Handler,&RTC_DateStruct,RTC_FORMAT_BIN);

sprintf((char*)tbuf,"Date:20%02d-%02d-%02d",RTC_DateStruct.Year,RTC_DateStruct.Month,RTC_DateStruct.Date);

printf("RTC date=%s\r\n",tbuf);

sprintf((char*)tbuf,"Week:%d",RTC_DateStruct.WeekDay);

printf("RTC week=%s\r\n",tbuf);

}

if((t%20)==0)LED0_Toggle; //每200ms,翻转一次LED0

        delay_ms(10);

}  

}

说明:重点是程序开始要有语句:SCB->VTOR = FLASH_BASE|0x20000;后面代码和普通app程序无区别

3.app生成bin文件

通过在 User 选项卡,设置编译后调用 fromelf.exe,根据.axf 文件生成.bin 文件,用于

IAP 更新。 

具体见之前文章:

STM32多种开发环境及生成hex及bin文件介绍_stm32 cubeide fromelf-CSDN博客文章浏览阅读758次,点赞29次,收藏23次。STM32多种开发环境及生成hex及bin文件介绍keil5 STM32CubeIDE EWARM如果不考虑商业应用keil的比较好,如果考虑商业付费用STM32CubeIDE更好一些,毕竟是免费的。_stm32 cubeide fromelfhttps://blog.csdn.net/xieliru/article/details/139849283?spm=1001.2014.3001.5501

4.串口升级app

(1)首先用keil把bootloader程序用烧写器烧写到单片机中

(2)通过串口IAP升级app程序

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

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

相关文章

AI时代的风口,中小企业也不能错过

文|白 鸽 编|周效敬 这些场景,对你来说或许并不陌生: 在医院的大屏上,一个医生模样的数字人在做医疗知识科普;在抖音的直播间里,一个真人模样的数字人在线上直播带货,24小时无休无…

音频剪辑技巧:音频降噪在线怎么降噪?分享7种录音去除杂音方法

相信很多小伙伴们都有这种苦恼:在编辑音频时,你可能发现即使你使用了价格昂贵的隔音麦克风,在录音中仍然存在呼吸声和咳嗽声。因此,如果要传达清晰干净的声音以表达你的信息,你该如何从录音去除杂音呢?别心…

基于STM32的智能水质监测系统

目录 引言环境准备智能水质监测系统基础代码实现:实现智能水质监测系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统实现4.4 用户界面与数据可视化应用场景:水质管理与优化问题解决方案与优化收尾与总结 1. 引言 智能水质监测系统通过使用STM32嵌…

可转债交易的规则,权限开通条件。可转债的佣金最低标准万0.44!

可转债交易规则 【1】可转债最小交易单位为1手,1手10张,每张的价格就是大家看到的价格。这和股票很不一样,股票的1手是100股股票。可转债最小价格变动单位为0.001 【2】可转债是T0交易,即当天买入,当天就可以卖出。这…

[每周尝鲜]用GPTs排名全球Top1的 GitHub 代码仓库分析神器AI Code Analyzer解读每周热门项目

前言: GitHub 代码仓库分析神器AI Code Analyzer自1月12日在GPTs 上线以来,凭借其强大的功能和卓越的用户体验,取得了令人瞩目的成绩。收获了诸多好评,目前在同类插件中全球排行第一,已有1000用户正在使用。并且已入选…

MATLAB2024a下的BP神经网络分类工具箱预测

1 打开BP神经网络分类工具箱GUI界面 图1-1 如图1-1所示,虽然叫神经网络模式识别但确实是BP神经网络分类工具箱,如果想要使用其他神经网络模型,可以打开左边的深度网络网络设计器,如图1-2、图1-3所示: 图1-2 图1-3 2 导…

Linux0.12内核源码解读(5)-head.s

大家好,我是呼噜噜,好久没有更新old linux了,本文接着上一篇文章图解CPU的实模式与保护模式,继续向着操作系统内核的世界前进,一起来看看heads.s as86 与GNU as 首先我们得了解一个事实,在Linux0.12内核源…

怎么优化亚马逊Listing?看这一篇就够了!

运营亚马逊最重要的工作之一就是优化listing,精心优化好亚马逊标题、五点描述、图片和关键词才能提高产品的可见性和吸引力,很多小伙伴对于怎么写出专业的亚马逊listing还是不知道如何下手,今天为大家分享一套实用的亚马逊listing优化指南&am…

软考系统架构师系统工程与信息系统基础考点

软考系统架构师系统工程与信息系统基础考点 系统工程 定义:一种组织管理技术,一种现代的科学决策方法 目的:以最好的方式实现系统 目标:整体最优 意义:利用计算机为工具,对系统的结构、元素、信息和反馈…

2024车载测试还可以冲吗?

2024年已过接近1/4了,你是不是还在围观车载测试行业的发展?同时也在思考着:现在进入车载测试行业还来得及吗?如何高效学习车载测试呢? 我们先来了解一下车载测试行情发展,通过某大平台,我们获取…

使用Ghostscript将PostScript(.ps)文件转换为PDF文件格式

如何使用Ghostscript将PostScript文件转换为PDF文件格式: /* Example of using GS DLL as a ps2pdf converter. */#if defined(_WIN32) && !defined(_Windows) # define _Windows #endif #ifdef _Windows /* add this source to a project with gsdll32.dll, or comp…

学习笔记——动态路由——OSPF(报头信息、报文信息、三张表)

六、OSPF协议的报头信息、报文信息、三张表 OSPF的协议报文在一个广播域内进行传递,是直接封装在IP报文中的,协议号为89。 OSPF本身5种类型:分别是Hello报文、DD报文、LSR报文、LSU报文、LSAck报文,各种不同类型的LSA其实只是包含…

深度解析观测云智能监控的核心设计原理

背景 在监控高度分布式的应用程序时,可能依赖于多个基于云的和本地环境中的数百个服务和基础设施组件,在识别错误、检测高延迟的原因和确定问题的根因都是比较有挑战性的。即使已经具备了强大的监控和警报系统,但是基础设施和应用程序也可能…

求出某空间曲面下的体积

求出某空间曲面下的体积 flyfish 用小长方体的体积和来逼近该体积 import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as animation# 定义函数 f(x, y) def f(x, y):return np.sin(np.pi * x) * np.sin(np.pi * y)# 创建网格 x np.linspac…

HMI 的 UI 风格,精妙无比

HMI 的 UI 风格,精妙无比

使用vue + canvas绘制仪表盘

使用vue canvas绘制仪表盘 效果图&#xff1a; 父容器 <template><div class"panelBoard-page"><h1>panelBoard</h1><Demo1 :rate"rate" /></div> </template> <script setup> import { ref } from …

2024最新总结:1500页金三银四面试宝典 记录35轮大厂面试(都是面试重点)

学习是你这个职业一辈子的事 手里有个 1 2 3&#xff0c;不要想着去怼别人的 4 5 6&#xff0c;因为还有你不知道的 7 8 9。保持空瓶心态从 0 开始才能学到 10 全。 毕竟也是跳槽高峰期&#xff0c;我还是为大家准备了这份1500页金三银四宝典&#xff0c;记录的都是真实大厂面…

表格截图怎么转换成表格?6个软件帮助你快速进行表格转换

表格截图怎么转换成表格&#xff1f;6个软件帮助你快速进行表格转换 将表格截图转换为可编辑的表格文件是处理数据时常见的需求&#xff0c;特别是在需要分析或编辑图像中包含的信息时。以下是几款帮助你快速进行表格转换的软件和工具&#xff0c;它们提供了不同的功能和适用场…

LearnOpenGL - Android OpenGL ES 3.0 使用 FBO 进行离屏渲染

系列文章目录 LearnOpenGL 笔记 - 入门 01 OpenGLLearnOpenGL 笔记 - 入门 02 创建窗口LearnOpenGL 笔记 - 入门 03 你好&#xff0c;窗口LearnOpenGL 笔记 - 入门 04 你好&#xff0c;三角形OpenGL - 如何理解 VAO 与 VBO 之间的关系LearnOpenGL - Android OpenGL ES 3.0 绘制…

【Linux】对共享库加载问题的深入理解——基本原理概述

原理概述 【linux】详解——库-CSDN博客 共享库被加载后&#xff0c;系统会为该共享库创建一个结构&#xff0c;这个结构体中的字段描述了库的各种属性。在内存中可能会加载很多库&#xff0c;每一个库都用一个结构体描述。把这些结构体用一些数据结构管理起来&#xff0c;系…