配置 STM32F103C8T6 最小系统板 PC13 寄存器点亮板载 LED 灯
本笔记的主要目的是 复习 Keil5 的基本使用 以及拾回本科电赛时的记忆。
基于寄存器进行编程的方式是不推荐的,因为寄存器太多了,编辑起来很麻烦,更多是用库函数的方式进行嵌入式开发的。
Keil5 的安装和破解就不叙述了。
目标


在电脑上创建工程文件夹
在电脑上找个地方创建一个 Keil5 工程文件夹,文件夹的名字表明这个项目的内容。
我创建为 stm32-light。

Keil5 创建工程
New μVision Project
点击 Project - New μVision Project 创建一个新工程:

INFO
我这里出现了乱码,其中的 ? 应是 μ。 乱码原因待深究。
工程文件命名为比较通用的 Project:

Select Device
然后是 Select Device 环节,选择 STM32F108C8:

Manage Run-Time Environment
之后弹出的 Manage Run-Time Environment 环节可以关掉跳过:

这样工程就建好了。
从官方库中添加必要文件
Keil5 / 本地 创建 Startup 文件夹
在 Keil5 工程 和 本地工程文件夹中都创建名为 Startup 的文件夹:

从官方标准外设库中添加所需文件
在 STM32F10x standard peripheral library - STMicroelectronics 下载官方标准外设库。
在官方固件库中,将如下路径的文件复制到本地 Startup 文件夹中,然后添加到 Keil5 工程的 Startup 文件夹:
\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\armstartup_stm32f10x_md.s
\Libraries\CMSIS\CM3\CoreSupportcore_cm3.ccore_cm3.h
\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10xstm32f10x.hsystem_stm32f10x.csystem_stm32f10x.h
每个文件的作用可以在每个文件的文档注释里看到。

设置头文件路径
点击魔术棒按钮 (Options for Target)

在 C/C++ - Include Paths 中添加 Startup 文件夹。

创建 main.c,编写配置寄存器代码
创建 User 文件夹,添加 main.c
在 Keil5 工程 和 本地工程文件夹中都创建名为 User 的文件夹,在 Keil5 的 User 里右键创建 main.c。注意路径 (Location) 选择本地的 User

main.c include 头文件
右键 - Insert '#include file' 来 include 头文件:

点击后得到:
#include "stm32f10x.h" // Device header编写 main 函数
TIP
Ctrl+鼠标滚轮可以放大/缩小编辑器文字大小。- 在
configuration中,可以
- 设置编码格式
Encoding为UTF-8 - 设置 C/C++ 文件的
Tab Size为4
- 设置编码格式
编写 main 代码如下:
int main(void){
RCC->APB2ENR = 0x00000010;
GPIOC->CRH = 0x00300000;
GPIOC->ODR = 0x00000000;
}寄存器配置说明
点亮LED灯原理
根据 STM32F103C8T6核心板原理图,要点亮 D2,需要将 PC13 置为低电平。

为了将 PC13 置为低电平,需要:
- 使能
GPIOC - 配置
PC13引脚模式为General purpose output push-pull、Output mode, max speed 50 MHz - 配置
PC13输出低电平
接下来的讲解要用到 STM32F10x 参考手册,在 ST官方的这个页面 可以下载。
使能 GPIOC
RCC->APB2ENR = 0x00000010;在官方手册的 7.3.7 APB2 peripheral clock enable register (RCC_APB2ENR) 章节中可以看到 RCC->APB2ENR 这一寄存器的 位4 (第5位) 用来使能 GPIOC 的时钟,设为 1 使能。

所以 0x00000010 表示二进制的 位4 置 1,使能 GPIOC 的时钟,使其有效。
| 进制 | ||
|---|---|---|
| 十六进制 0x | 0000 | 0010 |
| 二进制 0b | 0000 0000 0000 0000 | 0000 0000 0001 0000 |
配置 PC13 引脚的模式
GPIOC->CRH = 0x00300000;在官方手册的 9.2.2 Port configuration register high (GPIOx_CRH) (x=A..G) 章节中可以看到,GPIOx->CRH 这一寄存器的 位23 - 位20 是配置 GPIO13 的模式。
CNF13需要配置为00:General purpose output push-pull(通用推挽输出模式);MODE13需要配置为11:Output mode, max speed 50 MHz。
(至于为什么这样配置,见后续笔记。)

