Lesson of Cubeide

📚 目录(点击跳转)

Lesson 1:模块化编程好习惯 —— 使用 BSP 分层结构管理外设驱动

📁 推荐文件结构


ProjectRoot/
├── Core/                  # 主函数和系统文件
├── Drivers/
│   └── BSP/              # 外设驱动模块(Board Support Package)
│       └── LED/          # 单独为LED建立一个子文件夹
│           ├── led.c     # 实现LED控制函数
│           └── led.h     # 声明LED相关函数、宏等
└── ...

编程建议

  • 每个外设(如 LED、按键、蜂鸣器)都单独建一个文件夹并实现对应 .c/.h 文件。
  • 所有与外设相关的初始化和控制函数都封装到 BSP 层。
  • 将公用的宏定义、引脚定义等写在 main.h 中,由 led.h 等驱动头文件引用。

示例说明

  • led.c 负责实现 LED_Init()LED_On()LED_Off() 等函数。
  • led.h 中引入 main.h,以访问 GPIO 引脚定义:
    #include "main.h"
    
    

Lesson 2:使用宏定义简化外设控制逻辑

宏定义控制 LED 示例(位于 led.h

#define LED0(x)  x?\
      HAL_GPIO_WritePin(GPIO_PORT_X, GPIO_PIN_X, GPIO_RESET):\
      HAL_GPIO_WritePin(GPIO_PORT_X, GPIO_PIN_X, GPIO_SET)

编写宏的注意事项

  • 使用 \ 实现宏的多行换行,增强可读性。
  • 不要在宏定义最后加分号,否则调用宏时容易出错。
  • 使用时可以像函数一样调用,例如:LED0(1);

引用 main.h 的必要性

  • 宏中调用了 GPIO 端口和引脚的定义,而这些常常是在 main.h 中定义的。

  • 因此必须在 led.h 中添加:

    #include "main.h"
    

如何在主函数中使用

  1. main.c 文件顶部添加:

    #include "led.h"
    
  2. MX_GPIO_Init() 后调用:

    LED0(1); // 点亮 LED
    

以下是整理后的 .md 格式文档,内容条理清晰,便于复制使用,可用于嵌入项目文档或团队知识库中:


  • 注意事项:

    • 宏定义 结尾 不要加分号
    • 使用 \ 实现多行换行。
    • LED0(x) 通过判断 x 控制 LED 开关。
  • 如果 LED 使用了 GPIO_PORT_X 等引脚宏,则需在 led.h 中添加:

    #include "main.h"
    

    因为 main.h 中包含了引脚定义。

  • main.c 中使用 LED 宏前,需包含头文件:

    #include "led.h"
    

    并配置头文件路径到项目属性中。


Lesson 3:快速复用上次的 .ioc 文件配置

  • 操作流程:

    1. 拷贝原有工程文件到新目录。

    2. 修改 .ioc 文件名为新工程名(保持一致性)。

    3. 删除以下内容以避免编译冲突:

      • .launch 文件夹
      • Debug/ 文件夹
    4. 重新在 STM32CubeIDE 中打开 .ioc 文件,自动生成新工程配置。


Lesson 4:移植 MDK 工程至 STM32CubeIDE

  • 步骤说明:

    • 复制 MDK 中的 引脚定义相关代码(如 GPIO_Pin, Port, 定义宏 等)。
    • 不要复制 初始化函数,因为 CubeIDE 会根据 .ioc 文件自动生成初始化代码。
    • 所复制的函数、变量需在对应的 .h 头文件中进行声明。

Lesson 5:外部中断与优先级管理

  • 中断响应有优先级之分,注意和系统滴答定时器(SysTick)冲突。

  • HAL_Delay() 使用的是 SysTick,其默认优先级是 15(最低)。

    • 若在中断中使用 HAL_Delay(),而该中断优先级高于 SysTick,会导致系统卡死在延时函数。
  • 建议:

    • 尽量避免在中断中使用 HAL_Delay()
    • 若确实需要延时,可考虑设置 SysTick 的中断优先级更高,或者采用非阻塞计时机制。
  • 中断处理函数设计建议:

    • 中断内代码越短越好,不做耗时任务。
    • 把处理任务推到主循环或用信号量中转。
posted @ 2025-07-03 23:13  无敌烤肉大王  阅读(17)  评论(0)    收藏  举报