这段代码是MicroPython在STM32微控制器上的启动逻辑的实现。它执行了一系列初始化步骤,配置了硬件,设置了中断,初始化了外设,最后进入了REPL(Read-Eval-Print Loop)模式或者执行了主脚本。
void stm32_main(uint32_t reset_mode) {
// 低级 MCU 初始化。
stm32_system_init();
#if !defined(STM32F0) && defined(MICROPY_HW_VTOR)
// 如果配置不同,更改 IRQ 向量表
SCB->VTOR = MICROPY_HW_VTOR;
#endif
#if __CORTEX_M != 33
// 根据 EABI 启用 8 字节堆栈对齐的 IRQ 处理程序
SCB->CCR |= SCB_CCR_STKALIGN_Msk;
#endif
// 为板子提供一个启动时运行代码的钩子,例如检查是否应该进入
// 引导程序而不是主应用程序。
MICROPY_BOARD_STARTUP();
// 启用缓存和预取缓冲区
#if defined(STM32F4)
#if INSTRUCTION_CACHE_ENABLE
// 启用指令缓存
__HAL_FLASH_INSTRUCTION_CACHE_ENABLE();
#endif
#if DATA_CACHE_ENABLE
// 启用数据缓存
__HAL_FLASH_DATA_CACHE_ENABLE();
#endif
#if PREFETCH_ENABLE
// 启用预取缓冲区
__HAL_FLASH_PREFETCH_BUFFER_ENABLE();
#endif
#elif defined(STM32F7) || defined(STM32H7)
#if ART_ACCCELERATOR_ENABLE
// 启用 ART 加速器
__HAL_FLASH_ART_ENABLE();
#endif
// 启用 I 缓存和 D 缓存
SCB_EnableICache();
SCB_EnableDCache();
#elif defined(STM32H5)
// 启用 I 缓存
HAL_ICACHE_Enable();
#elif defined(STM32L4)
#if !INSTRUCTION_CACHE_ENABLE
// 禁用指令缓存
__HAL_FLASH_INSTRUCTION_CACHE_DISABLE();
#endif
#if !DATA_CACHE_ENABLE
// 禁用数据缓存
__HAL_FLASH_DATA_CACHE_DISABLE();
#endif
#if PREFETCH_ENABLE
// 启用预取缓冲区
__HAL_FLASH_PREFETCH_BUFFER_ENABLE();
#endif
#endif
mpu_init();
#if __CORTEX_M >= 0x03
// 设置优先级分组
NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
#endif
// SysTick 由 HAL_RCC_ClockConfig(在 SystemClock_Config 中调用)需要
HAL_InitTick(TICK_INT_PRIORITY);
// 将系统时钟设置为 HSE
SystemClock_Config();
#if defined(STM32F4) || defined(STM32F7)
#if defined(__HAL_RCC_DTCMRAMEN_CLK_ENABLE)
// STM32F746 并没有真正的 CCM 内存,但它有 DTCM,
// 其行为或多或少类似于普通 SRAM。
__HAL_RCC_DTCMRAMEN_CLK_ENABLE();
#elif defined(CCMDATARAM_BASE)
// 启用 CCM RAM
__HAL_RCC_CCMDATARAMEN_CLK_ENABLE();
#endif
#elif defined(STM32H7A3xx) || defined(STM32H7A3xxQ) || defined(STM32H7B3xx) || defined(STM32H7B3xxQ)
// 启用 SRAM 时钟。
__HAL_RCC_SRDSRAM_CLK_ENABLE();
#elif defined(STM32H7)
// 启用 D2 SRAM1/2/3 时钟。
__HAL_RCC_D2SRAM1_CLK_ENABLE();
__HAL_RCC_D2SRAM2_CLK_ENABLE();
#if defined(__HAL_RCC_D2SRAM3_CLK_ENABLE)
// 启用 D2 SRAM3 时钟。
__HAL_RCC_D2SRAM3_CLK_ENABLE();
#endif
#endif
MICROPY_BOARD_EARLY_INIT();
// 基础子系统初始化
#if defined(STM32H5)