STM32—跑马灯库函数实验


前言

回顾之前的GPIO基础知识,STM32F103一共有7组GPIO,每组GPIO含下面7个寄存器,也就是7个寄存器一共可以控制一组GPIO的16个IO口
在这里插入图片描述

一、硬件设计

本章用到的硬件只有 LED(DS0 和 DS1)。其电路在 ALIENTEK 精英 STM32F103 开发板
上默认是已经连接好了的。 DS0 接 PB5, DS1 接 PE5。是不需要自己接任何电路的,因此我们只需要编写代码即可。
在这里插入图片描述
在这里插入图片描述
设置推挽输出原因:可以输出强高低电平,控制LED灯亮灭。

二、软件设计

1.基于库函数代码编写

我们使用之前建立的STM32工程模板, 在该文件夹下面新建一个 HARDWARE 的文
件夹,用来存储以后与硬件相关的代码, 然后在 HARDWARE 文件夹下新建一个 LED 文件夹,
用来存放与 LED 相关的代码。

今后在进行别的外设开发时,也是基于该模板,在HARDWARE文件夹下新建新的文件夹,添加硬件相关代码,然后编写主函数,实现相关功能。
在这里插入图片描述
然后在LED文件夹下新建led.c、led.h文件。将其添加到工程之中,并且将头文件路径也添加到MDK。

led.c

#include "led.h"

void LED_Init(void)
{
    
    

	GPIO_InitTypeDef  GPIO_InitStructure;

 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);	 //使能PB、PE端口时钟
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;				 //LED0-->PB.5,端口配置
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
	GPIO_Init(GPIOB, &GPIO_InitStructure);					 //初始化GPIOB.5
	GPIO_SetBits(GPIOB,GPIO_Pin_5);						 //PB.5输出高电平

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;	    		 //LED1-->PE.5,端口配置
	GPIO_Init(GPIOE, &GPIO_InitStructure);	  				 //初始化GPIOE.5
	GPIO_SetBits(GPIOE,GPIO_Pin_5); 						 //PE.5输出高电平
}

这里需要说明的是,因为 GPIOB 和 GPIOE 的 IO 口的初始化参数都是设置在结构体变量
GPIO_InitStructure 中,因为两个 IO 口的模式和速度都一样,所以我们只用初始化一次,在
GPIOE.5 的初始化的时候就不需要再重复初始化速度和模式了。

led.h

#ifndef __LED_H
#define __LED_H
#include "sys.h"

void LED_Init(void);	//初始化

#endif

main.c

#include "led.h"
#include "sys.h"
#include "delay.h"
#include "usart.h"

int main(void)
{
    
     
 
	delay_init();		  //初始化延时函数
	LED_Init();		        //初始化LED端口
	while(1)
	{
    
    
			GPIO_ResetBits(GPIOB,GPIO_Pin_5);
			GPIO_SetBits(GPIOE,GPIO_Pin_5);
			delay_ms(300);
			GPIO_SetBits(GPIOB,GPIO_Pin_5);
			GPIO_ResetBits(GPIOE,GPIO_Pin_5);
			delay_ms(300); 
	}
} 

整个工程如下:
在这里插入图片描述

2.基于寄存器代码编写

前面学习GPIO的基本知识的时候已经知道,每一组GPIO的引脚控制都是通过7个寄存器进行的,因此,通过配置这7个寄存器就可以实现IO口的操作。

led.c

#include "led.h"

void LED_Init(void)
{
    
    
	RCC->APB2ENR|=1<<3;    // 使能GPIOB时钟
	RCC->APB2ENR|=1<<6;    //使能GPIOE时钟
	   	 
	GPIOB->CRL&=0XFF0FFFFF; 
	GPIOB->CRL|=0X00300000;//PB.5推挽输出、IO口速度50MHz
    GPIOB->ODR|=1<<5;      //PB.5输出高,灯灭
											  
	GPIOE->CRL&=0XFF0FFFFF;
	GPIOE->CRL|=0X00300000;//PE.5推挽输出、IO口速度50MHZ
	GPIOE->ODR|=1<<5;      //PE.5输出高,灯灭
}

led.h

#ifndef __LED_H
#define __LED_H
#include "sys.h"

void LED_Init(void);	//初始化

#endif

main.c

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"

int main(void)
{
    
     
 
	delay_init();
	LED_Init();	
	while(1)
	{
    
    
		GPIOB->BRR=GPIO_Pin_5;//LED0亮
	 	GPIOE->BSRR=GPIO_Pin_5;//LED1灭
		delay_ms(300);
    	GPIOB->BSRR=GPIO_Pin_5;//LED0灭
		GPIOE->BRR=GPIO_Pin_5;//LED1亮
		delay_ms(300);
	}
}

当然这里你也可以通过设置ODR寄存器来实现IO输出电平的控制,从而实现LED灯的亮灭。

猜你喜欢

转载自blog.csdn.net/little_rookie__/article/details/120568103