本文主要是介绍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升级固件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!