GPIO口(可编程IO)
一、GPIO口概念
GPIO是通用输入/输出端口的简称。可以实现输出(驱动外部电路)、输入(检测外来信号)以及模拟一些通信接口通信协议功能,是单片机和外界进行数据交换的必要窗口。GPIO和外界进行都是通过TTL数字电平(高电平或低电平)来进行数据交换的,高电平表示数字“1”,低电平表示数字“0”。
二、单片机内部系统框图
STM32数据手册
STM32 中文参考手册.pdf GPIO 章节位于:第8章 框图位于105页
I/O端口位的基本结构
三、编程思路:
1、 看原理图:GPIO与设备连接情况;
2、看数据手册 所处时钟总线;
3、固件库手册
(1)寄存器编程(难度系数高、了解一款芯片 举一反三)
(2)库函数编程ST(难度系数小、出现问题找问题比较麻烦、容易上手)
四、编程
1、 开启时钟
展开:RCC库函数 RCC_APB2PeriphClockCmd 使能或者失能 APB2 外设时钟
函数原型: void RCC_APB2PeriphClockCmd(u32 RCC_APB2Periph,FunctionalStateNewState)
参数1:
RCC_AHB2Periph | 描述 |
---|---|
RCC_APB2Periph_AFIO | 功能复用 IO 时钟 |
RCC_APB2Periph_GPIOA | GPIOA 时钟 |
RCC_APB2Periph_GPIOB | GPIOB 时钟 |
RCC_APB2Periph_GPIOC | GPIOC 时钟 |
RCC_APB2Periph_GPIOD | GPIOD 时钟 |
RCC_APB2Periph_GPIOE | GPIOE 时钟 |
RCC_APB2Periph_ADC1 | ADC1 时钟 |
RCC_APB2Periph_ADC2 | ADC2 时钟 |
RCC_APB2Periph_TIM1 | TIM1 时钟 |
RCC_APB2Periph_SPI1 | SPI1 时钟 |
RCC_APB2Periph_USART1 | USART1 时钟 |
RCC_APB2Periph_ALL | 全部 APB2 外设时钟 |
输入参数2: 这个参数可以取: ENABLE 或者 DISABLE
以PB5为例: RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
2、初始化GPIO口:
展开GPIO库函数
GPIO_Init 根据 GPIO_InitStruct 中指定的参数初始化外设 GPIOx 寄存器
函数原型:
函数原形 void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
输入参数 1 GPIOx: x 可以是 A, B, C, D 或者 E,来选择 GPIO外设
输入参数2:
typedef struct
{
u16 GPIO_Pin; //管脚
GPIOSpeed_TypeDef GPIO_Speed; //输出速率
GPIOMode_TypeDef GPIO_Mode; //模式
} GPIO_InitTypeDef;
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct. GPIO_Pin = GPIO_Pin_5;
GPIO_InitStruct. GPIO_Speed= GPIO_Speed_50MHz;
GPIO_InitStruct. GPIO_Mode = GPIO_Mode_Out_PP;
以PB5举例:GPIO_Init(GPIOB,& GPIO_InitStruct);
3、程序编写示例:
led.c
#include "led.h"
/**************************
*函 +数 名:void LED_Gpio_Init(void)
*函数功能:LED灯连接管脚初始化
*参 数:无
*返 回 值:无
***************************/
void LED_Gpio_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
/*开启时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);
/*配置管脚 PB5*/
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB,&GPIO_InitStruct);
/*配置管脚 PE5*/
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
GPIO_Init(GPIOE,&GPIO_InitStruct);
/*配置管脚 PA5PA6*/
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6;
GPIO_Init(GPIOA,&GPIO_InitStruct);
/*初始化之后不亮*/
LED1_OFF;
LED2_OFF;
LED3_OFF;
LED4_OFF;
}
led.h
#ifndef _LED_ //如果没有定义 防止重复定义
#define _LED_ //定义
//头文件
#include "stm32f10x.h"
//函数声明
void beep_init(void);
//宏定义
#define BEEP_ON GPIO_ResetBits( GPIOB,GPIO_Pin_8)
#define BEEP_OFF GPIO_SetBits(GPIOB,GPIO_Pin_8)
#endif