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

描述

概述

在实际项目开发或量产维护中,除了 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/BV1Tagj6QEMP/]

样品申请

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

源码下载

[https://download.csdn.net/download/qq_24312945/93389979]

硬件准备

首先需要准备一个开发板,这里我准备的是自己绘制的开发板,需要的可以进行申请。
主控为STM32C542RCT6
S

参考程序

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

https://gitee.com/CoreMaker/STM32C542R_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。

S

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

S

自举模式

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

BOOT0设置

BOOT0可以通过CN2跳线帽进行设置。
S

配置 BOOT_SEL

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

  1. 读取当前 BOOT_SEL 配置

  2. 判断是否需要修改

  3. 等待Flash空闲

  4. 清除错误标志

  5. 解锁FlashOptionBytes

  6. 设置新的 BOOT_SEL

  7. 启动OptionBytes编程

  8. 等待完成并检查错误

  9. 重新锁定FlashOptionBytes

  10. 系统复位让配置生效

Configure_BOOT_SEL代码。

  1. #include"stm32c5xx_ll_flash.h"

  2. #include

  3. /*

  4. * enable = 1:BOOT_SEL = 1,BOOT0 信号来自外部 BOOT0 引脚

  5. * enable = 0:BOOT_SEL = 0,BOOT0 信号来自内部 BOOT0 Option Bit

  6. */

  7. staticvoidConfigure_BOOT_SEL(uint8_t enable)

  8. {

  9. uint32_t target_boot_sel;

  10. uint32_t current_boot_sel;

  11. /*

  12. * STM32C5:

  13. * BOOT_SEL = 1: BOOT0 from BOOT0 pin

  14. * BOOT_SEL = 0: BOOT0 from BOOT0 option bit

  15. *

  16. * 当前头文件里有 LL_FLASH_OB_BOOT0_BOOTPIN,

  17. * 但没有 LL_FLASH_OB_BOOT0_BOOT0,所以 BOOT_SEL = 0 直接用 0U。

  18. */

  19. target_boot_sel = enable ? LL_FLASH_OB_BOOT0_BOOTPIN :0U;

  20. current_boot_sel = LL_FLASH_OB_GetBoot0SourceSelection(FLASH);

  21. if(current_boot_sel == target_boot_sel)

  22. {

  23. printf("BOOT_SEL is already set to the desired value.rn");

  24. return;

  25. }

  26. /* 等待 Flash 空闲 */

  27. while((FLASH->SR & FLASH_SR_BSY)!=0U)

  28. {

  29. }

  30. /*

  31. * 清除可能存在的 Option Byte 错误标志。

  32. * 如果不清除 OPTCHANGEERR,后面 OPTSTRT 可能无法启动。

  33. */

  34. #ifdef FLASH_CCR_CLR_OPTCHANGEERR

  35. FLASH->CCR = FLASH_CCR_CLR_OPTCHANGEERR;

  36. #endif

  37. #ifdef FLASH_CCR_CLR_PGSERR

  38. FLASH->CCR = FLASH_CCR_CLR_PGSERR;

  39. #endif

  40. #ifdef FLASH_CCR_CLR_WRPERR

  41. FLASH->CCR = FLASH_CCR_CLR_WRPERR;

  42. #endif

  43. #ifdef FLASH_CCR_CLR_STRBERR

  44. FLASH->CCR = FLASH_CCR_CLR_STRBERR;

  45. #endif

  46. #ifdef FLASH_CCR_CLR_INCERR

  47. FLASH->CCR = FLASH_CCR_CLR_INCERR;

  48. #endif

  49. #ifdef FLASH_CCR_CLR_EOP

  50. FLASH->CCR = FLASH_CCR_CLR_EOP;

  51. #endif

  52. /* 解锁 Flash */

  53. if(LL_FLASH_IsLocked(FLASH)!=0U)

  54. {

  55. LL_FLASH_SetUnlockKey(FLASH, LL_FLASH_KEY1);

  56. LL_FLASH_SetUnlockKey(FLASH, LL_FLASH_KEY2);

  57. }

  58. /* 解锁 Option Bytes */

  59. if(LL_FLASH_OB_IsLocked(FLASH)!=0U)

  60. {

  61. LL_FLASH_OB_SetUnlockKey(FLASH, LL_FLASH_OB_OPTKEY1);

  62. LL_FLASH_OB_SetUnlockKey(FLASH, LL_FLASH_OB_OPTKEY2);

  63. }

  64. if((LL_FLASH_IsLocked(FLASH)!=0U)||(LL_FLASH_OB_IsLocked(FLASH)!=0U))

  65. {

  66. printf("Error: Failed to unlock FLASH or Option Bytes!rn");

  67. return;

  68. }

  69. /* 设置 BOOT_SEL */

  70. LL_FLASH_OB_SetBoot0SourceSelection(FLASH, target_boot_sel);

  71. /*

  72. * 启动 Option Bytes 修改。

  73. * RM0522 中说明:修改 FLASH_xxx_PRG 后,需要置位 OPTSTRT。

  74. */

  75. FLASH->OPTCR |= FLASH_OPTCR_OPTSTRT;

  76. /* 等待 Option Bytes 修改完成 */

  77. while((FLASH->SR & FLASH_SR_BSY)!=0U)

  78. {

  79. }

  80. /* 检查是否发生 Option Byte 修改错误 */

  81. if((FLASH->SR & FLASH_SR_OPTCHANGEERR)!=0U)

  82. {

  83. printf("Error: Option Bytes change failed!rn");

  84. #ifdef FLASH_CCR_CLR_OPTCHANGEERR

  85. FLASH->CCR = FLASH_CCR_CLR_OPTCHANGEERR;

  86. #endif

  87. }

  88. else

  89. {

  90. printf("BOOT_SEL configured successfully.rn");

  91. }

  92. /* 锁定 Option Bytes 和 Flash */

  93. LL_FLASH_OB_Lock(FLASH);

  94. LL_FLASH_Lock(FLASH);

  95. /*

  96. * 修改 Option Bytes 后建议复位,让配置重新加载。

  97. */

  98. NVIC_SystemReset();

  99. }

S

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

  1. Configure_BOOT_SEL(1);

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

  1. Configure_BOOT_SEL(0);

S

查看BOOT_SEL

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

S

UART烧录

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

S

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

S

S

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

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

S

USB烧录

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

S

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

S

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

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

S

审核编辑 黄宇

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分