0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32C542开发(2)----BOOT_SEL设置

嵌入式单片机MCU开发 来源:嵌入式单片机MCU开发 作者:嵌入式单片机MCU开 2026-06-08 11:09 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

概述

在实际项目开发或量产维护中,除了 ST-LINK 下载方式外,很多场景还会使用 USART 串口、USB DFU、SPI 或 FDCAN 等方式进行程序升级。此时 MCU 需要先进入 ST 出厂内置的 System Memory Bootloader,才能通过这些接口完成 Flash 烧录。对于 STM32C5 系列来说,是否使用外部 BOOT0 引脚进入 Bootloader,与 Option Bytes 中的 BOOT_SEL 配置密切相关。
简单来说,BOOT_SEL 用于选择 BOOT0 信号的来源:当 BOOT_SEL 使能外部 BOOT0 引脚时,可以通过拉高 BOOT0 后复位芯片进入系统 Bootloader;当 BOOT_SEL 选择内部 Option Bit 时,则由 Option Bytes 中的 BOOT0 配置决定启动方式。因此,理解 BOOT_SEL、BOOT0 引脚和 System Memory Bootloader 之间的关系,对于后续使用串口或 USB 下载程序非常重要。

需要样片的可以加群申请:925643491 / 615061293 。

视频教学

https://www.bilibili.com/video/BV1zRVD6yEQg/

样品申请

https://www.wjx.top/vm/OhcKxJk.aspx#

源码下载

https://download.csdn.net/download/qq_24312945/92952811

硬件准备

首先需要准备一个开发板,这里我准备的是自己绘制的开发板,需要的可以进行申请。
主控为STM32C542CCT6
在这里插入图片描述

参考程序

https://github.com/CoreMaker-lab/STM32C542_SENSOR

https://gitee.com/CoreMaker/STM32C542_SENSOR

概念说明

BOOT_SEL 是 STM32C5 Option Bytes 中的一个启动配置位,用于选择 BOOT0 信号的来源。
当 BOOT_SEL = 1 时,BOOT0 信号由外部 BOOT0 引脚决定,也就是传统 STM32 常见的 BOOT0 引脚启动方式。
当 BOOT_SEL = 0 时,BOOT0 信号由 Option Bytes 中的 BOOT0 option bit 决定,此时外部 BOOT0 引脚不再作为主要启动选择依据。
RM0522 中说明,STM32C5 启动时会根据 BOOT0 引脚或 BOOT0 option bit,再结合 BOOT_SEL option bit 和 BOOTADD[31:8] 来选择启动地址,启动区域可以是用户 Flash,也可以是 System Memory Bootloader。

在这里插入图片描述

BOOT_SEL 决定 BOOT0 信号来自哪里;BOOT0 决定是否进入 Bootloader;EMPTY flag 用于空片保护,Flash 为空时自动进入 Bootloader。

在这里插入图片描述

自举模式

AN2606在自举模式部分,该文档介绍了 STM32C542 的自举功能和选项.
如果使用 USART1 进入 STM32C542 的 Bootloader,需要连接 PA9 / PA10:
PA9 -> USART1_TX
PA10 -> USART1_RX
串口格式为 8 位数据位、偶校验、1 位停止位。
在这里插入图片描述

BOOT0设置

BOOT0可以通过CN2跳线帽进行设置。
在这里插入图片描述

配置 BOOT_SEL

通过程序修改 STM32C5 的 BOOT_SEL Option Byte,决定 BOOT0 信号到底来自外部 BOOT0 引脚,还是来自内部 BOOT0 Option Bit。
这个函数的整体流程 如下:

读取当前 BOOT_SEL 配置
        ↓
判断是否需要修改
        ↓
等待 Flash 空闲
        ↓
清除错误标志
        ↓
解锁 Flash 和 Option Bytes
        ↓
设置新的 BOOT_SEL
        ↓
启动 Option Bytes 编程
        ↓
等待完成并检查错误
        ↓
重新锁定 Flash 和 Option Bytes
        ↓
系统复位让配置生效

Configure_BOOT_SEL代码。

#include "stm32c5xx_ll_flash.h"
#include < stdio.h >


/*
 * enable = 1:BOOT_SEL = 1,BOOT0 信号来自外部 BOOT0 引脚
 * enable = 0:BOOT_SEL = 0,BOOT0 信号来自内部 BOOT0 Option Bit
 */
