单片机
返回首页

STM32实验一:GPIO之流水灯

2019-10-19 来源:eefocus

前面写过一篇关于STM32单片机的GPIO的文章,本来是打着从实用角度来做的实验,但是发现不积跬步无以至千里啊,咱们从头开始,先做一个最简单的,入门级的,单片机系统中的hello world,流水灯实验!


我手中有一个神舟3的开发板,我就用这个板子来做实验,板子中的实验一共用到4个LED灯来做流水灯的实验,这里我们也用这4个灯,他们分别是GPIOF中的6、7、8、9这4个。


1、首先我们复制我们之前做过的模板工程到一个新建文件夹中,(如,你可以取个名字叫流水灯实验的文件夹)神舟开发板的例程中在项目中添加了两个文件,分别是led.c和led.h,这是一种习惯,每做一个项目的时候都在其中添加一个.c和对应的.h文件,这样可以是工程看起来更加规整!本来我是不想添加这个的,这里为了良好的编程习惯,我们也添加一个!并且我更改了模板文件中的一些名字,在下图中我将标志出来



2、接下来我们来看一下程序,程序一共分为两部分,一个main.c,一个led.c,因为程序比较简单,所以在led.h中我们就不做任何定义了,这也省去了一些麻烦!按照习惯,我们先从main程序看起!


#include 'stm32f10x.h'

#include 'led.h'

void LED_config(void);//使用函数前先进行函数声明

 

/*******************************************************

                                                      

* 函数名称: delay

*     输入: 无

*     输出: 无

* 功能描述: 延时函数                          

                                                      

*******************************************************/

 

void delay(vu32 nCount)

{

  for(; nCount != 0; nCount--);

}

 

/*******************************************************

                                                      

* 函数名称: main

*     输入: 无

*     输出: 无

* 功能描述: 主函数                         

                                                      

*******************************************************/

 

int main(void)

{

  LED_config(); //调用4个LED灯初始化函数

 

  while(1)

  {

GPIO_ResetBits(GPIOF,GPIO_Pin_6);//第一灯亮

 

delay(800000); //延时

 

GPIO_SetBits(GPIOF,GPIO_Pin_6); //第一灯灭

 

delay(800000); //延时

 

GPIO_ResetBits(GPIOF,GPIO_Pin_7); //第二灯亮

 

delay(800000); //延时

 

GPIO_SetBits(GPIOF,GPIO_Pin_7); //第二灯灭

 

delay(800000); //延时

 

GPIO_ResetBits(GPIOF,GPIO_Pin_8); //第三灯亮

 

delay(800000); //延时

 

GPIO_SetBits(GPIOF,GPIO_Pin_8); //第三灯灭

delay(800000); //延时

 

GPIO_ResetBits(GPIOF,GPIO_Pin_9); //第四灯亮

 

delay(800000); //延时

 

GPIO_SetBits(GPIOF,GPIO_Pin_9); //第四灯灭

 

delay(800000); //延时

  }

}


分析一下程序,LED_config();这个函数是调用了led.c中的函数,一会会贴出led.c文件,GPIO_ResetBits、

GPIO_SetBits这两个函数是库文件为我们提供的GPIO操作函数,我们贴出来看一下


void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

{

  /* Check the parameters */

  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));

  assert_param(IS_GPIO_PIN(GPIO_Pin));

  

  GPIOx->BRR = GPIO_Pin;

}

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

{

  /* Check the parameters */

  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));

  assert_param(IS_GPIO_PIN(GPIO_Pin));

  

  GPIOx->BSRR = GPIO_Pin;

}

这两个函数的作用就是将端口置1或者清0

我们再来看一下led.c文件


void LED_config(void)

{

GPIO_InitTypeDef  GPIO_InitStructure;

 

/* 配置神舟III号LED灯使用的GPIO管脚模式*/

 

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE); /*使能LED灯使用的GPIO时钟*/

 

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9; 

 

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出模式

 

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  

  GPIO_Init(GPIOF, &GPIO_InitStructure);  /*神州III号使用的LED灯相关的GPIO口初始化*/

}

这里主要就是GPIO的配置,前面我们也说过,一共3个步奏,

1)、使能GPIOD的时钟


2)、填充GPIO的属性结构体


3)、传递参数至初始化函数


这里要注意,我们将管脚模式配置为推挽输出模式,这个需要注意一下,因为之后的实验中我们还会给关键配置成其他的模式


程序编写完毕,编译下载到实验板中完成实验!

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • CCD图像传感器在微光电视系统中的应用

  • 光控音效发生器电路

  • 如何利用ESP8266制作一个简单的四轴飞行器

  • 非常简单的150W功放电路图

  • 一个简单的警笛电路图

  • 如何使用LED驱动器LM3915制作振动计

    相关电子头条文章