一、GPIO是什么?
全称:General-purpose input/output(通用型输入输出)
操作要点:
1. 使能 GPIO 端口时钟。
2. 初始化 GPIO 目标引脚为推挽输出模式。
3. 编写简单测试程序,控制 GPIO 引脚输出高、低电平。
二、使用步骤
1.GPIO功能与模式
1.输入浮空 :输入模式施密特触发器打开及GPIO端口内部上下拉开关打开, 并且状态不确定。
2.输入上拉:输入模式施密特触发器打开及GPIO端口内部上拉开关关闭,默认为高电平。
3.输入下拉 :输入模式施密特触发器打开及GPIO端口内部下拉开关关闭,默认为低电平。
4.模拟输入 : 模拟输入施密特触发器关闭─,输入数据寄存器禁止,实现模拟信号采集。
5.开漏输出 : 开漏输出即在输出数据寄存器为‘0’时,控制NMOS打开,Pmos关闭,在数据寄存器为‘1时将端口置为高阻态,IO口状态由外部上下拉决定。
6.推挽输出 :POMS,NMOS均启用,输入数据寄存器输出‘1’时PMOS打开,为高电平状态,反之为低电平。
7. 推挽复用功能 :GPIO端口复用功能输出推挽。
8. 开漏复用功能:GPIO端口复用功能输出开漏。
2.寄存器操作
GPIOX_CRL –端口配置低寄存器 —设置输入输出模式及速度0-7 config register low
GPIOX_CRH–端口配置高寄存器—设置输入输出模式及速度8-15 config register hight
GPIOX_IDR–端口输入数据寄存器—低16位有效,读对应IO口状态 input date register
GPIOX_ODR–端口输出数据寄存器—低16位有效,写状态 output date register
GPIOX_BSRR–端口位设置/清除寄存器–操作ODR寄存器置1置0 bit set reset register
GPIOX_BRR–端口位清除寄存器–操作ODR寄存器置0 bit reset register
GPIOX_LCKR–端口配置锁定寄存器
存储器映像 GPIOA 起始地址 0x4001 0800 -0x4001 0BFF
#define GPIOA_CRL *(unsigned int*)(0x40010800+0x00) //强制类型转换先转换成指针
#define GPIOA_CRH *(unsigned int*)(0x40010800+0x04) //然后指针解引用,给对应寄存器赋值
#define GPIOA_IDR *(unsigned int*)(0x40010800+0x08) //地址位GPIOA基地址+偏移值
#define GPIOA_ODR *(unsigned int*)(0x40010800+0x0C)
#define GPIOA_BSRR *(unsigned int*)(0x40010800+0x10)
#define GPIOA_BRR *(unsigned int*)(0x40010800+0x14)
#define GPIOA_LCKR *(unsigned int*)(0x40010800+0x18)
gpio.c文件中为结构体类型
typedef struct
{
unsigned int CRL;
unsigned int CRH;
unsigned int IDR;
unsigned int ODR;
unsigned int BSRR;
unsigned int BRR;
unsigned int LCKR;
}GPIO_TypeDef;
#define GPIOA ((GPIO_TypeDef*)GPIOA_BASE) //强制类型转换为结构体指针类型,指向上边的结构体。
3.库函数操作
#include "led.h"
#include "stm32f10x.h" // Device header
void LED_init(void)
{
//1.创建结构体变量
GPIO_InitTypeDef led_init;
//2.使能APB2 GPIOB
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
//3.结构体配置
led_init.GPIO_Mode =GPIO_Mode_Out_PP;
led_init.GPIO_Pin=GPIO_Pin_5 ;
led_init.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOB, &led_init);
GPIO_SetBits(GPIOB,GPIO_Pin_5);
led_init.GPIO_Mode =GPIO_Mode_Out_PP;
led_init.GPIO_Pin=GPIO_Pin_5 ;
led_init.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOE, &led_init);
GPIO_SetBits(GPIOE,GPIO_Pin_5);
}
总结
GPIO是目前操作的第一个外设,通过库函数操作还是很简单的,步骤比较一致。
1.使能对应外设时钟
2.配置相关对应寄存器/结构体配置
3.初始换GPIO