STM32外设之GPIO

  • Post author:
  • Post category:其他






一、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



版权声明:本文为orz13096968113原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。