所以 GPIOC->CRH 配置为 0x00300000,表示 位23 - 位20 置为 0011B 。
| 进制 | ||
|---|---|---|
| 十六进制 0x | 0030 | 0000 |
| 二进制 0b | 0000 0000 0011 0000 | 0000 0000 0001 0000 |
配置 PC13 输出低电平
GPIOC->ODR = 0x00000000;在官方手册的 9.2.4 Port output data register (GPIOx_ODR) (x=A..G) 章节中可以看到,ODR13 这一位控制 GPIO13 的输出,写 0,GPIO13 就输出 0。

所以 GPIOC->ODR 配置为 0x00000000,表示将 ODR13 置 0。
| 进制 | ||
|---|---|---|
| 十六进制 0x | 0000 | 0000 |
| 二进制 0b | 0000 0000 0000 0000 | 0000 0000 0000 0000 |
使用 ST-LINK 烧录程序
连接 ST-LINK 和 STM32F103C8T6 最小系统板
分别将 ST-LINK 和 STM32F103C8T6最小系统板 的 SWCLK、SWDIO、GND、3.3V 通过母对母杜邦线连接在一起。

连接到电脑的 USB 口上后,ST-LINK 的蓝色的灯应该是常亮的,如果是闪烁状态很可能是没安装驱动,在 ST官方下载 ST-LINK 的驱动并安装即可。
选择 ST-LINK Debugger
点击魔术棒按钮 (Options for Target)

在 Debug 中选择 Use ST-Link Debugger

设置 Reset and Run
点击 Use ST-Link Debugger 旁边的 Settings,在 Flash Download 中勾选 Reset and Run,这样使用 ST-LINK 烧录程序后,不用每次都手动按一下 STM32 板子上的复位按键。

Build
点击 build 按钮进行编译

Build started: Project: Project
*** Using Compiler 'V5.06 update 6 (build 750)', folder: 'E:\Program Files\Keil_v5\ARM\ARMCC\Bin'
Build target 'Target 1'
".\Objects\Project.axf" - 0 Error(s), 0 Warning(s).
Build Time Elapsed: 00:00:00因缺少 ARM Complier Version 5 而编译失败
我在编译时,出现了很多错误和警告,原因是缺少了 ARM Complier Version 5

解决:KEIL5MDK最新版(3.37)安装以及旧编译器(V5)安装_keil5 mdk_二氧化碳的日常生活的博客-CSDN博客
Dwonload
编译完成后点击 Download 即可烧录程序。

Load "Y:\\repositories\\embeded\\keil5 projects\\stm32-light\\Objects\\Project.axf"
Erase Done.
Programming Done.
Verify OK.
Application running ...
Flash Load finished at 23:44:28点击 Download 出现闪退
我在点击 Download 时,Keil5 闪退
原因是新版的 Keil 加入了盗版下载器的校验机制
参考:keil5.38 debug配置STlink调试,软件闪退_keil5下载程序闪退_豪哥追求卓越的博客-CSDN博客
TIP: 使用 Micro-USB 进行烧录的方法
也可以不使用 ST-LINK,而是通过 Micro-USB-B + USB转TTL 使用串口烧录上位机软件,如 FlyMCU、STM32 Flash loader,将程序烧录到 STM32。
![]()
很多系统板板载 USB 转 CH340 电路,如正点原子的 STM32F103ZET6 最小系统板:

而我的这个最小系统板上没有 USB 转 TTL 芯片 (如 CH340、FTDI),所以需要外接 USB 转 TTL 模块。
对于我的这个 STM32F103C8T6,直接连接 Micro-USB 和电脑的 USB,只能起到供电作用。

使用 MicroUSB 烧录程序的过程就不演示了,可参考:
参考
- STM32入门教程-2023持续更新中_[2-2] 新建工程_哔哩哔哩_bilibili
- stm32f103xx Reference manual
- keil5.38 debug配置STlink调试,软件闪退_keil5下载程序闪退_豪哥追求卓越的博客-CSDN博客
- KEIL5MDK最新版(3.37)安装以及旧编译器(V5)安装_keil5 mdk_二氧化碳的日常生活的博客-CSDN博客
- FlyMcu - 用于STM32芯片ISP串口程序一键下载的免费软件_零号萌新的博客-CSDN博客
- USB hardware - Wikipedia
- STM32 —— USB 转 TTL(CH340)_ppqppl的博客-CSDN博客
- FlyMcu - 用于STM32芯片ISP串口程序一键下载的免费软件_零号萌新的博客-CSDN博客