裸机开发 硬件上编程,没有操作系统或调度器的支持。代码直接控制硬件资源,按照严格顺序进行。效率高
优势:
1.直接控制硬件 获得最佳性能
2.低资源消耗 不需要额外调度器或操作系统 但可能含有简单的调度器
3.确定性执行 执行时间可以精准预测,每次运行结果相同
劣势:
1.复杂性 随功能增加,管理变得困难,
2.顺序执行 难以处理多任务和并发,一个任务阻塞会影响整个系统
3.响应延迟 紧急任务必须等待当前任务完成
调度器开发
调度器开发使用实时操作系统(RTOS)或任务调度器来管理多个任务执行。并且可以决定执行哪个任务,使并发任务管理变得简单。
优势
1.多任务支持 可以并发处理多个任务
2.优先级管理 重要任务可以先执行
3.资源管理 调度器可以共享资源,避免冲突
4.更好的扩展性 新功能可以作为独立任务添加,无需重构整个系统
劣势
1.额外开销 调度器本身消耗资源
2.增加复杂性 需要理解调度器机制、任务优先级和同步问题。
模板建立
一、时钟配置
时钟信号 一种周期变化的信号,用于同步系统操作和数据传输。常为方波,具有特定频率,决定系统运行速度。
作用 :
1.同步操作 同步微控制器内部各种操作。
2.确定运行速度 高时钟频率意味着更快的处理速度
3.驱动外设 如定时器,SPI等
为什么配置时钟?
系统稳定性:不同应用对系统时钟频率有不同要求。
性能优化
功耗管理
外设需求
配置步骤
一般选择外部时钟RCC
配置PLL
为什么选择HSE?
PLL通常选择HSE作为输入源,因为HSE提供了更高的频率精度、更广的频率范围和更好的稳定性,适合大多数高性能应用。而HSI则更多地用于启动阶段或低功耗场景,作为备用时钟源。选择HSE作为PLL的输入源,可以更好地满足系统对高精度和高性能的需求。
晶振配置看原理图的晶振
二、SYS配置
调试接口的选择与配置
一般选用串口调试(Serial Wire)
配置Serial Wire的目的是为了锁死两个引脚,否则无法直接烧录,需要手动拉低引脚才能正常烧录
三、工程配置
STM32开发 库的头文件保护
当屏蔽掉1、2、9、行时会出现
原因就是头文件出现了互相引用
在文件scheduler.h中引用了头文件mydefine.h,而在mydefine.h中又引用了scheduler.h。即出现了scheduler.h引用自身的情况。
为了防止出现该问题,使用头文件保护规则
头文件保护主要采用#ifndef
/#define
/#endif
组合的方式。
代码如下:
#ifndef __STM32_HAL_GPIO_H
#define __STM32_HAL_GPIO_H
// 头文件的内容,例如函数声明、宏定义等
#include "stm32f4xx_hal_def.h"
typedef enum {
GPIO_MODE_INPUT = 0x00,
GPIO_MODE_NEW = 0x01
} GPIOMode_TypeDef;
#endif /* __STM32_HAL_GPIO_H */
头文件保护的写法
-
在头文件的最开头,使用
#ifndef
来判断一个唯一的宏是否被定义。 -
如果未定义,则使用
#define
定义该宏。 -
在头文件的末尾,使用
#endif
结束条件编译。
规则
-
唯一性:宏名通常是唯一的,通常以双下划线开头,后跟库名或模块名,再加
_H
或类似的后缀。例如,__STM32_HAL_GPIO_H
。至于为什么要用两个下划线来定义宏名,主要是为了防止它与其他普通宏定义重复。例如,如果使用GPIO_PIN_0
来代替这个判断宏,可能会因为stm32f10x.h
已经定义了GPIO_PIN_0
,导致bsp_led.h
文件无效。 -
防止重复包含:当头文件第一次被包含时,宏未被定义,
#ifndef
判断为真,头文件内容被包含,同时宏被定义。当下一次包含该头文件时,宏已定义,#ifndef
判断为假,头文件内容将被跳过。 -
头文件内容的完整性:所有的头文件内容(包括其他头文件的包含、函数声明、宏定义等)都应该包含在
#ifndef
和#endif
之间。
烧录器推荐使用DAP