实验一:点亮一个灯泡,并实现灯泡闪烁

创建文件

任务需求代码编写

开时钟

初始化接口

对引脚进行操作实现闪烁功能

向工程中添加功能模块

实验二:流水灯实验

SPL标准库开发实际上是一种很简单的方式,夸张一点说,甚至可以不用敲一行代码,具体SPL开发我们会用实验一来演示如何利用SPL库来进行开发。

实验一:点亮一个灯泡,并实现灯泡闪烁

创建文件

STM32单片机学习(2)——新建标准工程库工程这篇文章中我们已经创建了一个模板,而且在网盘中也有准备两个脚本,我们可以直接创建一个新文件夹,然后把文件复制过来,运行两个脚本

在这里看到我的工程名字依旧是模板,keilkill是删除程序运行时产生的中间文件,project_init就是初始化程序。运行之后就会自动打开程序,并且更改文件名

打开工程文件(.uvprojx),然后可以看到目录是我们模板都已经配置好的,然后我们现在就可以分析需求了。我们的目的是点亮一个灯泡,并实现闪烁。在板子上的PC13接口上它内置了一个指示灯,那么我们就先选择点亮他并实现闪烁。

任务需求

  1. 点亮PC13接口的指示灯
  2. 实现PC13接口的指示灯闪烁(间隔建议在100ms)

代码编写

我们先梳理思路:

  1. 开对应接口时钟
  2. 初始化接口
  3. 操作引脚

开时钟

我们之前的文章讲到了负责时钟管理的叫RCC, GPIOC在APB2外设总线上,知道这些就足够了,我们只需要在代码中输入一个时钟的英文clock,如下图所示我们就找到了与我们需求相关的时钟操作那么又该怎么使用这个函数呢?

1 RCC_APB2PeriphClockCmd()

我们只需要把鼠标放在上面,右键然后点击go to definition就可以看到它的源代码了,如果你是第一次创建,可能会go to 不了,甚至都不会有代码补全提示,是因为keil5还没有加载过文件,所以不知道都有什么,只需要先编译一下就可以了,不需要管是不是可以编译通过,目的只是为了让keil5加载整个工程文件。

go to之后可以看到该函数的定义了,而且注释很好的解释了,应该怎么传参,我两个箭头分别表示两个参数应该传什么。我们要打开GPIOC的时钟,第一个参数就应该是RCC_APB2Periph_GPIOC, 第二个参数是描述时钟状态,应该是打开即ENABLE

初始化接口

打开完时钟,那么我们就该初始化接口了。既然是初始化,就应该与Init相关,我们输入一下,找一找有没有与我们相关的

输入之后,还是可以找到一个GPIO初始化,这就是我们需要的,那么之后参数怎么填呢,还是老样子go to一下。

我们看到第一个参数GPIOx因该是引脚,后边参数应该是一个结构体,我们可以go to 一下看一看是什么样的结构体

从名字上我们可以看到一共三个成员,第一个应该是引脚号,第二个是速度,第三个是模式。

具体我们同样可以goto去查看,但是一些具体的只是还没有学习,我们就直接确定速度选最大,模式选推挽输出模式,引脚号是13。具体可以看以下两张图

所以我们就需要先初始化一个结构体,然后再把结构体传输个GOIO_Init()函数。

对引脚进行操作

初始化完成后,我们可以通过GPIO_SetBits(GPIOX, GPIO_Pin);GPIO_ResetBits(GPIOX, GPIO_Pin);

来控制输入高低电平。

实现闪烁功能

实现闪烁的化就需要我们开关交替执行,我们可以用一个for循环来消耗时间,但是这样会显得呆呆的,网盘里边有一个函数模块,里边的Delay可以帮助我们实现延时的操作。把里面的两个文件加入到工程中

向工程中添加功能模块

首先我们先再工程目录下创建一个文件夹tools,然后把两个文件复制进去,随后我们打开keil5,然后点击这个品字的图标,然后按如下步骤操作

这里需要注意点击add之后,是没有任何提示的,所以你只需要点一次就好了,右侧显示了文件就是已经添加了

添加完成点击ok就可以了

添加完成后左侧的会多出一个tools文件夹包含着刚才的文件,我们只需要引入头文件即可

然后就可以调用函数来实现闪烁功能了,然后编译,没有报错就可以用ST-LINK烧录到单片机里边运行了。

实验二:流水灯实验

流水灯需要更多的引脚,所以这次我们选择GPIOA,我选在用A0 、A2、A4、A6 4个引脚来实现。上面演示过的内容不再重复显示了。我们可以依次初始化四次,然后逐个实现输入高电平和低电平,但是这样显然不是很方便,太麻烦了,所以我们想一下,可不可以一下初始化四个引脚呢,当然是可以的。

我们看到它的定义,不难发现一共16个引脚,实际上就是16位的数据每一位对应一个引脚所以,如果我们要用四个引脚做输出,初始化的时候只需要把四个引脚进行或操作就可以了,同时我们要实现流水灯的话,也不需要挨个输出,只需要进行移位操作就可以了,所以新的代码就是:

```c

#include "stm32f10x.h"
#include "../tools/Delay.h"
int main(void){
        // 开时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
        // 初始化引脚
        GPIO_InitTypeDef GPIO_InitStruct;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_2 | GPIO_Pin_4 |GPIO_Pin_6;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
        GPIO_Init(GPIOA, &GPIO_InitStruct);
    
        // 操作引脚
        uint16_t Pin_x = GPIO_Pin_0;
    

    while(1){
            if(Pin_x > GPIO_Pin_6) Pin_x = GPIO_Pin_0;
            // 输出高电平
            GPIO_SetBits(GPIOA, Pin_x);
            // 延时200毫秒
            Delay_Ms(200);
            // 输出低电平
            GPIO_ResetBits(GPIOA, Pin_x);
            // 下一个引脚
            Pin_x = Pin_x << 2;
        }
    
}
```

ok这样我们就实现了一个流水灯了

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