前言
回顾之前的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);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_5);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_SetBits(GPIOE,GPIO_Pin_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();
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;
RCC->APB2ENR|=1<<6;
GPIOB->CRL&=0XFF0FFFFF;
GPIOB->CRL|=0X00300000;
GPIOB->ODR|=1<<5;
GPIOE->CRL&=0XFF0FFFFF;
GPIOE->CRL|=0X00300000;
GPIOE->ODR|=1<<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;
GPIOE->BSRR=GPIO_Pin_5;
delay_ms(300);
GPIOB->BSRR=GPIO_Pin_5;
GPIOE->BRR=GPIO_Pin_5;
delay_ms(300);
}
}
当然这里你也可以通过设置ODR寄存器来实现IO输出电平的控制,从而实现LED灯的亮灭。
|