STM32F429ZGT6从用户代码跳转到system memory中的bootloader代码(STM32内置的bootloader)

STM32F429ZGT6从用户代码跳转到system memory中的bootloader代码(STM32内置的bootloader)。
实际板子测试验证OK, 如果按芯片型号实现不了,来南京新港汇智科技园扇我脸。
如果有转载的,不懂的麻烦不要改动,改了记得标记好说明好型号条件啥的,别误人子弟。

再次重申MCU型号:STM32F429ZGT6

void Sys_Deinit(void)
{
    HAL_UART_DeInit(&USB_UART); ///测试把这个串口还原初始化
    HAL_UART_DeInit(&COOKER_UART);
    HAL_UART_DeInit(&SCANNER_UART);
    HAL_UART_DeInit(&RS485_UART);
}
static void JumpToBootloader (void)
{
    uint32_t i = 0;
    void (*SysMemBootJump) (void);       /* 声明一个函数指针 */
    __IO uint32_t BootAddr = 0x1FFF0000; /* STM32F4的系统BootLoader地址 */

    /* 关闭全局中断 */
    __disable_irq();  /* 禁止全局中断*/

    /* 关闭滴答定时器,复位到默认值 */
    SysTick->CTRL = 0;
    SysTick->LOAD = 0;
    SysTick->VAL = 0;

    Sys_Deinit(); ///所有外设端口还原初始化 ,不然会产生错误,无法跳转

    /* 设置所有时钟到默认状态,使用HSI时钟 */
    HAL_RCC_DeInit();

    /* 关闭所有中断,清除所有中断挂起标志 */
    for (i = 0; i < 8; i++)
    {
        NVIC->ICER[i] = 0xFFFFFFFF;
        NVIC->ICPR[i] = 0xFFFFFFFF;
    }

    /* 使能全局中断 */
    __enable_irq();    /*  使能全局中断 */
    
    /* 设置重映射到系统Flash */
    __HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH();   //(STM32F407VET6去掉此条就行)
    ///STM32F429ZGT6有双BANK,要加此条,参见手册AN2606   
    //For STM32 devices having the Dual Bank Boot feature, to jump to system memory from
    //user code the user has first to remap the System Memory bootloader at address
    //0x00000000 using SYSCFG register (except for STM32F7 Series), then jump to bootloader.
    //For STM32F7 Series, the user has to disable nDBOOT and/or nDBANK features (in option
    //bytes), then jump to bootloader.
    //    
    
    /* 跳转到系统BootLoader,首地址是MSP,地址+4是复位中断服务程序地址 */
    SysMemBootJump = (void (*) (void) ) (* ( (uint32_t *) (BootAddr + 4) ) );

    /* 设置主堆栈指针 */
    __set_MSP (* (uint32_t *) BootAddr);

    /* 在RTOS工程,这条语句很重要,设置为特权级模式,使用MSP指针 */
    __set_CONTROL (0);

    /* 跳转到系统BootLoader */
    SysMemBootJump();

    /* 跳转成功的话,不会执行到这里,用户可以在这里添加代码 */
    while (1)
    {

    }
}


在用户代码中调用这个函数就行,如果芯片有读取保护,记得先去掉读保护才行,不然STM32CubeProgrammer会提示RDP错误,无法读取。 


