Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
FAL
ota在线升级
通用bootloader
使用官方BOOT升级,看这一篇就够了?(以STM32F407VGT6为例)
发布于 2025-04-15 22:00:08 浏览:784
订阅该版
[tocm] ## 前言 | ❗ | ❗ | ❗ | ❗ | | ---- | ------------------------ | -------- | ---------------------------------------------------------- | | 环境 | | | | | | win10 | | | | 软件 | | | | | | RT-Thread Studio | 2.2.9 | | | | RT-Thread | 5.1.0 | | | | Xshell | Xshell 7 | 用于传输升级固件,即使用串口升级 | | | Tabby | 1.0.211 | 串口助手,可以选择xcom、sscom等,效果一样 | | | STM32CubeProgrammer | 2.17.0 | 用于烧录程序,也可选择其他软件,或是使用RTT-Studio直接烧录 | | | RT-Thread OTA 固件打包器 | 1.0.7 | 用于打包升级固件 | | 硬件 | | | | | | STM32F407VGT6 | | | | | ST-Link | | | ## 参考文章 > [博客最细 STM32CubeProgrammer 使用教程(学不会来找我)-CSDN博客](https://blog.csdn.net/weixin_62292999/article/details/140446389) > > [RT-Thread STM32F4通用BootLoader 的制作和使用(串口YModem协议升级方式)_使用rt-threadstudio移植rt-thread & 制作stm32通用bootloader-CSDN博客](https://blog.csdn.net/weixin_44746581/article/details/106051414) ## BOOT ### 第一步:获取Boot固件 > [iot_admin](https://iot.rt-thread.com/#/login) > > 到RTT设备维护云平台创建设备,使用官方Boot固件。     按照上面的步骤填写相关信息,加密压缩根据需求选择,最后输入自己的邮箱(必填项),`点击生成Bootloder`就可以得到Boot固件了。 ### 第二步:烧录Boot固件  将下载的固件解压,并下载到单片机中。   烧录后,串口打印信息如上。 至此,你已完成Boot固件。 ## APP ### 第一步:建立基本工程   创建完成后,直接编译,报错!!!  找到上图位置,修改`RT_WEAK`为`rt_weak`,再次编译,无错误。 ### 第二步:修改`drv_clk.c`  ```c void system_clock_config(int target_freq_mhz) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** Configure the main internal regulator output voltage */ __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; RCC_OscInitStruct.PLL.PLLM = 8; RCC_OscInitStruct.PLL.PLLN = 168; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = 4; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** Initializes the CPU, AHB and APB buses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { Error_Handler(); } } ``` ### 第三步:打开`FAL`  编译报错   打开`board.h`文件的`BSP_USING_ON_CHIP_FLASH`定义。  检查一下`stm32f4xx_hal_conf.h` 中`HAL_FLASH_MODULE_ENABLED`是否打开。  注意`app`和`download`必须和`Boot`固件设置一样。 新建一个`fal_cfg.h`文件,再次编译无错误。 **一定要注意,芯片不同,`fal_cfg.h`文件也不同,`flash`块也不同。都需要根据实际情况进行修改,难度不大。** ```c #ifndef _FAL_CFG_H_ #define _FAL_CFG_H_ #include
#include
#define FLASH_SIZE_GRANULARITY_16K (4 * 16 * 1024) #define FLASH_SIZE_GRANULARITY_64K (1 * 64 * 1024) #define FLASH_SIZE_GRANULARITY_128K (7 * 128 * 1024) #define STM32_FLASH_START_ADRESS_16K STM32_FLASH_START_ADRESS #define STM32_FLASH_START_ADRESS_64K (STM32_FLASH_START_ADRESS_16K + FLASH_SIZE_GRANULARITY_16K) #define STM32_FLASH_START_ADRESS_128K (STM32_FLASH_START_ADRESS_64K + FLASH_SIZE_GRANULARITY_64K) /* ===================== Flash device Configuration ========================= */ extern const struct fal_flash_dev stm32_onchip_flash_16k; extern const struct fal_flash_dev stm32_onchip_flash_64k; extern const struct fal_flash_dev stm32_onchip_flash_128k; /* flash device table */ #define FAL_FLASH_DEV_TABLE \ { \ &stm32_onchip_flash_16k, \ &stm32_onchip_flash_64k, \ &stm32_onchip_flash_128k, \ } #define FAL_PART_TABLE \ { \ {FAL_PART_MAGIC_WROD, "app", "onchip_flash_128k", 0 * 128 * 1024, 1 * 128 * 1024, 0}, \ {FAL_PART_MAGIC_WROD, "download", "onchip_flash_128k", 1 * 128 * 1024, 1 * 128 * 1024, 0}, \ {FAL_PART_MAGIC_WROD, "parameter", "onchip_flash_128k", 2 * 128 * 1024, 2 * 128 * 1024, 0}, \ } #endif /* _FAL_CFG_H_ */ ``` ### 第四步:修改`main.c`  ```c #include
#define DBG_TAG "main" #define DBG_LVL DBG_LOG #include
#include "fal.h" #define APP_VERSION "1.0.0" int main(void) { int count = 1; fal_init(); LOG_D("APP Version: %s build %s\r\n\r\n", APP_VERSION, __DATE__); while (count++) { LOG_D("Hello RT-Thread!"); rt_thread_mdelay(10000); } return RT_EOK; } ``` ### 第五步:修改`link.lds`  `ROM`起始地址与第一步Boot固件设置相同  ### 第六步:修改`VECT_TAB_OFFSET`  ### 第七步:将编译生成的`app`的`bin`文件烧录,注意烧录地址。  ### 结果 完成上面的步骤,`boot`已经可以正常跳转到`app`,运行正常。  ## 尝试升级 ### 第一步:添加`ota_downloader`软件包并打开`YModem`   可以先把`LOG_D("Hello RT-Thread!");`注释掉,影响后面输入指令,编译无误,再次将编译生成的`app`的`bin`文件烧录,注意烧录地址。  ### 第二步:修改`main.c` 修改一下版本号,方便升级对照。 ```c #include
#define DBG_TAG "main" #define DBG_LVL DBG_LOG #include
#include "fal.h" #define APP_VERSION "1.0.1" int main(void) { int count = 1; fal_init(); LOG_D("APP Version: %s build %s\r\n\r\n", APP_VERSION, __DATE__); while (count++) { // LOG_D("Hello RT-Thread!"); rt_thread_mdelay(10000); } return RT_EOK; } ``` ### 第三步:生成固件升级包 选择刚才修改版本号并编译生成的新的`bin`文件,进行固件打包,得到`.rbl`文件   ### 第四步:开始升级 使用`Xshell`,可以通过`YModem`发送文件。  输入命令`ymodem_ota`      版本号已经更新,升级成功。 ## 可能出现的问题 1. ST-Link烧录失败 1. 尝试降低下载速率。 2. 其他Link下载问题,可以根据报错信息自行搜索。 2. `boot`跳转`app`失败 1. 检查`boot`固件配置与`app`中的`fal_cfg.h`配置是否一致。 2. 检查`VECT_TAB_OFFSET`是否修改。 3. 其他问题,可以评论交流。 3. xxx
5
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
Jack_____
纸上得来终觉浅,绝知此事要躬行。
文章
1
回答
33
被采纳
6
关注TA
发私信
相关文章
1
关于FAL移植
2
添加fal软件包之后编译出现错误,求助!
3
关于easyflash4.0的写入和读取norflash一些疑惑咨询
4
FAL驱动移植&构建脚本问题
5
帮我看一下这样分区会不会冲突??
6
EasyFlash 4.0疑似出BUG
7
疑似FAL日志输出与DFS冲突??
8
fal软件包偏移量大于等于当前分区的大小会报错
9
为什么片内Flash总是写失败?
10
片上flash的文件系统的建立
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
FAL
RTC
rt-smart
I2C_IIC
cubemx
UART
ESP8266
WIZnet_W5500
BSP
ota在线升级
PWM
flash
packages_软件包
freemodbus
潘多拉开发板_Pandora
ADC
GD32
定时器
编译报错
flashDB
keil_MDK
socket
中断
rt_mq_消息队列_msg_queue
Debug
ulog
SFUD
msh
C++_cpp
at_device
本月问答贡献
出出啊
1524
个答案
343
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
818
个答案
179
次被采纳
crystal266
555
个答案
162
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
1
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
2
次点赞
crystal266
2
篇文章
1
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部