STM32C011开发(2)—-nBOOT_SEL设置

STM32C011开发—-2.nBOOT_SEL设置

  • 概述
  • 硬件准备
  • 视频教学
  • 样品申请
  • 源码下载
  • 参考程序
  • 自举模式
  • BOOT0设置
  • 配置 nBOOT_SEL
  • 生成STM32CUBEMX
  • 串口配置
  • LED配置
  • 堆栈设置
  • 串口重定向
  • 主循环
  • 演示
  • 概述

    STM32CubeProgrammer (STM32CubeProg) 是一款用于编程STM32产品的全功能多操作系统软件工具。
    它提供了一个易用高效的环境,通过调试接口(JTAG和SWD)和自举程序接口(UART、USB DFU、I2C、SPI和CAN)读取、写入及验证器件内存。
    STM32CubeProgrammer的功能广泛,可以对STM32内部存储器(如Flash、RAM和OTP)以及外部存储器进行编程。

    最近在弄ST的教程,需要样片的可以加群申请:615061293/925643491 。

    硬件准备

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

    视频教学

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

    STM32C011开发(2)—-nBOOT

    样品申请

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

    源码下载

    参考程序

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

    https://gitee.com/CoreMaker/STM32C011_TSSOP20

    自举模式

    AN2606在自举模式部分,该文档介绍了 STM32C011 的自举功能和选项:

    USART1 自举程序:
    ● 启用状态:USART1 被启用,用于通信。
    ● USART1_RX 引脚:PA10 被配置为接收引脚(输入),并启用了上拉电阻。
    ● USART1_TX 引脚:PA9 被配置为发送引脚(输出),设置为推挽模式,同时启用了上拉电阻。
    ● 配置参数:初始化为 8 位数据,无校验位,1 个停止位。

    在 WLCSP12、SO8N、TSSOP20 和 UFQFN20 封装中,USART1 的 PA9/PA10 引脚可能与 PA11/PA12 引脚重叠。

    复用管脚如下所示。

    BOOT0设置

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

    PA14 与 BOOT0 功能共用:需谨慎使用,因为调试器可能会修改 BOOT0 引脚值。

    进入系统存储器模式(Bootloader):
    ● 设置 nBOOT_SEL = 0, nBOOT1 = 1, BOOT0 = 1。
    ● 启用 Bootloader 模式,可通过 USART、I2C 等方式进行固件更新。

    配置 nBOOT_SEL

    选项字节寄存器 (FLASH_OPTR) 用于存储芯片的启动配置、安全性和一些功能性参数,包括:
    ● 启动模式选择 (nBOOT_SEL, nBOOT0, nBOOT1)。
    ● 看门狗模式选择(独立看门狗 IWDG_SW 和窗口看门狗 WWDG_SW)。
    ● 低功耗模式的复位控制 (nRST_STOP, nRST_STDBY, nRST_SHDW)。
    ● 读保护等级 (RDP)。
    ● SRAM 奇偶校验功能 (RAM_PARITY_CHECK)。
    ● 高速外部时钟映射功能 (HSE_NOT_REMAPPED)。

    在stm32c0xx_hal_flash_ex.c中,FLASH_OB_OptrConfig 函数的主要作用是配置 STM32 微控制器的 选项字节(Option Bytes) 中的 OPTR 寄存器(Option Byte Register)。该寄存器包含了用户配置的一些关键功能位,例如:
    ● 启动模式相关配置(如 nBOOT_SEL、nBOOT0、nBOOT1)

    建议配合更高层的 HAL_FLASHEx_OBProgram 函数使用,因为后者封装了 FLASH_OB_OptrConfig,提供了更强的可读性和灵活性。

    以下代码展示了如何使用 HAL_FLASHEx_OBProgram 函数来启用或禁用 nBOOT_SEL。

    static void Configure_nBOOT_SEL(uint8_t enable)
    {
       FLASH_OBProgramInitTypeDef OBInit;
    
        // 读取当前 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)
                {
                    // 配置选项字节
                    OBInit.OptionType = OPTIONBYTE_USER;
                    OBInit.USERType = OB_USER_NBOOT_SEL;
                    OBInit.USERConfig = enable ? OB_USER_NBOOT_SEL : 0;
    
                    // 写入新的配置
                    if (HAL_FLASHEx_OBProgram(&OBInit) != HAL_OK)
                    {
                        printf("Error: Option Bytes Programming failed!\n");
                    }
    
                    // 启动 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的状态。

    生成STM32CUBEMX

    用STM32CUBEMX生成例程,这里使用MCU为STM32C011F4P6。
    配置时钟树,配置时钟为48M。

    串口配置

    查看原理图,PA0和PA1设置为开发板的串口。

    配置串口,速率为115200。

    LED配置

    查看原理图,对应LED分别为PA4,PA5,PA6。

    配置如下所示。

    堆栈设置

    若无法正常运行需要修改优化等级。

    串口重定向

    打开魔术棒,勾选MicroLIB

    在main.c中,添加头文件,若不添加会出现 identifier “FILE” is undefined报错。

    /* USER CODE BEGIN Includes */
    #include "stdio.h"
    /* USER CODE END Includes */
    

    函数声明和串口重定向:

    /* 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 */
    

    主循环

      /* 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 */
    

    演示

    作者:记帖

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32C011开发(2)—-nBOOT_SEL设置

    发表回复