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

相关文章

Python UV安装、升级、卸载详细步骤记录

《PythonUV安装、升级、卸载详细步骤记录》:本文主要介绍PythonUV安装、升级、卸载的详细步骤,uv是Astral推出的下一代Python包与项目管理器,主打单一可执行文件、极致性能... 目录安装检查升级设置自动补全卸载UV 命令总结 官方文档详见:https://docs.astral.sh/

苹果macOS 26 Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色

《苹果macOS26Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色》在整体系统设计方面,macOS26采用了全新的玻璃质感视觉风格,应用于Dock栏、应用图标以及桌面小部件等多个界面... 科技媒体 MACRumors 昨日(6 月 13 日)发布博文,报道称在 macOS 26 Tahoe 中

华为鸿蒙HarmonyOS 5.1官宣7月开启升级! 首批支持名单公布

《华为鸿蒙HarmonyOS5.1官宣7月开启升级!首批支持名单公布》在刚刚结束的华为Pura80系列及全场景新品发布会上,除了众多新品的发布,还有一个消息也点燃了所有鸿蒙用户的期待,那就是Ha... 在今日的华为 Pura 80 系列及全场景新品发布会上,华为宣布鸿蒙 HarmonyOS 5.1 将于 7

ubuntu系统使用官方操作命令升级Dify指南

《ubuntu系统使用官方操作命令升级Dify指南》Dify支持自动化执行、日志记录和结果管理,适用于数据处理、模型训练和部署等场景,今天我们就来看看ubuntu系统中使用官方操作命令升级Dify的方... Dify 是一个基于 docker 的工作流管理工具,旨在简化机器学习和数据科学领域的多步骤工作流。

将Mybatis升级为Mybatis-Plus的详细过程

《将Mybatis升级为Mybatis-Plus的详细过程》本文详细介绍了在若依管理系统(v3.8.8)中将MyBatis升级为MyBatis-Plus的过程,旨在提升开发效率,通过本文,开发者可实现... 目录说明流程增加依赖修改配置文件注释掉MyBATisConfig里面的Bean代码生成使用IDEA生

linux环境openssl、openssh升级流程

《linux环境openssl、openssh升级流程》该文章详细介绍了在Ubuntu22.04系统上升级OpenSSL和OpenSSH的方法,首先,升级OpenSSL的步骤包括下载最新版本、安装编译... 目录一.升级openssl1.官网下载最新版openssl2.安装编译环境3.下载后解压安装4.备份

怎么关闭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