概述
STM32CubeProgrammer (STM32CubeProg) 是一款用于編程STM32產(chǎn)品的全功能多操作系統(tǒng)軟件工具。
它提供了一個(gè)易用高效的環(huán)境,通過(guò)調(diào)試接口(JTAG和SWD)和自舉程序接口(UART、USB DFU、I2C、SPI和CAN)讀取、寫(xiě)入及驗(yàn)證器件內(nèi)存。
STM32CubeProgrammer的功能廣泛,可以對(duì)STM32內(nèi)部存儲(chǔ)器(如Flash、RAM和OTP)以及外部存儲(chǔ)器進(jìn)行編程。
最近在弄ST的教程,需要樣片的可以加群申請(qǐng):615061293/925643491 。

硬件準(zhǔn)備
首先需要準(zhǔn)備一個(gè)開(kāi)發(fā)板,這里我準(zhǔn)備的是自己繪制的開(kāi)發(fā)板,需要的可以進(jìn)行申請(qǐng)。
主控為STM32C011F4P6

視頻教學(xué)
[https://www.bilibili.com/video/BV1gnBbYiERj/]
樣品申請(qǐng)
[https://www.wjx.top/vm/OhcKxJk.aspx#]
源碼下載
參考程序
[https://github.com/CoreMaker-lab/STM32C011_TSSOP20]
[https://gitee.com/CoreMaker/STM32C011_TSSOP20]
自舉模式
AN2606在自舉模式部分,該文檔介紹了 STM32C011 的自舉功能和選項(xiàng):
USART1 自舉程序:
● 啟用狀態(tài):USART1 被啟用,用于通信。
● USART1_RX 引腳:PA10 被配置為接收引腳(輸入),并啟用了上拉電阻。
● USART1_TX 引腳:PA9 被配置為發(fā)送引腳(輸出),設(shè)置為推挽模式,同時(shí)啟用了上拉電阻。
● 配置參數(shù):初始化為 8 位數(shù)據(jù),無(wú)校驗(yàn)位,1 個(gè)停止位。
在 WLCSP12、SO8N、TSSOP20 和 UFQFN20 封裝中,USART1 的 PA9/PA10 引腳可能與 PA11/PA12 引腳重疊。

復(fù)用管腳如下所示。


BOOT0設(shè)置
BOOT0可以通過(guò)CN9跳線(xiàn)帽進(jìn)行設(shè)置。

PA14 與 BOOT0 功能共用:需謹(jǐn)慎使用,因?yàn)檎{(diào)試器可能會(huì)修改 BOOT0 引腳值。

進(jìn)入系統(tǒng)存儲(chǔ)器模式(Bootloader):
● 設(shè)置 nBOOT_SEL = 0, nBOOT1 = 1, BOOT0 = 1。
● 啟用 Bootloader 模式,可通過(guò) USART、I2C 等方式進(jìn)行固件更新。

配置 nBOOT_SEL
選項(xiàng)字節(jié)寄存器 (FLASH_OPTR) 用于存儲(chǔ)芯片的啟動(dòng)配置、安全性和一些功能性參數(shù),包括:
● 啟動(dòng)模式選擇 (nBOOT_SEL, nBOOT0, nBOOT1)。
● 看門(mén)狗模式選擇(獨(dú)立看門(mén)狗 IWDG_SW 和窗口看門(mén)狗 WWDG_SW)。
● 低功耗模式的復(fù)位控制 (nRST_STOP, nRST_STDBY, nRST_SHDW)。
● 讀保護(hù)等級(jí) (RDP)。
● SRAM 奇偶校驗(yàn)功能 (RAM_PARITY_CHECK)。
● 高速外部時(shí)鐘映射功能 (HSE_NOT_REMAPPED)。



在stm32c0xx_hal_flash_ex.c中,F(xiàn)LASH_OB_OptrConfig 函數(shù)的主要作用是配置 STM32 微控制器的 選項(xiàng)字節(jié)(Option Bytes) 中的 OPTR 寄存器(Option Byte Register)。該寄存器包含了用戶(hù)配置的一些關(guān)鍵功能位,例如:
● 啟動(dòng)模式相關(guān)配置(如 nBOOT_SEL、nBOOT0、nBOOT1)

建議配合更高層的 HAL_FLASHEx_OBProgram 函數(shù)使用,因?yàn)楹笳叻庋b了 FLASH_OB_OptrConfig,提供了更強(qiáng)的可讀性和靈活性。

以下代碼展示了如何使用 HAL_FLASHEx_OBProgram 函數(shù)來(lái)啟用或禁用 nBOOT_SEL。
static void Configure_nBOOT_SEL(uint8_t enable)
{
FLASH_OBProgramInitTypeDef OBInit;
// 讀取當(dāng)前 Option Bytes 配置
HAL_FLASHEx_OBGetConfig(&OBInit);
// 檢查是否需要修改 nBOOT_SEL
if (((OBInit.USERConfig & OB_USER_NBOOT_SEL) == OB_BOOT0_FROM_OB) != enable)
{
// 解鎖 Flash
if (HAL_FLASH_Unlock() == HAL_OK)
{
// 解鎖 Option Bytes
if (HAL_FLASH_OB_Unlock() == HAL_OK)
{
// 配置選項(xiàng)字節(jié)
OBInit.OptionType = OPTIONBYTE_USER;
OBInit.USERType = OB_USER_NBOOT_SEL;
OBInit.USERConfig = enable ? OB_USER_NBOOT_SEL : 0;
// 寫(xiě)入新的配置
if (HAL_FLASHEx_OBProgram(&OBInit) != HAL_OK)
{
printf("Error: Option Bytes Programming failed!n");
}
// 啟動(dòng) Option Bytes 配置
if (HAL_FLASH_OB_Launch() != HAL_OK)
{
printf("Error: Option Bytes Launch failed!n");
}
// 鎖定 Option Bytes 和 Flash
HAL_FLASH_OB_Lock();
HAL_FLASH_Lock();
}
else
{
printf("Error: Failed to unlock Option Bytes!n");
}
}
else
{
printf("Error: Failed to unlock Flash!n");
}
}
else
{
printf("nBOOT_SEL is already set to the desired value.n");
}
}
添加到主程序中。
/* USER CODE BEGIN SysInit */
HAL_Delay(100);
Configure_nBOOT_SEL(0);
/* USER CODE END SysInit */
在STM32CubeProgrammer中可以查看nBOOT_SEL的狀態(tài)。

生成STM32CUBEMX
用STM32CUBEMX生成例程,這里使用MCU為STM32C011F4P6。
配置時(shí)鐘樹(shù),配置時(shí)鐘為48M。

串口配置
查看原理圖,PA0和PA1設(shè)置為開(kāi)發(fā)板的串口。

配置串口,速率為115200。

LED配置
查看原理圖,對(duì)應(yīng)LED分別為PA4,PA5,PA6。

配置如下所示。

堆棧設(shè)置

若無(wú)法正常運(yùn)行需要修改優(yōu)化等級(jí)。

串口重定向
打開(kāi)魔術(shù)棒,勾選MicroLIB
在main.c中,添加頭文件,若不添加會(huì)出現(xiàn) identifier "FILE" is undefined報(bào)錯(cuò)。
/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */
函數(shù)聲明和串口重定向:
/* USER CODE BEGIN PFP */
int fputc(int ch, FILE *f){
HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
/* USER CODE END PFP */
主循環(huán)
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_GPIO_WritePin(LED1_GPIO_Port, LED5_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(LED2_GPIO_Port, LED6_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(LED3_GPIO_Port, LED7_Pin, GPIO_PIN_SET);
printf("LED ON!n");
HAL_Delay(1000);
HAL_GPIO_WritePin(LED1_GPIO_Port, LED5_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED2_GPIO_Port, LED6_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED3_GPIO_Port, LED7_Pin, GPIO_PIN_RESET);
printf("LED OFF!n");
HAL_Delay(1000);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
演示

審核編輯 黃宇
-
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
7426瀏覽量
129571 -
STM32
+關(guān)注
關(guān)注
2312文章
11187瀏覽量
374419
發(fā)布評(píng)論請(qǐng)先 登錄
STM32H573 使能 HSLV 引起 I2C4 失效的案例分析
onsemi NTMYS011N04C:高性能N溝道MOSFET的卓越之選
探索 onsemi NVMYS011N04C:高性能 N 溝道 MOSFET 的卓越之選
LAT1618_STM32H573 使能 HSLV 引起 I2C4 失效的案例分析
AT32F011 系列快速使用指南
【ESP32-C2/C3系列】WT9901C2/C3-SN2 開(kāi)發(fā)板上手指南
CW32L011開(kāi)發(fā)支持
STM32C0116-DK探索套件開(kāi)發(fā)指南與技術(shù)解析
STMicroelectronics NUCLEO-C071RB STM32 Nucleo-64開(kāi)發(fā)板數(shù)據(jù)手冊(cè)
?STM32 Nucleo-64開(kāi)發(fā)板技術(shù)解析與應(yīng)用指南
STM32 Nucleo-64開(kāi)發(fā)板技術(shù)解析:以NUCLEO-C092RC為例
STM32C011開(kāi)發(fā)(3)----Flash操作
CW32L011電機(jī)驅(qū)動(dòng)開(kāi)發(fā)板——驅(qū)動(dòng)無(wú)刷電機(jī)
CW32L011電機(jī)驅(qū)動(dòng)控制開(kāi)發(fā)板-軟件
CW32L011電機(jī)驅(qū)動(dòng)電機(jī)控制開(kāi)發(fā)板-硬件1
STM32C011開(kāi)發(fā)(2)----nBOOT_SEL設(shè)置
評(píng)論