感谢:

STM32入门教程-2023版 细致讲解 中文字幕_哔哩哔哩_bilibili

工程模板

Keil的版本管理不可谓是不糟糕,我最开始配置时花了数小时,查找各种资料。比如,ARM Compiler要选择Use default compiler version 5。于是好不容易创建完成一个工程后,就将它作为模板,每次复制。

贴上我的工程模板的链接:

我用夸克网盘分享了「2-1 STM32工程模板」,点击链接即可保存。打开「夸克APP」,无需下载在线播放视频,畅享原画5倍速,支持电视投屏。 链接:https://pan.quark.cn/s/3bf93d33497d

其中keilkill.bat批处理文件用于删除编译工程产生的中间文件,可以减少工程大小,方便传输。

keilkill.bat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
del *.bak /s
del *.ddk /s
del *.edk /s
del *.lst /s
del *.lnp /s
del *.mpf /s
del *.mpj /s
del *.obj /s
del *.omf /s
::del *.opt /s ::不允许删除JLINK的设置
del *.plg /s
del *.rpt /s
del *.tmp /s
del *.__i /s
del *.crf /s
del *.o /s
del *.d /s
del *.axf /s
del *.tra /s
del *.dep /s
del JLinkLog.txt /s

del *.iex /s
del *.htm /s
del *.sct /s
del *.map /s
exit

查看函数定义

在上B站的这节课之前,我对所有语言的函数都是秉持“拿来就用”的原则,但在学习开发STM32时,我知道了查阅函数原型的重要性,我们很难记住所有的函数名、各种库定义的结构体等等。所幸,我们还可以右键Go To Definition或F12。

另外,我也给出了资料的夸克网盘链接:

解压密码为:32

我用夸克网盘分享了「模块资料.zip」,点击链接即可保存。打开「夸克APP」,无需下载在线播放视频,畅享原画5倍速,支持电视投屏。 链接:https://pan.quark.cn/s/8f511e70967e

我用夸克网盘分享了「参考文档.zip」,点击链接即可保存。打开「夸克APP」,无需下载在线播放视频,畅享原画5倍速,支持电视投屏。 链接:https://pan.quark.cn/s/99c20f1bc385

另外,这是课程的接线图:

我用夸克网盘分享了「接线图」,点击链接即可保存。打开「夸克APP」,无需下载在线播放视频,畅享原画5倍速,支持电视投屏。 链接:https://pan.quark.cn/s/2c21d83a25df

点亮LED

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "stm32f10x.h"                  // Device header
#include "Delay.h"

int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

while (1)
{
GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);
Delay_ms(500);
GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);
Delay_ms(500);
}
}

蜂鸣器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include "stm32f10x.h"                  // Device header
#include "Delay.h"

int main(void)
{
int i;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);

// 实现SOS
while (1)
{
for (i = 0; i < 3; i++)
{
GPIO_ResetBits(GPIOB, GPIO_Pin_8);
Delay_ms(150);
GPIO_SetBits(GPIOB, GPIO_Pin_8);
Delay_ms(150);
}
for (i = 0; i < 3; i++)
{
GPIO_ResetBits(GPIOB, GPIO_Pin_8);
Delay_ms(800);
GPIO_SetBits(GPIOB, GPIO_Pin_8);
Delay_ms(800);
}
for (i = 0; i < 3; i++)
{
GPIO_ResetBits(GPIOB, GPIO_Pin_8);
Delay_ms(150);
GPIO_SetBits(GPIOB, GPIO_Pin_8);
Delay_ms(150);
}
Delay_s(5);

}
}