STM32F103C8T6 + Keil5 学习笔记
从建工程到点灯、流水灯、定时器中断
这份笔记不是为了“背代码”,而是为了搞清楚:
STM32 到底是怎么一步一步把一个引脚控制起来的。
先从最简单的点灯开始,再 过渡到流水灯,最后用定时器中断来控制灯的变化。
1. 先讲整体思路
刚接触 STM32 的时候,很容易有这种感觉:
- 工程一大堆文件,看不懂
- 一堆寄存器名字,像天书
- 点个灯还要先开时钟、配模式
GPIOC->CRH、RCC->APB2ENR这些写法很陌生
其实别急,STM32 的套路很固定:
STM32 控制外设,基本就三步
-
先开时钟
没有时钟,这个外设就像没供电,根本不会工作。 -
再配模式
告诉引脚:你现在是输入、输出、复用,还是模拟功能。 -
最后读写寄存器
比如输出高电平、低电平,或者读取按键状态。
只要这三个步骤想明白了,后面 GPIO、定时器、串口,思路其实都差不多。
2. Keil5 创建 STM32 工程
2.1 新建工程
打开 Keil5,依次点击:
Project -> New uVision Project...
然后新建一个文件夹,比如:
STM32_LED
工程名可以随便起,比如:
LED_Project
2.2 选择芯片
Keil 会弹出芯片选择窗口,在搜索框输入:
STM32F103C8
选择:
STMicroelectronics -> STM32F103C8Tx
然后点确定。
3. 认识 RTE 窗口
工程建好后,有时候会弹出 RTE 窗口。
RTE 的全称是:
Run-Time Environment
你可以把它理解成:
给工程选择“现成组件”的地方。
比如:
- 启动文件
- CMSIS 核心支持
- 设备相关支持
- 驱动组件
3.1 这个窗口里几个常见栏目什么意思
Software Component
表示“可选的软件组件”。
比如:
CMSIS Device Startup Driver
它们就是工程里要用到的基础模块。
Variant
表示“变体”。
同一个功能,可能有不同实现版本,比如:
标准库版本 HAL 版本 某个厂商定制版本
Vendor
表示提供这个组件的厂商。
比如:
STMicroelectronics ARM Keil
3.2 点灯工程一般要选什么
做最基础的 STM32 工程时,通常只要最核心的部分:
CMSIS -> CORE
Device -> Startup
如果你不太确定怎么选,可以直接点左下角的:
Resolve
Keil 常常会自动帮你补全依赖项。
3.3 工程里会自动出现什么文件
配置完以后,左侧工程栏一般会看到类似文件:
startup_stm32f10x.s
system_stm32f10x.c
这两个文件很关键。
startup_stm32f10x.s 是什么
这是启动汇编文件,主要负责:
- 初始化堆栈
- 设置中断向量表
- 跳转到 main() 函数
你可以把它理解成:
芯片上电后,先跑的一段“开机引导程序”
system_stm32f10x.c
这个文件主要负责:
- 系统时钟初始化
- SystemInit() 的相关配置
你可以把它理解成:
给芯片整个运行环境做底层准备
4. 新建 main.c
工程框架有了以后,还要自己写程序逻辑。
建立工程直接跳过,就在Source Group 1里边自己整一个main.c就行
5.先理解:点灯到底在做什么
STM32 的“点灯”,本质上不是一句“让灯亮”那么简单,而是先把那个引脚变成输出模式,再给它一个电平。
以 PC13 为例,点亮板载 LED 的步骤一般是:
- 打开 GPIOC 时钟
- 把 PC13 配成输出
- 输出高电平或低电平