static void Configure_BOOT_SEL(uint8_t enable)
{
    uint32_t target_boot_sel;
    uint32_t current_boot_sel;

    /*
     * STM32C5:
     * BOOT_SEL = 1: BOOT0 from BOOT0 pin
     * BOOT_SEL = 0: BOOT0 from BOOT0 option bit
     *
     * 当前头文件里有 LL_FLASH_OB_BOOT0_BOOTPIN,
     * 但没有 LL_FLASH_OB_BOOT0_BOOT0,所以 BOOT_SEL = 0 直接用 0U。
     */
    target_boot_sel = enable ? LL_FLASH_OB_BOOT0_BOOTPIN : 0U;

    current_boot_sel = LL_FLASH_OB_GetBoot0SourceSelection(FLASH);

    if (current_boot_sel == target_boot_sel)
    {
        printf("BOOT_SEL is already set to the desired value.rn");
        return;
    }

    /* 等待 Flash 空闲 */
    while ((FLASH- >SR & FLASH_SR_BSY) != 0U)
    {
    }

    /*
     * 清除可能存在的 Option Byte 错误标志。
     * 如果不清除 OPTCHANGEERR,后面 OPTSTRT 可能无法启动。
     */
#ifdef FLASH_CCR_CLR_OPTCHANGEERR
    FLASH- >CCR = FLASH_CCR_CLR_OPTCHANGEERR;
#endif

#ifdef FLASH_CCR_CLR_PGSERR
    FLASH- >CCR = FLASH_CCR_CLR_PGSERR;
#endif

#ifdef FLASH_CCR_CLR_WRPERR
    FLASH- >CCR = FLASH_CCR_CLR_WRPERR;
#endif

#ifdef FLASH_CCR_CLR_STRBERR
    FLASH- >CCR = FLASH_CCR_CLR_STRBERR;
#endif

#ifdef FLASH_CCR_CLR_INCERR
    FLASH- >CCR = FLASH_CCR_CLR_INCERR;
#endif

#ifdef FLASH_CCR_CLR_EOP
    FLASH- >CCR = FLASH_CCR_CLR_EOP;
#endif

    /* 解锁 Flash */
    if (LL_FLASH_IsLocked(FLASH) != 0U)
    {
        LL_FLASH_SetUnlockKey(FLASH, LL_FLASH_KEY1);
        LL_FLASH_SetUnlockKey(FLASH, LL_FLASH_KEY2);
    }

    /* 解锁 Option Bytes */
    if (LL_FLASH_OB_IsLocked(FLASH) != 0U)
    {
        LL_FLASH_OB_SetUnlockKey(FLASH, LL_FLASH_OB_OPTKEY1);
        LL_FLASH_OB_SetUnlockKey(FLASH, LL_FLASH_OB_OPTKEY2);
    }

    if ((LL_FLASH_IsLocked(FLASH) != 0U) || (LL_FLASH_OB_IsLocked(FLASH) != 0U))
    {
        printf("Error: Failed to unlock FLASH or Option Bytes!rn");
        return;
    }

    /* 设置 BOOT_SEL */
    LL_FLASH_OB_SetBoot0SourceSelection(FLASH, target_boot_sel);

    /*
     * 启动 Option Bytes 修改。
     * RM0522 中说明:修改 FLASH_xxx_PRG 后,需要置位 OPTSTRT。
     */
    FLASH- >OPTCR |= FLASH_OPTCR_OPTSTRT;

    /* 等待 Option Bytes 修改完成 */
    while ((FLASH- >SR & FLASH_SR_BSY) != 0U)
    {
    }

    /* 检查是否发生 Option Byte 修改错误 */
    if ((FLASH- >SR & FLASH_SR_OPTCHANGEERR) != 0U)
    {
        printf("Error: Option Bytes change failed!rn");

#ifdef FLASH_CCR_CLR_OPTCHANGEERR
        FLASH- >CCR = FLASH_CCR_CLR_OPTCHANGEERR;
#endif
    }
    else
    {
        printf("BOOT_SEL configured successfully.rn");
    }

    /* 锁定 Option Bytes 和 Flash */
    LL_FLASH_OB_Lock(FLASH);
    LL_FLASH_Lock(FLASH);

    /*
     * 修改 Option Bytes 后建议复位,让配置重新加载。
     */
    NVIC_SystemReset();
}

然后在 main() 里调用一次,比如你想设置成 使用外部 BOOT0 引脚:

Configure_BOOT_SEL(1);

如果你想设置成 使用内部 BOOT0 Option Bit:

Configure_BOOT_SEL(0);

在这里插入图片描述

查看BOOT_SEL

