分析
首先看原理图
![](https://img.haomeiwen.com/i3076443/a7b21b55efb3d5e3.png)
从上图我们可以知道LED灯的两个IO接口分别是PB0与PB1,
#ifndef __LED_H
#define __LED_H //条件编译,防止重复引用
#include "sys.h"
// 设置宏定义的好处是易于阅读,做项目的时候更好理解每个接口是干嘛的
/*根据原理图定义IO接口*/
#define IO_LEDPORT GPIOB
#define IO_LED1OUT GPIO_Pin_0
#define IO_LED2OUT GPIO_Pin_1
/*定义和LED灯相关函数*/
void LED_Init(void); //初始化
void LED1(u8 a);
void LED2(u8 a);
#endif
接下来看led.c,通过查阅手册来获得GPIO_Init(),GPIO_SetBits()
的相关用法。
#include "led.h"
//LED灯的接口初始化
void LED_Init(void){
GPIO_InitTypeDef GPIO_InitStructure;//定义一个GPIO_InitTypeDef类型的结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);// 使能GPIOB的外设时钟,
GPIO_InitStructure.GPIO_Pin = IO_LED1OUT | IO_LED2OUT; //配置要操作的端口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //选择IO接口工作方式,因为需要点亮LED灯,所以是输出模式,且推挽输出大电流点亮LED
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置IO接口速度(2/10/50MHz)
GPIO_Init(IO_LEDPORT, &GPIO_InitStructure);//将上述参数写入寄存器,进行初始化
GPIO_ResetBits(IO_LEDPORT,IO_LED1OUT|IO_LED2OUT); //LED灯都为低电平(0) 初始为关灯
}
void LED1(u8 a){ //LED灯控制 参数为0灯灭
if(a)GPIO_SetBits(IO_LEDPORT,IO_LED1OUT);
else GPIO_ResetBits(IO_LEDPORT,IO_LED1OUT);
}
void LED2(u8 a){ //LED灯控制 参数为0灯灭
if(a)GPIO_SetBits(IO_LEDPORT,IO_LED2OUT);
else GPIO_ResetBits(IO_LEDPORT,IO_LED2OUT);
}
/*
选择IO接口工作方式:
GPIO_Mode_AIN 模拟输入
GPIO_Mode_IN_FLOATING 浮空输入
GPIO_Mode_IPD 下拉输入
GPIO_Mode_IPU 上拉输入
GPIO_Mode_Out_PP 推挽输出
GPIO_Mode_Out_OD 开漏输出
GPIO_Mode_AF_PP 复用推挽输出
GPIO_Mode_AF_OD 复用开漏输出
*/
我们转到stm32f10x_gpio.h这个文件查看这个嵌套结构体的定义
typedef struct
{
uint16_t GPIO_Pin; //指定要配置的引脚
GPIOSpeed_TypeDef GPIO_Speed; //指定引脚输出的最高频率
GPIOMode_TypeDef GPIO_Mode; //指定引脚的工作模式
}GPIO_InitTypeDef;
结论
在使用和操作GPIO的时候,大概分为如下几个流程:
- 根据电路原理图宏定义引脚,便于以后的开发
- 开启外设时钟
- 定义结构体,设置端口的相关属性
- 利用
GPIO_Init()
函数来将上述的配置写入寄存器
网友评论