最近有幸能接触到单片机开发的相关知识,特写下此文来总结鄙人关于单片机开发的一些浅薄知识。
本文使用的硬件是以 STM32F103C8T6
为主控芯片的开发版。
STM32F103C8T6 开发板
环境准备
一般来说,作为烧录的方案有 Keil uVision5
(以下简称 uVision
) 或 具有 ARM
功能的 GDB
+ Open OCD
可供选择,本文将按照前者进行讲解,若要学习后者,可以参阅 Rust 嵌入式开发的环境配置。本文主要使用 C
作为开发语言,笔者正在学习基于 Rust
的嵌入式开发,欢迎评论区交流与讨论。
不过,鉴于 uVision
相当不先进的开发环境,因此推荐使用 Visual Studio Code
+ Keil Assistant
的开发环境,仅在调试或构建时使用 uVision
。
安装与配置各项驱动依赖的步骤,请阅读相应软件文档或指南,此处不再赘述。
创建新项目
创建新项目需要使用 uVision
,启动,创建一个新项目: Project
-> New uVision Project
,选择相对应的芯片组,完成创建。
随后,打开 Manage Project Items
菜单,为 Groups
添加这几项: main
, functions
, headers
, packages
。接下来,手动为项目添加相对应的文件夹。由此,项目的结构大概如下所示:
Project
├─ main // 存放项目主入口
├─ functions // 存放函数实现
├─ headers // 存放数据定义与模板
├─ packages // 存放依赖库
└─ Project.uvprojx // 项目主配置
新建一个文件 main.c
在 main
下,然后把它添加到最右侧的文件栏。之后,每次添加新的项目文件,都必须以同样的步骤添加,否则 uVision
在编译时会忽略没有引用的文件。
打开 Configure target options
,调整这些选项:
Target
Code Generation
- ARM Compiler:
Use default compiler version 6
- ARM Compiler:
Output
Create HEX file
: √
C/C++ (AC6)
Preprocessor Symbols
- Define:
STM32F10x_MD,USE_STDPERIPH_DRIVER
- Define:
- Include Paths:
HAL 依赖库路径
Debug
- Use:
选择你的烧录器
- Use:
保存这些设定,测试成功后,即完成了项目初始化。
开发的思路
要开发单片机,技术手册、原理图和 API 列表都是不可缺少的。
首先,要先对一个问题的解决有大概的实现思路。接着,确定需要的相应组件,阅读原理图,了解其电气特性(如工作时需要什么种类的电平等),并为它在开发板上分配资源(如针脚位置)。分配位置时,必须要根据技术手册中规定的符合要求的针脚来分配。如果一个设备需要 PWM 来进行控制,那么为它分配的针脚必须要是一个有效的 TIM
引脚,才能输出 PWM 波形。撰写程序时,也需要根据依赖包提供的 API 列表中的函数等资源来编写。
开发中遇到的一些问题
不要 在任何中断函数内使用任何阻塞性操作,这会导致程序运行异常。
必须 让一个器件的全部连线都具有同样的电压源,你必须要让电源和数据接线都使用一个来源的输出,否则设备可能工作异常。这是因为这些器件都使用相对电压,即 5V
的定义是相对于大地的零电势定义的,但你的输入可能并不是 5V
,这时如果两个方面的输入不等,设备的操作就会出现异常。