STM32F407 cubeIDE Bootloader APP 如何写

server/2025/3/14 7:47:27/

一、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/server/174825.html

相关文章

红帆 iOffice M2 移动端密码爆破的渗透测试思路,绕过客户端实现Burpsuite批量跑,分享渗透思路,共建网络安全

一、本文概述 今天来自于领导的一个需求,需要对甲方的红帆 ioffice M2进行一次渗透测试【有授权书的】,拿到对应的APP和接口以后,我发现了进行不下去的一个关键点,他家的OA只有APP端,没有Web端,而且密码被加密了。 二、开始分析 红帆 iOffice M2,在登录的过程中,涉及…

AI预测福彩3D新模型百十个定位预测+胆码预测+杀和尾+杀和值2025年3月13日第21弹

前面由于工作原因停更了很长时间&#xff0c;停更期间很多彩友一直私信我何时恢复发布每日预测&#xff0c;目前手头上的项目已经基本收尾&#xff0c;接下来恢复发布。当然&#xff0c;也有很多朋友一直咨询3D超级助手开发的进度&#xff0c;在这里统一回复下。 由于本人既精…

Unity开发的抖音小游戏接入抖音开放平台中的流量主(抖音小游戏接入广告)

前言:作者在进行小游戏审核版本的过程中,碰到了下列问题,所以对这个抖音小游戏接入广告研究了下。 还有就是作者的TTSDK版本号是6.2.6,使用的Unity版本是Unity2022.3.29f1,最好和作者的两个版本号保持一致,因为我发现TTSDK旧版的很多函数在新版中就已经无法正常使用了,必…

数据结构-栈(详解)

目录 一、栈的基本概念二、栈的基本操作三、栈的实现方式1. 数组实现栈2. 链表实现栈 四、栈的应用场景五、总结 一、栈的基本概念 栈&#xff08;Stack&#xff09;是一种特殊的线性表&#xff0c;它只允许在表的一端进行插入和删除操作。这一端称为栈顶&#xff08;Top&…

主流向量数据库对比

在 AI 的 RAG&#xff08;检索增强生成&#xff09;研发领域&#xff0c;向量数据库是存储和查询向量嵌入的核心工具&#xff0c;用于支持高效的语义搜索和信息检索。向量嵌入是文本或其他非结构化数据的数值表示&#xff0c;RAG 系统通过这些嵌入从知识库中检索相关信息&#…

【微知】tmux中如何让某个窗口或者子窗口显示时间(ctrl + b t)

命令 让某个窗口或者子窗口显示时间 ctrl b t 退出&#xff1a;直接回车 效果

【从零开始学习计算机科学】数据库系统(二)关系数据库 与 关系代数

【从零开始学习计算机科学】数据库系统(二)关系数据库 与 关系代数 关系数据库结构化查询语言SQL数据定义语言(DDL)数据查询语言(Data Query Language, DQL)数据操纵语言(Data Manipulation Language, DML)数据控制语言(Data Control Language, DCL)关系型数据库的优…

【玩转23种Java设计模式】结构型模式篇:组合模式

软件设计模式&#xff08;Design pattern&#xff09;&#xff0c;又称设计模式&#xff0c;是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。 汇总目录链接&…