Featured image of post STM32探险之旅 第1章 小灯控制

STM32探险之旅 第1章 小灯控制

STM32探险之旅-第1章-小灯控制

对应B站STM32课程1、2、3

一、STM32CubeIDE

由STM32的老东家ST公司推出的免费IDE平台。用自家的软件在自家的硬件上设计软件,贵如Apple也没有这个待遇哦!(用Win10开发Mac)

软件的下载安装均在官网操作即可,略过不表。值得注意的是该软件首次新建工程必须登录账号才能下载必要文件继续操作。

在软件界面,选项卡"File"→“New”→“STM32 Project"即可新建STM32工程。

image

在左侧输入芯片代号,右上角甚至可以直接下载到对应的数据手册

然后一路下一步就行。

完成之后,就能看到芯片图啦!

image

大屏幕的好处

二、初识GPIO

既然要点灯,首先我们要找到这块板子上LED的位置和电路图。如下图所示:

image

可以看到,LED0和1分别由PB5和PE5引脚控制。若是要小灯发光,也就是要让电路接通,只需要让对应的引脚电压为0,就能形成电流,小灯也就自然会亮起。于是这就引出了GPIO引脚的模式之一:推挽输出。

在IDE的.ico模块中,找到PB5引脚,点击并选择GPIO_OUT模式。再在左侧的"System Core"中进入"GPIO”,将"GPIO output level"改成"Low",即输出低电平,就能达到之前我们所说的目的。

image

在此页面保存,程序会自动生成main.c文件和相应的初始化代码。

三、程序的烧录

将自带的模拟器ST-LINK接到能接的地方(。。。),然后把Mini USB线连到电脑上,然后按下右上角蓝色的开关。

image

然后就可以烧录程序了!

image

左边那个小锤子是编译,右边那个播放是烧录运行程序!

按下运行按钮(记得选Enable Auto Build),稍等一会,观察板子上的小灯状况。

image

标注了R15的小灯成功亮起!

四、C语言程序控制硬件

到此为止,我们成功通过IDE点亮了小灯。若是要对小灯进行更复杂的操作,比如循环点亮熄灭,按键操作等,就需要用C语言编写程序让板子运行了。

在main.c文件中的main函数中的while(1)循环之内,就是我们目前编写自定义程序的位置之一。写在此处的程序会被板子无限循环地执行下去。

image

现在如果我们想让两个小灯闪出“动次打次”的律动,该怎么办呢?

首先,我们不妨想想4个拍子里小灯的操作。

image

一个简单的4/4拍节奏

既然每个拍子中小灯的亮/灭都是固定不变的,那么我们不妨建立一个state变量,在while(1)循环中对其进行1~4的循环操作,用switch(state)来对小灯进行亮灭的控制。

解决了思路问题,接下来就是实现了。我们需要HAL库函数来实现几个功能:

  • 1、小灯的亮灭,即GPIO引脚上的高低电平控制
image

GPIOx对应引脚所在的端口,GPIO_Pin为引脚名称,PinState为高低电平

为了方便和便于观察,我们在.ico文件中给用到的引脚右键起名。

image

最后控制PB5引脚的低电平的语句如下: image

标注了名称之后会自动定义端口,很方便。RESET对应低电平,SET对应高电平

  • 2、延迟一定的时间
image

单位:ms

最后我们的代码如下:

 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
int state = 1;
while (1)
{
/* USER CODE END WHILE */
    switch(state){
        case 1:
            HAL_GPIO_WritePin(RedLight_GPIO_Port, RedLight_Pin, GPIO_PIN_RESET);
            HAL_GPIO_WritePin(GreenLight_GPIO_Port, GreenLight_Pin, GPIO_PIN_SET);
            break;
        case 2:
            HAL_GPIO_WritePin(RedLight_GPIO_Port, RedLight_Pin, GPIO_PIN_SET);
            HAL_GPIO_WritePin(GreenLight_GPIO_Port, GreenLight_Pin, GPIO_PIN_RESET);
            break;
        case 3:
            HAL_GPIO_WritePin(RedLight_GPIO_Port, RedLight_Pin, GPIO_PIN_RESET);
            HAL_GPIO_WritePin(GreenLight_GPIO_Port, GreenLight_Pin, GPIO_PIN_RESET);
            break;
        case 4:
            HAL_GPIO_WritePin(RedLight_GPIO_Port, RedLight_Pin, GPIO_PIN_SET);
            HAL_GPIO_WritePin(GreenLight_GPIO_Port, GreenLight_Pin, GPIO_PIN_RESET);
            break;
    }
    HAL_Delay(400);
    
    state++;
    if(state==5){
        state = 1;
    }
    
/* USER CODE BEGIN 3 */
}

编译,烧录上机!

好耶!

结语

这期我们实现了GPIO的简单输出功能。那么下一次,就让我们通过板子上的按键使用GPIO的输入功能,控制小灯的亮灭吧!

(好像可以做个别踩白块)