STM32F407 cubeIDE Bootloader APP 如何写

devtools/2025/3/14 9:13:39/

一、bootloader

代码如下:

#define FLASH_JUMP_ADDR		(0x0800c000)
/* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);return ch;
}typedef void (*p_APP)(void);/** 功能:运行应用程程序* 输入:app_address:应用程序起始地址* 输出:* 备注:*/
void StartApplication(uint32_t app_address)
{p_APP application;uint32_t jump_address;
//判断栈顶指针的合法性if (((*(__IO uint32_t*)app_address) & 0x2F000000 ) == 0x20000000){jump_address = *(__IO uint32_t*) (app_address + 4);application = (p_APP) jump_address;__set_MSP(*(__IO uint32_t*) app_address);application();}else{printf("app_address illegal\r\n");}
}
/* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* 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_USART1_UART_Init();MX_TIM2_Init();/* USER CODE BEGIN 2 */
//  HAL_Delay(1000);for(int i=0; i<10; i++){printf("---delay----\r\n");HAL_Delay(400);HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);}//怎加一个区域添加标志位,比较好。1代表用APP1,2代表app2,其他代表无APPif(((FLASH_JUMP_ADDR+4)&0xFF000000)==0x08000000) //Judge if start at 0X08XXXXXX.{printf("---jump--\r\n");StartApplication(FLASH_JUMP_ADDR); // Jump to  APP}elseprintf("---no jump--\r\n");/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){printf("---bootloader--\r\n");HAL_Delay(400);HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

程序的STM32F407ZETX_FLASH.ld需要修改以下,主要是flash的长度

/* Memories definition */
MEMORY
{CCMRAM    (xrw)    : ORIGIN = 0x10000000,   LENGTH = 64KRAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 128KFLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 48K
}

因为STM32F407的FLASH分区如下,所以取48K放bootloader,按照实际取大小即可。
在这里插入图片描述
栈顶指针通过WINHEX查看BIN文件是0X20020000如下:
在这里插入图片描述

二、写APP

代码如下:

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "usart.h"
#include "gpio.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */#define SYSTEM_APP_FLASH_ADDR    0x800C000
/* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);return ch;
}
/* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 */SCB->VTOR=SYSTEM_APP_FLASH_ADDR;/* USER CODE END 1 *//* 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_USART1_UART_Init();/* USER CODE BEGIN 2 *//* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */printf("---APP1--\r\n");HAL_Delay(500);HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);}/* USER CODE END 3 */
}

同时需要修改STM32F407ZETX_FLASH.ld文件

MEMORY
{CCMRAM    (xrw)    : ORIGIN = 0x10000000,   LENGTH = 64KRAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 128KFLASH    (rx)    : ORIGIN = 0x800C000,   LENGTH = 80K
}

只给APP分了80K, 后续可以分配给APP2。
运行效果如下:
在这里插入图片描述

这只是简单实现2个程序的跳转。如何升级还需标志位判断和跳转。


http://www.ppmy.cn/devtools/166979.html

相关文章

高效数据分析实战指南:Python零基础入门

高效数据分析实战指南 —— 以Python为基石&#xff0c;构建您的数据分析核心竞争力 大家好&#xff0c;我是kakaZhui&#xff0c;从事数据、人工智能算法多年&#xff0c;精通Python数据分析、挖掘以及各种深度学习算法。一直以来&#xff0c;我都发现身边有很多在传统行业从…

工作记录 2017-01-06

工作记录 2017-01-06 序号 工作 相关人员 1 协助BPO进行Billing的工作。 修改CSV、EDI837的导入。 修改邮件上的问题。 更新RD服务器。 郝 修改的问题&#xff1a; 1、 In “Full Job Summary” (patient info.), sometime, the Visit->Facility is missed, then …

RHCE(RHCSA复习:虚拟的安装和设置)

一、安装虚拟机&#xff08;见截图&#xff09; 虚拟机放大&#xff1a;ctrlshift加号 虚拟机缩小&#xff1a;ctrl减号 连接xshell的命令&#xff1a; ssh root(加上自己的ip)虚拟机关机的命令&#xff1a; systemctl poweroff 或者init 0&#xff08;该命令很古老&#xff…

LeetCode:93. 复原 IP 地址(DFS Java)

目录 93. 复原 IP 地址 题目描述&#xff1a; 实现代码与解析&#xff1a; DFS 原理思路&#xff1a; 93. 复原 IP 地址 题目描述&#xff1a; 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xf…

阿里云魔笔低代码应用开发平台快速搭建教程

AI低代码&#xff0c;大模型时代应用开发新范式 什么是魔笔 介绍什么是魔笔低代码应用开发平台。 魔笔是一款面向全端&#xff08;Web、H5、全平台小程序、App&#xff09;场景的模型驱动低代码开发平台&#xff0c;提供一站式的应用全生命周期管理&#xff0c;包括可视化开发…

Spring 事务失效的 8 种场景!

在日常工作中&#xff0c;如果对Spring的事务管理功能使用不当&#xff0c;则会造成Spring事务不生效的问题。而针对Spring事务不生效的问题&#xff0c;也是在跳槽面试中被问的比较频繁的一个问题。 点击上方卡片关注我 今天&#xff0c;我们就一起梳理下有哪些场景会导致Sp…

Flutter 常用组件大全

Flutter 常用组件大全 Flutter 提供了丰富的组件来构建 UI&#xff0c;以下是常见的组件&#xff0c;按 功能类别 分类。 1️⃣ 基础布局组件 组件作用示例Container盒子容器&#xff0c;支持装饰、边距、大小Container(width: 100, height: 100, color: Colors.red)Padding内…

MySQL 技术浅析(聚簇索引、UndoLog、RedoLog、MVCC)

MySQL 核心技术深度解析 一、聚簇索引与非聚簇索引 1. 聚簇索引结构 存储方式 InnoDB 中&#xff0c;聚簇索引的叶子节点直接存储完整数据行&#xff0c;数据按主键值物理排序存储。 主键索引即数据文件&#xff0c;非叶子节点存储主键范围和子节点指针数据行与主键索引绑定&…