代码配置 BOOT_SEL 后,在 STM32CubeProgrammer 中读取验证 。
程序中调用 Configure_BOOT_SEL(1) 后,芯片复位并重新加载 Option Bytes。随后使用 STM32CubeProgrammer 连接目标板,进入 Option Bytes → User Configuration 页面,点击 Read 读取当前选项字节配置,可以看到 BOOT_SEL 已被勾选,说明 BOOT_SEL 已成功配置为 1,即 BOOT0 信号来源为外部 BOOT0 引脚。

在这里插入图片描述

UART烧录

将BOOT0接入3V3中。
BOOT0可以通过CN2跳线帽进行设置。

在这里插入图片描述

TYPE-C已经通过CH340接入到PA9和PA10。

在这里插入图片描述

在这里插入图片描述

打开STM32CubeProgrammer,设置为UART烧录模式。

  1. 连接方式选择 UART,表示通过串口方式连接 STM32C5 Bootloader
  2. UART 参数配置:选择对应 COM 口,波特率 115200,偶校验 Even,8 数据位,1 停止位
  3. 目标信息区域显示芯片系列为 STM32C53x/542,说明已经通过 Bootloader 识别到目标芯片
  4. 左侧内存窗口成功读取 0x08000000 地址内容,日志显示 Data read successfully,说明 UART Bootloader 通信正常

在这里插入图片描述

USB烧录

将BOOT0接入3V3中。
BOOT0可以通过CN2跳线帽进行设置。

在这里插入图片描述

AN2606 中 USB DFU Bootloader 接口说明。STM32C531xx / C532xx / C542xx 进入 System Memory Bootloader 后支持 USB DFU,USB_DM 使用 PA11,USB_DP 使用 PA12。硬件预留 USB 接口后,可通过 STM32CubeProgrammer 的 USB 模式进行 DFU 下载。

在这里插入图片描述

TYPE-C已经接入到PA11和PA12。

在这里插入图片描述
通过 USB DFU 连接 STM32C5 Bootloader。BOOT0 拉高复位后,STM32CubeProgrammer 选择 USB 接口,可成功识别 STM32C53x/542 并读取 Flash 数据,说明芯片已进入系统 Bootloader,USB DFU 通信正常。

