MicroPython在STM32微控制器上的启动逻辑的实现

本文详细介绍了MicroPython在STM32微控制器上的启动过程,涉及硬件初始化、中断向量表设置、栈对齐、缓存启用、MPU初始化、优先级分组配置、时钟设置、外设初始化、REPL或主脚本执行以及软重启逻辑。启动逻辑高度可配置,通过板级支持包实现平台定制。同时,文中提到了IoT库、量子计算、机器学习算法、网络端口管理、树结构、字典树、神经网络、Kivy库、Elasticsearch和Python的装饰器模式等技术。
摘要由CSDN通过智能技术生成

这段代码是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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

openwin_top

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值