关于 stm32-baremetal
为 Agent 提供使用 CMSIS 设备头文件和启动代码构建 STM32 裸机固件的指导,不依赖 STM32 HAL。内容涵盖时钟配置、外设寄存器访问、链接脚本和可复现构建。
主要功能
- 01仅用 CMSIS 的项目结构
- 02RCC 时钟配置
- 03外设寄存器访问
- 04链接脚本与闪存布局
- 05arm-none-eabi-gcc 构建设置
适用场景
- 01不依赖 Cube HAL 开始 STM32 固件开发
- 02将示例移植为寄存器级驱动
- 03排查时钟或闪存布局问题
- 04在 RTOS 前学习 STM32 寄存器
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mohitmishra786/ low-level-dev-skills --skill stm32-baremetal安装后在 Claude Code 中输入/stm32-baremetal确认已加载。
详细介绍
STM32 裸机开发(CMSIS,无 HAL)
目的
指导 Agent 使用 CMSIS 设备头文件和启动代码,构建精简的 STM32 裸机项目,不使用 STM32 HAL;内容涵盖时钟设置、链接脚本集成、外设寄存器访问,以及适用于 STM32F/G/H/L 系列的可复现构建布局。
适用场景
- 在不依赖 Cube HAL 的情况下启动 STM32 固件开发
- 将厂商示例移植为寄存器级驱动
- 与
skills/baremetal/baremetal-startup和skills/embedded/linker-scripts集成 - 调试 STM32 时钟或 Flash 放置问题
- 在使用 RTOS 或 Zephyr 之前学习 STM32 寄存器级开发
工作流
1. 最精简的项目布局
stm32-bare/
├── startup_stm32f407xx.s # vector table + Reset_Handler
├── system_stm32f4xx.c # SystemInit(), SystemCoreClockUpdate()
├── stm32f407xx.h # CMSIS (from ST pack or copy)
├── linker.ld # FLASH/RAM regions
├── main.c
└── Makefile
使用 CMSIS-Core(core_cm4.h)和 ST CMSIS pack 或开源 pack 中的设备头文件(例如 stm32-cmsis-device-f4)。
2. 时钟配置(RCC)
STM32 在使用高速外设之前,需要显式设置 HSE/HSI 和 PLL:
/* system_stm32f4xx.c — simplified PLL from 8 MHz HSE */
void SystemInit(void)
{
RCC->CR |= RCC_CR_HSEON;
while (!(RCC->CR & RCC_CR_HSERDY)) {}
RCC->PLLCFGR = RCC_PLLCFGR_PLLSRC_HSE | (8 << 0) | (336 << 6) | (0 << 16) | (7 << 24);
RCC->CFGR |= RCC_CFGR_PPRE1_DIV2 | RCC_CFGR_PPRE2_DIV1 | RCC_CFGR_HPRE_DIV1;
RCC->CR |= RCC_CR_PLLON;
while (!(RCC->CR & RCC_CR_PLLRDY)) {}
FLASH->ACR = FLASH_ACR_LATENCY_5WS;
RCC->CFGR |= RCC_CFGR_SW_PLL;
while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL) {}
SystemCoreClockUpdate();
}
务必根据参考手册中的表格,使 FLASH_ACR 等待状态与电压范围和 SYSCLK 匹配。
3. MMIO 操作前启用外设时钟
#define RCC_AHB1ENR_GPIOAEN (1U << 0)
static inline void gpioa_clock_enable(void)
{
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
(void)RCC->AHB1ENR; /* AHB read-after-write — required on STM32 */
}
4. 构建标志(arm-none-eabi-gcc)
MCU = -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard
CFLAGS = $(MCU) -Wall -Wextra -ffunction-sections -fdata-sections -g3
LDFLAGS = $(MCU) -T linker.ld -Wl,--gc-sections -specs=nano.specs -lc -lm -lnosys
5. Flash 映射(典型 F4)
| 区域 | 地址 | 说明 |
|---|---|---|
| Flash | 0x08000000 | 启动时的向量表 |
| SRAM1 | 0x20000000 | 栈、堆、.data/.bss |
| CCM | 0x10000000 | 仅限 F4——并非所有主设备都能通过 DMA 访问 |
引导加载程序应用通常链接到 0x08010000,并在入口处设置 SCB->VTOR = 0x08010000。
6. QEMU 说明
QEMU STM32 机器(stm32vldiscovery、netduinoplus2 等)使用的 MCU 与 F407 不同,且不支持 GPIO/DMA/I2C,详见 QEMU STM32 文档。使用 skills/qemu/qemu-embedded-simulation 进行仿真;F4 固件需在硬件上验证。
7. Agent 用法
/stm32-baremetal Scaffold CMSIS-only STM32F407 project with USART2 printf
常见问题
| 症状 | 原因 | 修复方法 |
|---|---|---|
卡在 SystemInit | 未安装 HSE / PLL 配置错误 | 初始启动时使用 HSI;检查晶振 |
| 外设无响应 | RCC 时钟门控已关闭 | 启用 AHB/APB 位;读取 RCC 寄存器确认 |
| 启动时发生 HardFault | 栈位于错误的区域 / VTOR 设置错误 | 检查 linker.ld 中的 _estack |
| 波特率错误 | SystemCoreClock 过期 | PLL 配置后调用 SystemCoreClockUpdate() |
| DMA 无法工作,数据位于 CCM | CCM 不在 AHB 矩阵通路上 | 将 DMA 缓冲区放在 SRAM1 |
相关技能
skills/baremetal/baremetal-startup— 向量表和.data/.bssskills/baremetal/mmio-and-bit-manipulation— 寄存器访问模式skills/baremetal/bootloaders-embedded— 应用偏移和 VTOR 重定位skills/embedded/linker-scripts— FLASH/RAM MEMORY 块skills/embedded/openocd-jtag— 通过 ST-Link 烧录和使用 GDB
评论
支持 Markdown