Zephyr学习之mcuboot的最简单使用记录
前言本篇记录我第一次使用mcuboot的记录。这里只是快速的使用起来很多细节还没有理解到位请酌情参考。本次使用到的工具为Clion,结合AI工具来帮助理解。本次使用的开发板为正点原子探索者主控STM32F407ZGT6,其他的也支持。本次使用的烧录器为Jlink。使用Clion打开Zephyr的项目工程找到mcuboot提供的zephyr项目工程加载项目工程选择我们需要的开发板我这里选择的是官方提供的如果没有的话需要自己去适配在boards目录下添加我们自己开发板的信息这里可以参考已有的文件进行编写。stm32f4_disco.overlay的编写/{chosen{zephyr,consoleusart1;zephyr,shellusart1;zephyr,code-partitionboot_partition;};aliases{usart1usart1;};};usart1{pinctrl-0usart1_tx_pa9usart1_rx_pa10;pinctrl-namesdefault;current-speed115200;statusokay;};// 扇区分布 //Sector0:16KB(0x0800_0000 - 0x0800_3FFF)← 最小擦除单位 //Sector1:16KB(0x0800_4000 - 0x0800_7FFF)//Sector2:16KB(0x0800_8000 - 0x0800_BFFF)//Sector3:16KB(0x0800_C000 - 0x0800_FFFF)//Sector4:64KB(0x0801_0000 - 0x0801_FFFF)//Sector5:128KB(0x0802_0000 - 0x0803_FFFF)← Slot0起始 //Sector6:128KB(0x0804_0000 - 0x0805_FFFF)← Slot1起始 //Sector7:128KB(0x0806_0000 - 0x0807_FFFF)← Scratch 起始flash0{statusokay;partitions{compatiblefixed-partitions;#address-cells 1;#size-cells 1;boot_partition: partition0{labelmcuboot;reg0x00000000 DT_SIZE_K(128);read-only;};slot0_partition: partition20000{labelimage-0;reg0x00020000 DT_SIZE_K(128);};slot1_partition: partition40000{labelimage-1;reg0x00040000 DT_SIZE_K(128);};scratch_partition: partition60000{labelimage-scratch;reg0x00060000 DT_SIZE_K(128);};};};stm32f4_disco.conf的编写# 禁用自动计算手动设置最大镜像扇区数根据你的分区大小调整CONFIG_BOOT_MAX_IMG_SECTORS_AUTOnCONFIG_BOOT_MAX_IMG_SECTORS16bootloader工程进行编译注意:如果你的配置文件不生效的话需要通过清除缓存重新编译来解决此问题观察日志输出bootloader工程进行烧录注意我这里使用的jlink烧录需要在烧录时配置一下参数烧录结果控制台输出创建app固件程序打开自己创建的工程或使用示例工程编写对应的配置prj.conf文件编写# nothing hereCONFIG_LOGy# CONFIG_USE_SEGGER_RTTy# CONFIG_SHELLy# CONFIG_SHELL_BACKEND_RTTy# 串口配置CONFIG_SERIALyCONFIG_UART_INTERRUPT_DRIVENy# 开启FLASHCONFIG_SPIyCONFIG_FLASHyCONFIG_FLASH_LOG_LEVEL_INFy# Enable Zephyr application to be booted by MCUbootCONFIG_BOOTLOADER_MCUBOOTy# Use the default MCUBoot PEM key file (BOOT_SIGNATURE_KEY_FILE)CONFIG_MCUBOOT_SIGNATURE_KEY_FILEbootloader/mcuboot/root-rsa-2048.pem设备树覆盖文件编写注意:flash0里面的分区要和bootloader里面的保持一致/{chosen{zephyr,consoleusart1;zephyr,shellusart1;zephyr,code-partitionslot0_partition;};aliases{usart1usart1;w25q128w25q128;};};usart1{pinctrl-0usart1_tx_pa9usart1_rx_pa10;pinctrl-namesdefault;current-speed115200;statusokay;};spi1{statusokay;// clk、mosi、miso pinctrl-0spi1_sck_pb3spi1_miso_pb4spi1_mosi_pb5;pinctrl-namesdefault;cs-gpiosgpiob14GPIO_ACTIVE_LOW;w25q128: w25q1280{compatiblejedec,spi-nor;sizeDT_SIZE_M(128);/*128Mbits */ reg0;spi-max-frequency4000000;statusokay;jedec-id[ef4018];};};flash0{statusokay;partitions{compatiblefixed-partitions;#address-cells 1;#size-cells 1;boot_partition: partition0{labelmcuboot;reg0x00000000 DT_SIZE_K(128);read-only;};slot0_partition: partition20000{labelimage-0;reg0x00020000 DT_SIZE_K(128);};slot1_partition: partition40000{labelimage-1;reg0x00040000 DT_SIZE_K(128);};scratch_partition: partition60000{labelimage-scratch;reg0x00060000 DT_SIZE_K(128);};};};编写测试main函数/* * Copyright (c) 2025 Embeint Inc * * SPDX-License-Identifier: Apache-2.0 */#includezephyr/kernel.h#includezephyr/device.h#includezephyr/net_buf.h#includezephyr/logging/log.h#includezephyr/drivers/flash.h#includestdio.h#includestring.h// SPI测试LOG_MODULE_REGISTER(test,LOG_LEVEL_DBG);#defineSPI_FLASH_TEST_REGION_OFFSET0xff000#defineSPI_FLASH_SECTOR_SIZE4096constuint8_terased[]{0xff,0xff,0xff,0xff};voidsingle_sector_test(conststructdevice*flash_dev){constuint8_texpected[]{0x55,0xaa,0x66,0x99};constsize_tlensizeof(expected);uint8_tbuf[sizeof(expected)];intrc;LOG_DBG(\nPerform test on single sector);/* Write protection needs to be disabled before each write or * erase, since the flash component turns on write protection * automatically after completion of write and erase * operations. */LOG_DBG(\nTest 1: Flash erase\n);/* Full flash erase if SPI_FLASH_TEST_REGION_OFFSET 0 and * SPI_FLASH_SECTOR_SIZE flash size */rcflash_erase(flash_dev,SPI_FLASH_TEST_REGION_OFFSET,SPI_FLASH_SECTOR_SIZE);if(rc!0){LOG_DBG(Flash erase failed! %d\n,rc);}else{/* Check erased pattern */memset(buf,0,len);rcflash_read(flash_dev,SPI_FLASH_TEST_REGION_OFFSET,buf,len);if(rc!0){LOG_DBG(Flash read failed! %d\n,rc);return;}if(memcmp(erased,buf,len)!0){LOG_DBG(Flash erase failed at offset 0x%x got 0x%x\n,SPI_FLASH_TEST_REGION_OFFSET,*(uint32_t*)buf);return;}LOG_DBG(Flash erase succeeded!\n);}LOG_DBG(\nTest 2: Flash write\n);LOG_DBG(Attempting to write %zu bytes\n,len);rcflash_write(flash_dev,SPI_FLASH_TEST_REGION_OFFSET,expected,len);if(rc!0){LOG_DBG(Flash write failed! %d\n,rc);return;}memset(buf,0,len);rcflash_read(flash_dev,SPI_FLASH_TEST_REGION_OFFSET,buf,len);if(rc!0){LOG_DBG(Flash read failed! %d\n,rc);return;}if(memcmp(expected,buf,len)0){LOG_DBG(Data read matches data written. Good!!\n);}else{constuint8_t*wpexpected;constuint8_t*rpbuf;constuint8_t*rperplen;LOG_DBG(Data read does not match data written!!\n);while(rprpe){LOG_DBG(%08x wrote %02x read %02x %s\n,(uint32_t)(SPI_FLASH_TEST_REGION_OFFSET(rp-buf)),*wp,*rp,(*rp*wp)?match:MISMATCH);rp;wp;}}}intmain(void){conststructdevice*flash_devDEVICE_DT_GET(DT_ALIAS(w25q128));if(!device_is_ready(flash_dev)){LOG_ERR(%s: device not ready.\n,flash_dev-name);return0;}LOG_DBG(\n%s SPI flash testing\n,flash_dev-name);LOG_DBG(\n);while(1){LOG_DBG(Testing123...\n);k_sleep(K_MSEC(5000));}//single_sector_test(flash_dev);return0;}编译并烧录(这里通过编译出来的固件就可以直接烧录)控制台运行情况总结mcuboot的使用和集成借助ide工具还是非常的方便。第一次接触mcuboot的时候在网上查找的东西不能很直观的让人快速的使用起来。这里提供一个参考思路。个人观点先跑起来然后慢慢去理解其中的细节。

