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

这段代码是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)
  • 14
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
设计思路: 心率检测仪的设计主要涉及到传感器信号采集、信号处理、数据显示等方面。本设计采用STM32F103C8T6微控制器作为主控芯片,通过AD8232心电信号放大器进行心电信号采集,采用滤波算法进行信号处理,最终将结果通过OLED显示屏进行显示。 硬件设计: 1. 采用AD8232心电信号放大器进行心电信号采集,放大器的输出信号通过低通滤波器进行滤波处理,滤波器截止频率为100Hz,去除高频噪声。 2. 采用STM32F103C8T6微控制器作为主控芯片,通过ADC模块对放大器输出信号进行模数转换,获取心率信号模拟值。 3. 采用OLED显示屏进行数据显示,显示屏分辨率为128*64,采用I2C总线进行数据传输。 软件设计: 1. 程序启动后,初始化ADC模块、I2C总线、OLED显示屏,并设置定时器中断,定时读取ADC模块采集的心率信号模拟值。 2. 通过滤波算法对采集到的心率信号模拟值进行滤波处理,去除高频噪声和干扰信号。 3. 根据滤波后的心率信号模拟值计算心率值,将结果通过OLED显示屏进行显示。 总结: 本设计基于STM32微控制器,采用AD8232心电信号放大器进行信号采集,通过滤波算法进行信号处理,将结果通过OLED显示屏进行显示,实现了心率检测仪的基本功能。在实际应用中,可以根据需要进行功能扩展,如增加蓝牙模块实现数据传输、增加存储器实现数据记录等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

openwin_top

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

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

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

打赏作者

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

抵扣说明:

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

余额充值