概述
在實(shí)際項(xiàng)目開發(fā)或量產(chǎn)維護(hù)中,除了 ST-LINK 下載方式外,很多場景還會(huì)使用 USART 串口、USB DFU、SPI 或 FDCAN 等方式進(jìn)行程序升級(jí)。此時(shí) MCU 需要先進(jìn)入 ST 出廠內(nèi)置的 System Memory Bootloader,才能通過這些接口完成 Flash 燒錄。對(duì)于 STM32C5 系列來說,是否使用外部 BOOT0 引腳進(jìn)入 Bootloader,與 Option Bytes 中的 BOOT_SEL 配置密切相關(guān)。 簡單來說,BOOT_SEL 用于選擇 BOOT0 信號(hào)的來源:當(dāng) BOOT_SEL 使能外部 BOOT0 引腳時(shí),可以通過拉高 BOOT0 后復(fù)位芯片進(jìn)入系統(tǒng) Bootloader;當(dāng) BOOT_SEL 選擇內(nèi)部 Option Bit 時(shí),則由 Option Bytes 中的 BOOT0 配置決定啟動(dòng)方式。因此,理解 BOOT_SEL、BOOT0 引腳和 System Memory Bootloader 之間的關(guān)系,對(duì)于后續(xù)使用串口或 USB 下載程序非常重要。
需要樣片的可以加群申請(qǐng):925643491 / 615061293 。
視頻教學(xué)
[https://www.bilibili.com/video/BV1ATVD6mEex/]
樣品申請(qǐng)
[https://www.wjx.top/vm/OhcKxJk.aspx#]
源碼下載
[https://download.csdn.net/download/qq_24312945/92952812]
硬件準(zhǔn)備
首先需要準(zhǔn)備一個(gè)開發(fā)板,這里我準(zhǔn)備的是自己繪制的開發(fā)板,需要的可以進(jìn)行申請(qǐng)。
主控為STM32C552CET6/STM32C552CEU6

參考程序
https://github.com/CoreMaker-lab/STM32C552_SENSOR
https://gitee.com/CoreMaker/STM32C552_SENSOR
概念說明
BOOT_SEL 是 STM32C5 Option Bytes 中的一個(gè)啟動(dòng)配置位,用于選擇 BOOT0 信號(hào)的來源。 當(dāng) BOOT_SEL = 1 時(shí),BOOT0 信號(hào)由外部 BOOT0 引腳決定,也就是傳統(tǒng) STM32 常見的 BOOT0 引腳啟動(dòng)方式。 當(dāng) BOOT_SEL = 0 時(shí),BOOT0 信號(hào)由 Option Bytes 中的 BOOT0 option bit 決定,此時(shí)外部 BOOT0 引腳不再作為主要啟動(dòng)選擇依據(jù)。 RM0522 中說明,STM32C5 啟動(dòng)時(shí)會(huì)根據(jù) BOOT0 引腳或 BOOT0 option bit,再結(jié)合 BOOT_SEL option bit 和 BOOTADD[31:8] 來選擇啟動(dòng)地址,啟動(dòng)區(qū)域可以是用戶 Flash,也可以是 System Memory Bootloader。

BOOT_SEL 決定 BOOT0 信號(hào)來自哪里;BOOT0 決定是否進(jìn)入 Bootloader;EMPTY flag 用于空片保護(hù),F(xiàn)lash 為空時(shí)自動(dòng)進(jìn)入 Bootloader。

自舉模式
AN2606在自舉模式部分,該文檔介紹了 STM32C542 的自舉功能和選項(xiàng). 如果使用 USART1 進(jìn)入 STM32C542 的 Bootloader,需要連接 PA9 / PA10: PA9 -> USART1_TX PA10 -> USART1_RX 串口格式為 8 位數(shù)據(jù)位、偶校驗(yàn)、1 位停止位。

BOOT0設(shè)置
BOOT0可以通過CN2跳線帽進(jìn)行設(shè)置。

配置 BOOT_SEL
通過程序修改 STM32C5 的 BOOT_SEL Option Byte,決定 BOOT0 信號(hào)到底來自外部 BOOT0 引腳,還是來自內(nèi)部 BOOT0 Option Bit。
這個(gè)函數(shù)的整體流程 如下:
讀取當(dāng)前 BOOT_SEL 配置
↓
判斷是否需要修改
↓
等待 Flash 空閑
↓
清除錯(cuò)誤標(biāo)志
↓
解鎖 Flash 和 Option Bytes
↓
設(shè)置新的 BOOT_SEL
↓
啟動(dòng) Option Bytes 編程
↓
等待完成并檢查錯(cuò)誤
↓
重新鎖定 Flash 和 Option Bytes
↓
系統(tǒng)復(fù)位讓配置生效
Configure_BOOT_SEL代碼。
#include "stm32c5xx_ll_flash.h"
#include < stdio.h >
/*
* enable = 1:BOOT_SEL = 1,BOOT0 信號(hào)來自外部 BOOT0 引腳
* enable = 0:BOOT_SEL = 0,BOOT0 信號(hào)來自內(nèi)部 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
*
* 當(dāng)前頭文件里有 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 錯(cuò)誤標(biāo)志。
* 如果不清除 OPTCHANGEERR,后面 OPTSTRT 可能無法啟動(dòng)。
*/
#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;
}
/* 設(shè)置 BOOT_SEL */
LL_FLASH_OB_SetBoot0SourceSelection(FLASH, target_boot_sel);
/*
* 啟動(dòng) Option Bytes 修改。
* RM0522 中說明:修改 FLASH_xxx_PRG 后,需要置位 OPTSTRT。
*/
FLASH- >OPTCR |= FLASH_OPTCR_OPTSTRT;
/* 等待 Option Bytes 修改完成 */
while ((FLASH- >SR & FLASH_SR_BSY) != 0U)
{
}
/* 檢查是否發(fā)生 Option Byte 修改錯(cuò)誤 */
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 后建議復(fù)位,讓配置重新加載。
*/
NVIC_SystemReset();
}
然后在 main() 里調(diào)用一次,比如你想設(shè)置成 使用外部 BOOT0 引腳:
Configure_BOOT_SEL(1);
如果你想設(shè)置成 使用內(nèi)部 BOOT0 Option Bit:
Configure_BOOT_SEL(0);

查看BOOT_SEL
代碼配置 BOOT_SEL 后,在 STM32CubeProgrammer 中讀取驗(yàn)證 。 程序中調(diào)用 Configure_BOOT_SEL(1) 后,芯片復(fù)位并重新加載 Option Bytes。隨后使用 STM32CubeProgrammer 連接目標(biāo)板,進(jìn)入 Option Bytes → User Configuration 頁面,點(diǎn)擊 Read 讀取當(dāng)前選項(xiàng)字節(jié)配置,可以看到 BOOT_SEL 已被勾選,說明 BOOT_SEL 已成功配置為 1,即 BOOT0 信號(hào)來源為外部 BOOT0 引腳。

UART燒錄
將BOOT0接入3V3中。 BOOT0可以通過CN2跳線帽進(jìn)行設(shè)置。

有TYPE-C已經(jīng)通過CH340接入到PA9和PA10。


打開STM32CubeProgrammer,設(shè)置為UART燒錄模式。
- 連接方式選擇 UART,表示通過串口方式連接 STM32C5 Bootloader
- UART 參數(shù)配置:選擇對(duì)應(yīng) COM 口,波特率 115200,偶校驗(yàn) Even,8 數(shù)據(jù)位,1 停止位
- 目標(biāo)信息區(qū)域顯示芯片系列為 STM32C53x/542,說明已經(jīng)通過 Bootloader 識(shí)別到目標(biāo)芯片
- 左側(cè)內(nèi)存窗口成功讀取 0x08000000 地址內(nèi)容,日志顯示 Data read successfully,說明 UART Bootloader 通信正常

USB燒錄
將BOOT0接入3V3中。 BOOT0可以通過CN2跳線帽進(jìn)行設(shè)置。

AN2606 中 USB DFU Bootloader 接口說明。STM32C531xx / C532xx / C542xx 進(jìn)入 System Memory Bootloader 后支持 USB DFU,USB_DM 使用 PA11,USB_DP 使用 PA12。硬件預(yù)留 USB 接口后,可通過 STM32CubeProgrammer 的 USB 模式進(jìn)行 DFU 下載。

TYPE-C已經(jīng)接入到PA11和PA12。

通過 USB DFU 連接 STM32C5 Bootloader。BOOT0 拉高復(fù)位后,STM32CubeProgrammer 選擇 USB 接口,可成功識(shí)別 STM32C53x/542 并讀取 Flash 數(shù)據(jù),說明芯片已進(jìn)入系統(tǒng) Bootloader,USB DFU 通信正常。

審核編輯 黃宇
-
STM32
+關(guān)注
關(guān)注
2315文章
11223瀏覽量
375710
發(fā)布評(píng)論請(qǐng)先 登錄
STM32L552CET6,STM32L552QEI6,STM32L552RCT6超低功耗微控制器STM32L552
STM32F0的BOOT配置及相關(guān)話題
STM32單片機(jī)在KIEL4配置開發(fā)中的設(shè)置
STM32的三種Boot模式及驗(yàn)證
在MIMXRT1020CAG4B中設(shè)置BT_FUSE_SEL熔絲位
MGMF552L1C5-網(wǎng)絡(luò)式伺服A6N 設(shè)置例 松下
MGMF552L1C6-網(wǎng)絡(luò)式伺服A6N 設(shè)置例 松下
MGMF552L1C6M-網(wǎng)絡(luò)式伺服A6N 設(shè)置例 松下
stm32boot0和boot1對(duì)應(yīng)哪個(gè)p引腳
單片機(jī)boot0和boot1怎么設(shè)置
STM32C011開發(fā)(2)----nBOOT_SEL設(shè)置
STM32C552開發(fā)(1)----點(diǎn)亮LED
STM32C542開發(fā)(2)----BOOT_SEL設(shè)置
STM32C552開發(fā)(2)----BOOT_SEL設(shè)置
評(píng)論