stm32h743iit6 iap升级固件

2024-08-23 12:44

本文主要是介绍stm32h743iit6 iap升级固件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

设置

boot运行在第一个扇区
app在第二个扇区
在这里插入图片描述

boot

关键代码

iap.c

#include "sys.h"
// #include "delay.h"
#include "usart.h"
#include "stmflash.h"
#include "iap.h"iapfun jump2app;
u32 iapbuf[512]; // 2K字节缓存
// appxaddr:应用程序的起始地址
// appbuf:应用程序CODE.
// appsize:应用程序大小(字节).
void iap_write_appbin(u32 appxaddr, u8 *appbuf, u32 appsize)
{u32 t;u16 i = 0;u32 temp;u32 fwaddr = appxaddr; // 当前写入的地址u8 *dfu = appbuf;for (t = 0; t < appsize; t += 4){temp = (u32)dfu[3] << 24;temp |= (u32)dfu[2] << 16;temp |= (u32)dfu[1] << 8;temp |= (u32)dfu[0];dfu += 4; // 偏移4个字节iapbuf[i++] = temp;if (i == 512){i = 0;STMFLASH_Write(fwaddr, iapbuf, 512);fwaddr += 2048; // 偏移2048  512*4=2048}}if (i)STMFLASH_Write(fwaddr, iapbuf, i); // 将最后的一些内容字节写进去.
}/* 开关全局中断的宏 */
#define ENABLE_INT()    __set_PRIMASK(0)    /* 使能全局中断 */
#define DISABLE_INT()    __set_PRIMASK(1)    /* 禁止全局中断 */
/*
******************************************************************************************************
*    函 数 名: JumpToBootloader
*    功能说明: 跳转到系统BootLoader
*    形    参: 无
*    返 回 值: 无    ******************************************************************************************************
*/void iap_load_app(u32 appxaddr)
{uint32_t i=0;void (*SysMemBootJump)(void);        /* 声明一个函数指针 */__IO uint32_t BootAddr = appxaddr; /* STM32H7的系统BootLoader地址 *//* 关闭全局中断 */DISABLE_INT();/* 关闭滴答定时器,复位到默认值 */SysTick->CTRL = 0;SysTick->LOAD = 0;SysTick->VAL = 0;HAL_RCC_DeInit();    //对RCC进行DeInit操作,防止APP卡死/* 设置所有时钟到默认状态,使用HSI时钟 */HAL_RCC_DeInit();/* 关闭所有中断,清除所有中断挂起标志 */for (i = 0; i < 8; i++){NVIC->ICER[i]=0xFFFFFFFF;NVIC->ICPR[i]=0xFFFFFFFF;}/* 使能全局中断 */ENABLE_INT();/* 跳转到系统BootLoader,首地址是MSP,地址+4是复位中断服务程序地址 */SysMemBootJump = (void (*)(void)) (*((uint32_t *) (BootAddr + 4)));/* 设置主堆栈指针 */__set_MSP(*(uint32_t *)BootAddr);/* 在RTOS工程,这条语句很重要,设置为特权级模式,使用MSP指针 */__set_CONTROL(0);/* 跳转到系统BootLoader */SysMemBootJump();/* 跳转成功的话,不会执行到这里,用户可以在这里添加代码 */while (1){}
}

iap.h

#ifndef __IAP_H__
#define __IAP_H__
#include "sys.h"  typedef  void (*iapfun)(void);				//定义一个函数类型的参数.   
#define FLASH_APP1_ADDR		0x08020000  	//第一个应用程序起始地址(存放在FLASH)//保留0X08000000~0X0801FFFF的空间为Bootloader使用(共128KB)	   
void iap_load_app(u32 appxaddr);			//跳转到APP程序执行
void iap_write_appbin(u32 appxaddr,u8 *appbuf,u32 applen);	//在指定地址开始,写入bin
#endif

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

app

main.c

int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MPU Configuration--------------------------------------------------------*/MPU_Config();/* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_TIM4_Init();MX_UART4_Init();MX_UART5_Init();MX_UART7_Init();MX_UART8_Init();MX_USART1_UART_Init();MX_USART2_UART_Init();MX_USART3_UART_Init();MX_USART6_UART_Init();MX_ADC1_Init();MX_DAC1_Init();MX_FDCAN1_Init();MX_FDCAN2_Init();MX_I2C2_Init();MX_SPI1_Init();MX_SPI2_Init();MX_TIM1_Init();MX_TIM2_Init();MX_TIM3_Init();MX_TIM5_Init();MX_TIM8_Init();MX_TIM12_Init();MX_TIM13_Init();MX_TIM14_Init();MX_TIM15_Init();MX_TIM16_Init();MX_TIM17_Init();/* USER CODE BEGIN 2 */printf("app\r\n");//__disable_irq(); //关闭中断SCB->VTOR = FLASH_BANK1_BASE |  0x00020000UL;printf("app 0x%07X\r\n",FLASH_BANK1_BASE |  0x00020000UL);__enable_irq();//启用中断//0x8020000//VECT_TAB_OFFSET/* USER CODE END 2 *//* Init scheduler */osKernelInitialize();/* Call init function for freertos objects (in cmsis_os2.c) */MX_FREERTOS_Init();/* Start scheduler */osKernelStart();/* We should never get here as control is now taken by the scheduler *//* Infinite loop *//* USER CODE BEGIN WHILE *///SCB->VTOR = 0x08020000;;//while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