跳转到 STM32出厂自带system memory中的bootloader后,就能执行STM32自带的bootloader程序了,然后借用配套的STM32CubeProgrammer软件用UART方式连接芯片 就能进行串口烧录更新程序。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
### 回答1: STM32H723ZGT6 bootloader 程序框架的具体实现可能因为个人的开发环境和需求的不同而有所差异。但是,以下是一个通用的 bootloader 程序框架: 1. 初始化:初始化硬件,如串口、Flash 访问等。 2. 检查是否需要升级:读取一些特定的存储区域,以确定是否需要升级。 3. 如果需要升级:从串口或其他通信接口接收升级数据,并存储在 Flash 。 4. 验证数据:验证接收到的升级数据是否完整和正确。 5. 完成升级:到新程序运行。 这是一个简单的 bootloader 程序框架,您可以根据自己的需求来添加或修改相应的功能。希望能对您有所帮助! ### 回答2: STM32H723ZGT6是意法半导体推出的一款高性能32位微控制器,其包含了内BOOTLOADER功能,可以用于程序的烧写和故障恢复。下面是一个简单的STM32H723ZGT6的BOOTLOADER程序框架: #include "stm32h7xx.h" #include "stm32h7xx_hal.h" // 定义应用程序起始地址 #define APP_START_ADDRESS 0x08020000 int main(void) { // 初始化HAL库 HAL_Init(); // 初始化系统时钟 SystemClock_Config(); // 启动外设 MX_GPIO_Init(); MX_UART_Init(); // 判断是否需要执行BOOTLOADER if (checkBootloaderTrigger()) { // 进入BOOTLOADER模式 executeBootloader(); } else { // 到应用程序 jumpToApplication(); } while (1) { // 空循环 } } // 检查是否触发BOOTLOADER的条件 bool checkBootloaderTrigger(void) { // 判断是否按下某个按键等待BOOTLOADER if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET) { return true; } else { return false; } } // 执行BOOTLOADER功能 void executeBootloader(void) { // 初始化串口通信或其他外设等 while (1) { // 等待接收命令或数据 // 根据收到的命令进行相应的处理 // 执行烧写或其他BOOTLOADER功能 // 等待下一个命令或数据 } } // 到应用程序 void jumpToApplication(void) { // 设应用程序地址 uint32_t appAddress = *(uint32_t *)APP_START_ADDRESS; // 关闭所有外设 HAL_DeInit(); // 设堆栈指针和地址 __set_MSP(*(__IO uint32_t *)APP_START_ADDRESS); jumpToApplicationAddress(appAddress); } // 到应用程序指定地址 void jumpToApplicationAddress(uint32_t address) { // 到指定地址 ((void (*)(void))(*(__IO uint32_t *)(address + 4)))(); } 上述代码STM32H723ZGT6的BOOTLOADER程序框架提供了一个简单的实现,其包括了初始化HAL库、判断是否触发BOOTLOADER的条件、执行BOOTLOADER功能、到应用程序等主要步骤。根据具体需求,你还可以进一步完善和定制这个BOOTLOADER程序框架。 ### 回答3: STM32H723ZGT6是一款高性能的ARM Cortex-M7处理器芯片。为了实现对该芯片的启动加载和固件升级功能,我们需要编写一个BOOTLOADER的程序框架。 BOOTLOADER是用于引导和加载固件程序的一种特殊程序。通常,BOOTLOADER会在芯片上电后首先运行,并负责初始化的一些基本设,如时钟配、GPIO引脚配等。接着,BOOTLOADER会检测是否存在新的固件程序需要加载,如果需要,就从外部存储设备(如闪存、SD卡等)读取固件程序,并将其加载到芯片的内存。 下面是一个简单的STM32H723ZGT6的BOOTLOADER的程序框架示例: 1. 引入必要的头文件和定义常量: #include "stm32h7xx.h" #include "hal_flash.h" // 外部闪存驱动 #include "hal_sdcard.h" // SD卡驱动 #define FIRMWARE_START_ADDR 0x08010000 // 固件存储起始地址 2. 初始化STM32H723ZGT6芯片的外围设备: void init_peripherals() { // 初始化时钟配 SystemInit(); // 初始化GPIO引脚配 // 初始化闪存控制器 // 初始化SD卡控制器 } 3. 检测是否需要升级固件: bool check_firmware_update() { // 从外部存储设备(如闪存、SD卡)读取固件版本号 // 与当前固件版本号比较 // 如果固件版本号不同,则需要升级固件,返回true // 否则返回false } 4. 加载固件程序到内存: void load_firmware() { // 从外部存储设备读取固件程序 // 将固件程序加载到内存的指定地址 memcpy((void*)FIRMWARE_START_ADDR, external_memory_address, firmware_size); } 5. 启动固件程序: void start_firmware() { // 到固件程序的入口地址 JumpToApplication(FIRMWARE_START_ADDR); } 6. 主函数入口: int main() { // 初始化外围设备 init_peripherals(); // 检测是否需要升级固件 if (check_firmware_update()) { // 加载新固件程序到内存 load_firmware(); // 启动固件程序 start_firmware(); } // 运行其他应用程序或进入休眠模式 while (1) { // 可选的其他应用处理或等待断 } } 这就是一个简单的STM32H723ZGT6的BOOTLOADER的程序框架示例。根据具体的需求和硬件配,你可以对其进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值