💽前言
本文为一份简单入门笔记,以 stm32 单片机为例。
**声明:**由于笔者不是专业人员,仅作为入门初学者,因此本文避免不了的有专业性错误,请自行甄别。
完全以一位纯应用型软件工程师的角度进行学习和思考。
嵌入式软件还是遵循软件的本质:基于下层的支持为上层提供应用服务。
只是我们目前互联网上的大多数软件是基于操作系统或者虚拟机或解释器等等基础。
而单片机是直接操作硬件,是直接基于硬件提供的功能。
💽软件框架
**声明:**本文以软件架构分析为核心。
📀工具环境
关键和工具不是本文重点。
基于 STM32CubeMX 图形化配置硬件。
使用 Keil 进行软件开发。
📀模板工程
使用 CubeMX 生成的框架架构
工程名:20240824
- .ioc & .mxproject
- CubeMX 工程文件
- Core
- 硬件信息生成的代码框架
- 特别注意
system_stm32f4xx.c
在 Keil 中是显示在 Drivers 文件夹中- Drivers
- 具体对应硬件的驱动代码
- CMSIS
- 基于硬件芯片原厂架构的文件(基于芯片的最底层)
- STM32 xxx
- 基于 CMSIS 的二次开发
- 一般属于暴露给用户开发的接口- MDK-ARM
- .uvprojx & .uvoptx
- 对用 Keil 的工程文件
startup_stm32f407xx .s
- 默认配置的汇编文件
C:.
│ .mxproject
│ 20240824.ioc
│
├─Core
│ ├─Inc
│ │ gpio.h
│ │ main.h
│ │ stm32f4xx_hal_conf.h
│ │ stm32f4xx_it.h
│ │
│ └─Src
│ gpio.c
│ main.c
│ stm32f4xx_hal_msp.c
│ stm32f4xx_it.c
│ system_stm32f4xx.c
│
├─Drivers
│ ├─CMSIS
│ │ ├─Core
│ │ ├─Core_A
│ │ ├─DAP
│ │ ├─Device
│ │ ├─Documentation
│ │ ├─DSP
│ │ ├─Include
│ │ ├─NN
│ │ ├─RTOS
│ │ └─RTOS2
│ │ LICENSE.txt
│ └─STM32F4xx_HAL_Driver
│
└─MDK-ARM
20240824.uvoptx
20240824.uvprojx
startup_stm32f407xx.s
📀编译后
在编译后会在 MDK-ARM
文件夹下生成编译的中间文件:
其中 20240824 是项目名。其中同名文件夹下的是最核心的中间文件,其中包含可烧文件。
C:.
│ 20240824.uvguix.windows
│ 20240824.uvoptx
│ 20240824.uvprojx
│ startup_stm32f407xx.lst
│ startup_stm32f407xx.s
│
├─20240824
│
├─DebugConfig
│
└─RTE
可烧入文件
axf:包含数据,地址,代码,debug调试等信息,可以用下载器直接烧到板子上
hex:包含数据,地址信息
bin:包含数据(最终都是转到bin)
因此一般文件大小为
.bin < .hex < .axf
📀Code
注意:由于是使用 CubeMX
生成的,因此可能后续会有硬件的修改,因此 CubeMX
会在代码中注入注释表示。
即在下面形式的代码区间内编写代码才不会被下次重新生成框架代码所移除。
/* USER CODE BEGIN Includes */
// 自己的代码
/* USER CODE END Includes */
但由于本文是初学的学习笔记,因此本篇文章中展示的内容无视该规则。
main
下面是 main 的主题逻辑,核心就是 初始化-服务轮询
架构。
int main