主要是这2行

	//设置中断向量表SCB->VTOR = FLASH_BANK1_BASE |  0x00020000UL;printf("app 0x%07X\r\n",FLASH_BANK1_BASE |  0x00020000UL);__enable_irq();//启用中断

其他

输出 bin 固件
在这里插入图片描述

$K\ARM\ARMCC\bin\fromelf.exe --bin --output=@L.bin !L

这篇关于stm32h743iit6 iap升级固件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1099421

相关文章

怎么关闭Ubuntu无人值守升级? Ubuntu禁止自动更新的技巧

《怎么关闭Ubuntu无人值守升级?Ubuntu禁止自动更新的技巧》UbuntuLinux系统禁止自动更新的时候,提示“无人值守升级在关机期间,请不要关闭计算机进程”,该怎么解决这个问题?详细请看... 本教程教你如何处理无人值守的升级,即 Ubuntu linux 的自动系统更新。来源:https://

四种简单方法 轻松进入电脑主板 BIOS 或 UEFI 固件设置

《四种简单方法轻松进入电脑主板BIOS或UEFI固件设置》设置BIOS/UEFI是计算机维护和管理中的一项重要任务,它允许用户配置计算机的启动选项、硬件设置和其他关键参数,该怎么进入呢?下面... 随着计算机技术的发展,大多数主流 PC 和笔记本已经从传统 BIOS 转向了 UEFI 固件。很多时候,我们也

你的华为手机升级了吗? 鸿蒙NEXT多连推5.0.123版本变化颇多

《你的华为手机升级了吗?鸿蒙NEXT多连推5.0.123版本变化颇多》现在的手机系统更新可不仅仅是修修补补那么简单了,华为手机的鸿蒙系统最近可是动作频频,给用户们带来了不少惊喜... 为了让用户的使用体验变得很好,华为手机不仅发布了一系列给力的新机,还在操作系统方面进行了疯狂的发力。尤其是近期,不仅鸿蒙O

macOS升级后SVN升级

问题 svn: error: The subversion command line tools are no longer provided by Xcode. 解决 sudo chown -R $(whoami) /usr/local/Cellar brew install svn

STM32内部闪存FLASH(内部ROM)、IAP

1 FLASH简介  1 利用程序存储器的剩余空间来保存掉电不丢失的用户数据 2 通过在程序中编程(IAP)实现程序的自我更新 (OTA) 3在线编程(ICP把整个程序都更新掉) 1 系统的Bootloader写死了,只能用串口下载到指定的位置,启动方式也不方便需要配置BOOT引脚触发启动  4 IAP(自己写的Bootloader,实现程序升级) 1 比如蓝牙转串口,

Golang支持平滑升级的HTTP服务

前段时间用Golang在做一个HTTP的接口,因编译型语言的特性,修改了代码需要重新编译可执行文件,关闭正在运行的老程序,并启动新程序。对于访问量较大的面向用户的产品,关闭、重启的过程中势必会出现无法访问的情况,从而影响用户体验。 使用Golang的系统包开发HTTP服务,是无法支持平滑升级(优雅重启)的,本文将探讨如何解决该问题。 一、平滑升级(优雅重启)的一般思路 一般情况下,要实现平滑

JeecgBoot 升级springboot版本到2.6.0

1. 环境描述 Jeecgboot 3.0,他所依赖的springboot版本为2.3.5Release,将springboot版本升级为2.6.0。过程全纪录,从2开始描述。 2. 修改springboot版本号 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-pare

ROS1 + Realsense d455 固件安装+读取rostopic数据

目录 安装固件(一定要匹配)ROS1 wrapper 安装方法Realsense SDK 安装方法Realsense Firmware 安装方法 修改roslaunch配置文件,打开双目图像和IMU数据其他坑点参考链接 安装固件(一定要匹配) 如果你是使用ROS1获取realsense数据的话,一定要注意,SDK, Firmware的版本不是越新越好!!,这是因为intel已经不

欧拉系统 kernel 升级、降级

系统版本  cat  /etc/os-release  NAME="openEuler"VERSION="22.03 (LTS-SP1)"ID="openEuler"VERSION_ID="22.03"PRETTY_NAME="openEuler 22.03 (LTS-SP1)"ANSI_COLOR="0;31" 系统初始 kernel 版本 5.10.0-136.12.0.

Zookeeper集群是如何升级到新版本的

方案1:复用老数据方案 这是经过实践的升级方案,该方案是复用旧版本的数据,zk集群拓扑,配置文件都不变,只是启动的程序为最新的版本。 参考文章: Zookeeper集群是如何升级到新版本的 方案2:重新建立数据方案 该方案的思路是:先停掉一台follower的机器上的服务,然后加入一个新版本的zk(zk的数据目录是空的),然后启动新zk,之后新zk会把旧集群中的数据同步过来。之后再操作另