STM32F407写BootLoader程序注意要点

/**文末附有调试成功的程序链接**/

1.如果使用外部时钟,要用25M(使用8MBootLoader程序无法正常跳转至APP,原因不清楚

 BootLoader.c(函数内不要随便添加printf调试,会出错

#include "bootloaer.h"

void jump_to_app(uint32_t app_addr)
{ 
    
    pFunction jump_to_application;
    uint32_t jump_address;
    
    /* Check if valid stack address (RAM address) then jump to user application */
    if (((*(__IO uint32_t*)app_addr) & 0x2FFE0000 ) == 0x20000000)
    {
      /* Jump to user application */
      jump_address = *(__IO uint32_t*) (app_addr + 4);
      jump_to_application = (pFunction) jump_address;
      /* Initialize user application's Stack Pointer */
      __set_MSP(*(__IO uint32_t*) jump_address);
      jump_to_application();
    }    
    
}

 BootLoader.h

#ifndef __BOOTLOADER_H_
#define __BOOTLOADER_H_

#include "main.h"
#include "stm32f4xx.h"

typedef  void (*pFunction)(void);

/*!
* @brief 跳转到应用程序段
*        执行条件:无
* @param[in1] : 用户代码起始地址.
*
* @retval: 无
*/


#define FLASH_JUMP_ADDR							(0x08008000)


void jump_to_app(uint32_t app_addr);




#endif

 主函数添加跳转程序:

  /* USER CODE BEGIN WHILE */
    while (1)
    {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
        HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
        HAL_Delay(500);
				printf("BOOTLOADER灯反转中!!\r\n");
        count++;

        if(count == 10)
        {		
						printf("程序正在跳转APPZ中!!\r\n");
            if(((FLASH_JUMP_ADDR+4)&0xFF000000)==0x08000000) //Judge if start at 0X08XXXXXX.
            {
                jump_to_app(FLASH_JUMP_ADDR); // Jump to  APP
            }

        }
    }

2.APP程序main()之后添加SCB->VTOR = 0x08008000;//该地址为APP的起始地址,地址不一样该值不一样

int main(void)
{
  /* USER CODE BEGIN 1 */
	SCB->VTOR = 0x08008000;
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

3.flash的分配,参照mcu的flash分配空间

 例如:BootLoader的分配:第0个扇区占用16个字节

 例如:APP的分配:第2个扇区占用16个字节 

修改了配置后最好全编译一下 

附上本人调试的示例程序,点击下载,注:该程序只是实现了bootloader跳转至app的基本操作。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值