STM32C011开发(2)----nBOOT_SEL设置

ops/2024/11/27 12:49:01/

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_93">配置 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_SELif (((OBInit.USERConfig & OB_USER_NBOOT_SEL) == OB_BOOT0_FROM_OB) != enable){// 解锁 Flashif (HAL_FLASH_Unlock() == HAL_OK){// 解锁 Option Bytesif (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 和 FlashHAL_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_233">生成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 */

演示

在这里插入图片描述


http://www.ppmy.cn/ops/137086.html

相关文章

mac maven编译出现问题

背景 进行maven install 命令,报错: [ERROR] COMPILATION ERROR : [INFO] ------------------------------------------------------------- [ERROR] No compiler is provided in this environment. Perhaps you are running on a JRE rather than a J…

【leetcode】动态规划

31. 873. 最长的斐波那契子序列的长度 题目&#xff1a; 如果序列 X_1, X_2, ..., X_n 满足下列条件&#xff0c;就说它是 斐波那契式 的&#xff1a; n > 3对于所有 i 2 < n&#xff0c;都有 X_i X_{i1} X_{i2} 给定一个严格递增的正整数数组形成序列 arr &#xff0…

Linux下通过DRM操作屏幕,发生行对齐 (stride)问题

前言 Linux下使用LVGL操作屏幕&#xff0c;屏幕尺寸是[280*1424]&#xff0c;不管如何设置LVGL的参数&#xff0c;屏幕的显示均为花屏&#xff0c;能看到有图像显示&#xff0c;但是图像是行错乱的。 ubuntu桌面系统显示正常 打印DRM看输出 drm: 280x1424 (0mm X 0mm) pixel …

OpenTK 实现三维空间模型仿真详解

文章目录 一、创建渲染窗口与初始化 OpenGL二、三维模型加载三、渲染管线搭建四、模型渲染与变换五、交互与事件处理一、创建渲染窗口与初始化 OpenGL 继承 GameWindow:   构建自定义类使其继承自 GameWindow,该类内部封装了诸多窗口管理以及渲染循环逻辑,为后续渲染工作…

Android触摸事件setOnTouchListener用法

1&#xff0c;首先需知道MotionEvent类一些参数特性 ACTION_DOWN: 表示用户开始触摸(在第一个点被按下时触发) ACTION_MOVE: 当有点在屏幕上移动时触发&#xff0c;注意的是&#xff0c;由于灵敏度很高&#xff0c;所以基本上只要有点在屏幕上&#xff0c;此事件就会不停地被触…

Ubuntu问题 -- Linux立即关机, 立即重启命令

立即关机 sudo shutdown -h now立即重启 sudo reboot

跨域相关的一些问题 ✅

当网页从一个源&#xff08;https://baidu.com&#xff09;请求另一个源&#xff08;如 https://taobao/api&#xff09;的资源时&#xff0c;就发生了跨域。由于安全原因&#xff08;防止恶意网站通过脚本访问用户在其他网站上的数据&#xff09;&#xff0c;浏览器对跨域请求…

Stable Diffusion中的自注意力替换技术与Diffusers实现

Stable Diffusion中的自注意力替换技术与Diffusers实现 文章目录 Stable Diffusion中的自注意力替换技术与Diffusers实现摘要Abstract一、机器学习部分1. 注意力计算2. SD中的自注意力替换3. 自注意力替换的应用4. 在 Diffusers 里实现自注意力替换4.1 AttentionProcessor4.2 实…