相关新闻

SpringAI学习笔记(一)SpringAI入门案例

SpringAI学习笔记(一)SpringAI入门案例

文章目录SpringAI学习笔记一、SpringAI入门案例(调用本地ollama部署的大模型)1.1 环境准备1.2 代码案例SpringAI学习笔记 一、SpringAI入门案例(调用本地ollama部署的大模型) 1.1 环境准备 需要下载ollama,并且拉取…

2026/5/17 6:37:11 阅读更多 →
从此告别拖延!备受追捧的降AIGC平台 —— 千笔·降AIGC助手

从此告别拖延!备受追捧的降AIGC平台 —— 千笔·降AIGC助手

在AI技术席卷学术写作的今天,越来越多的学生、研究人员和职场人士选择借助AI辅助完成论文、报告和学术材料。然而,随之而来的“AI率超标”问题却成为横亘在学术道路上的隐形障碍——知网、维普、万方等主流查重系统纷纷升级算法,严打AI生成内…

2026/5/17 9:27:22 阅读更多 →
2026软著软件名称怎么起?最新命名规则与降低重名风险实操

2026软著软件名称怎么起?最新命名规则与降低重名风险实操

导语 进入2026年,随着数字资产确权意识的普及,中国版权保护中心收到的软件著作权登记申请量持续攀升。在初审环节,因“软件名称不规范”而被下发补正通知的比例并未下降,反而因为审查标准的细化而有所上升。许多开发者和中小企业…

