mcpField
S
stm32-baremetal

stm32-baremetal

github.com/mohitmishra786开发269374 次安装18 周前更新
代码仓库

关于 stm32-baremetal

为 Agent 提供使用 CMSIS 设备头文件和启动代码构建 STM32 裸机固件的指导,不依赖 STM32 HAL。内容涵盖时钟配置、外设寄存器访问、链接脚本和可复现构建。

主要功能

  1. 01仅用 CMSIS 的项目结构
  2. 02RCC 时钟配置
  3. 03外设寄存器访问
  4. 04链接脚本与闪存布局
  5. 05arm-none-eabi-gcc 构建设置

适用场景

  1. 01不依赖 Cube HAL 开始 STM32 固件开发
  2. 02将示例移植为寄存器级驱动
  3. 03排查时钟或闪存布局问题
  4. 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)
区域地址说明
Flash0x08000000启动时的向量表
SRAM10x20000000栈、堆、.data/.bss
CCM0x10000000仅限 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 无法工作,数据位于 CCMCCM 不在 AHB 矩阵通路上将 DMA 缓冲区放在 SRAM1

相关技能

  • skills/baremetal/baremetal-startup — 向量表和 .data/.bss
  • skills/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