在这里插入图片描述

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2315

    文章

    11222

    浏览量

    375663
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    STM32C542开发(3)----配置串口打印

    在传统 STM32 开发中,我们通常会通过 STM32CubeMX 配置 USART,并重定向 printf() 到串口,用于输出调试信息。STM32C5 使用新的
    的头像 发表于 06-08 11:12 216次阅读
    <b class='flag-5'>STM32C542</b><b class='flag-5'>开发</b>(3)----配置串口打印

    STM32C552开发(2)----BOOT_SEL设置

    内置的 System Memory Bootloader,才能通过这些接口完成 Flash 烧录。对于 STM32C5 系列来说,是否使用外部 BOOT0 引脚进入 Bootloader,与 Option
    的头像 发表于 06-08 11:11 214次阅读
    <b class='flag-5'>STM32C</b>552<b class='flag-5'>开发</b>(<b class='flag-5'>2</b>)----<b class='flag-5'>BOOT_SEL</b><b class='flag-5'>设置</b>

    STM32C552开发(1)----点亮LED

    STM32C552 & SENSOR是一款基于STM32C5系列微控制器的评估套件。该微控制器采用了40nm工艺制造,具有更快的FLASH访问,更高的性能以及更低的功耗。此外,该套件具有丰富
    的头像 发表于 06-08 11:08 184次阅读
    <b class='flag-5'>STM32C</b>552<b class='flag-5'>开发</b>(1)----点亮LED

    STM32C542开发(1)----点亮LED

    STM32C542 & SENSOR是一款基于STM32C5系列微控制器的评估套件。该微控制器采用了40nm工艺制造,具有更快的FLASH访问,更高的性能以及更低的功耗。此外,该套件具有丰富
    的头像 发表于 06-08 11:06 176次阅读
    <b class='flag-5'>STM32C542</b><b class='flag-5'>开发</b>(1)----点亮LED

    探索CL2 - 542G紧凑型指示灯:技术解析与应用前景

    探索CL2 - 542G紧凑型指示灯:技术解析与应用前景 在电子工程领域,指示灯作为一种基础却至关重要的设备,广泛应用于各类控制系统中。今天,我们将深入剖析CL2 - 542G紧凑型指
    的头像 发表于 06-04 09:20 188次阅读

    STM32H573 使能 HSLV 引起 I2C4 失效的案例分析

    某客户使用 STM32H573II 开发一款 PLC 产品时反馈 I2C4 无法通信,在上一款产品中也是使用的 I2C4 接口,通信却是正常的,客户对此感到非常困惑,百思不得其解。进一
    发表于 04-15 15:57 0次下载

    LAT1618_STM32H573 使能 HSLV 引起 I2C4 失效的案例分析

    某客户使用 STM32H573II 开发一款 PLC 产品时反馈 I2C4 无法通信,在上一款产品中也是使用的 I2C4 接口,通信却是正常的,客户对此感到非常困惑,百思不得其解。进一
    发表于 03-11 10:41 0次下载

    深入解析U-Boot image.c:RK平台镜像处理核心逻辑

    在瑞芯微(RK)平台的嵌入式开发中,U-Boot作为核心的启动加载程序,负责完成镜像解析、校验、加载等关键流程。而image.c正是U-Boot中处理镜像(uImage)的核心文件,尤
    的头像 发表于 02-24 16:46 1982次阅读
    深入解析U-<b class='flag-5'>Boot</b> image.<b class='flag-5'>c</b>:RK平台镜像处理核心逻辑

    【ESP32-C6系列】WT9932C6开发板规格书

    本小节将简要介绍WT9932C6开发板。1WT9932C6的实物图2详细管脚描述下表列出了开发板管脚描述,如图WT9932
    的头像 发表于 02-11 18:04 529次阅读
    【ESP32-<b class='flag-5'>C</b>6系列】WT9932<b class='flag-5'>C</b>6<b class='flag-5'>开发</b>板规格书

    MTK平台LK阶段mt_boot.c配置:SELINUX_STATUS 2的作用与影响

    在 MTK(联发科)平台的 Bootloader(以 LK/Little Kernel 为例)中,mt_boot.c是负责 Linux 内核启动逻辑的核心文件,此次代码变更(新增#define
    的头像 发表于 02-03 15:46 1069次阅读
    MTK平台LK阶段mt_<b class='flag-5'>boot.c</b>配置:SELINUX_STATUS <b class='flag-5'>2</b>的作用与影响

    深入解析U-Boot命令处理核心文件:功能、调试与开发价值

    在嵌入式系统开发中,U-Boot 作为主流的引导加载程序,其命令处理、交互逻辑和自动启动流程是核心功能模块。本文将围绕command.c、cli.c和autoboot.
    的头像 发表于 02-03 15:44 1107次阅读
    深入解析U-<b class='flag-5'>Boot</b>命令处理核心文件:功能、调试与<b class='flag-5'>开发</b>价值

    解析Rockchip平台U-Boot核心文件:boot_rkimg.c到底做了什么?

    在嵌入式开发中,U-Boot 作为引导程序的 “中流砥柱”,负责初始化硬件、加载内核并启动系统。对于 Rockchip 平台的设备(如常见的开发板、智能终端),boot_rkimg.c
    的头像 发表于 02-03 15:29 1092次阅读
    解析Rockchip平台U-<b class='flag-5'>Boot</b>核心文件:<b class='flag-5'>boot_rkimg.c</b>到底做了什么?

    TUSB542:USB 3.1 Gen1 5Gbps转接驱动器的卓越之选

    作为一款专为USB Type - C端口设计的5Gbps转接驱动器2:1多路复用器,在信号处理和传输方面展现出了卓越的性能。下面我们就来深入了解一下这款器件。 文件下载: tusb542.pdf 一
    的头像 发表于 12-19 15:45 1172次阅读

    STM32C0116-DK探索套件开发指南与技术解析

    基于STM32C011F6微控制器的UFQFPN20至DIL20模块,使用户能够开发和共享应用。该器件还包含一个板载ST-LINK/V2-1,以调试和编程设定嵌入式STM32微控制器。
    的头像 发表于 10-27 14:57 982次阅读
    <b class='flag-5'>STM32C</b>0116-DK探索套件<b class='flag-5'>开发</b>指南与技术解析

    ‌TUSB542 USB Type-C™ 5Gbps Redriver 2:1 MUX 技术文档总结

    Type-C 可翻转连接器的 USB SS 信号。TUSB542可以通过外部配置通道逻辑控制器通过SEL引脚进行控制,以正确多路复用信号。
    的头像 发表于 08-10 10:04 2109次阅读
    ‌TUSB<b class='flag-5'>542</b> USB Type-<b class='flag-5'>C</b>™ 5Gbps Redriver <b class='flag-5'>2</b>:1 MUX 技术文档总结