2026/5/17 9:27:22 阅读更多 →

最新新闻

hexo-tag-aplayer从入门到精通:构建博客音乐系统的完整路线图

hexo-tag-aplayer从入门到精通:构建博客音乐系统的完整路线图

hexo-tag-aplayer从入门到精通:构建博客音乐系统的完整路线图 【免费下载链接】hexo-tag-aplayer Embed aplayer in Hexo posts/pages 项目地址: https://gitcode.com/gh_mirrors/he/hexo-tag-aplayer hexo-tag-aplayer是一款强大的Hexo标签插件,…

2026/7/5 18:35:29 阅读更多 →
网盘直链下载助手完整指南:一键获取八大网盘真实下载地址的终极解决方案

网盘直链下载助手完整指南:一键获取八大网盘真实下载地址的终极解决方案

网盘直链下载助手完整指南:一键获取八大网盘真实下载地址的终极解决方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中…

2026/7/5 18:33:28 阅读更多 →
如何扩展Runno:添加自定义编程语言运行时的完整指南

如何扩展Runno:添加自定义编程语言运行时的完整指南

如何扩展Runno:添加自定义编程语言运行时的完整指南 【免费下载链接】runno Sandboxed runtime for programming languages and WASI binaries. Works in the browser, on your server, or via MCP. 项目地址: https://gitcode.com/gh_mirrors/ru/runno Runn…

2026/7/5 18:33:28 阅读更多 →
对字符串排序的影响

对字符串排序的影响

字符串的大小比较并不是如C那样按照字符串字符内码大小顺序从头到尾来比较的。由于我是从C/C转过来的,我一直以来都以为.net 下字符串的比较规则和C是一样的,直到有一天我的程序在英文操作系统下出错。 .net 下,字符串的排序受 System.Threa…

2026/7/5 18:29:28 阅读更多 →
Runno高级调试技巧:解决复杂代码执行问题的完整方法

Runno高级调试技巧:解决复杂代码执行问题的完整方法

Runno高级调试技巧:解决复杂代码执行问题的完整方法 【免费下载链接】runno Sandboxed runtime for programming languages and WASI binaries. Works in the browser, on your server, or via MCP. 项目地址: https://gitcode.com/gh_mirrors/ru/runno Runn…

2026/7/5 18:29:28 阅读更多 →
Instatic集群部署:负载均衡与会话共享配置指南

Instatic集群部署:负载均衡与会话共享配置指南

Instatic集群部署:负载均衡与会话共享配置指南 【免费下载链接】Instatic Instatic is a modern self-hosted visual CMS - get it running in 1 minute 项目地址: https://gitcode.com/GitHub_Trending/in/Instatic Instatic作为一款现代自托管视觉CMS&…

2026/7/5 18:25:26 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