1、什么是GPIO
GPIO是通用的输入输出端口的简介,是由软件可控制的引脚,STM32芯片的GPIO引脚可以和外部设备连接起来,实现和外部的通讯,控制和数据的采集。
2、结构图
保护二极管
如果连接的外部设备是高于3.3v(VDD)或者是低于0v(VSS)的电压时,保护二极管开始起作用,可以实现对电压的保护功能,高于3.3v时,电流会流向二极管,不会进入到芯片的内部。但是如果电流过大,则会烧坏二极管,进而烧坏芯片
GPIO输入
GPIO输出
推挽输出:(由两个三极管受两路互补的信号控制,总是在一个导通时另一个截止。有:开关效率高、电流大、驱动能力强的优点)当输出1时,P-MOS导通,N-MOS关闭,输出高电平(电流输出到负载,叫灌电流,理解为推)。 当输出0时,P-MOS关闭,N-MOS导通,输出低电平(负载电流流向芯片,叫拉电流,理解为挽)。
开漏输出:只能输出低电平,只能外接上拉电阻实现输出高电平。具有线与功能,一个为低,全部为低,多用于I2C和SMBUS总线。
3、寄存器映射点亮灯
#ifndef __STM32F10X_H
#define __STM32F10X_H
//外设的相关参数
//三条总线
//基地址
#define PERIPH_BASE ((unsigned int )0x40000000)
#define APB1PERIPH_BASE PERIPH_BASE
#define APB2PERIPH_BASE (PERIPH_BASE+0x10000)
#define AHBPERIPH_BASE (PERIPH_BASE+0x20000)
#define RCC_BASE (AHBPERIPH_BASE+0x1000)
#define GPIOE_BASE (APB2PERIPH_BASE+0x1800)
#define RCC_APB2ENR *(unsigned int *)(RCC_BASE+0x18)
#define GPIOE_CRL *(unsigned int *)(GPIOE_BASE+0x00)
#define GPIOE_ODR *(unsigned int *)(GPIOE_BASE+0x0C)
#endif
#include "stm32f10x.h"
void delay(unsigned int i)
{
for(;i>0;i--)
{
}
}
int main(void)
{
// *(unsigned int *)0x40021018 |= (1<<6);
//
// *(unsigned int *)0x40011800 &= ~(0x0F<<(5*4));
// *(unsigned int *)0x40011800 |= (3<<(5*4));
//
// while(1)
// {
// *(unsigned int *)0x4001180C |= (1<<5);
// delay(0xFFFFF);
// *(unsigned int *)0x4001180C &= ~(1<<5);
// delay(0xFFFFF);
// }
//打开时钟
RCC_APB2ENR |= (1<<6);
GPIOE_CRL &=~(0x0F<<(4*5));
GPIOE_CRL |= (3<<(5*4));
//GPIOE_ODR |= (1<<5);
while(1)
{
GPIOE_ODR |= (1<<5);
delay(0xFFFFF);
GPIOE_ODR &= ~(1<<5);
delay(0xFFFFF);
}
}
void SystemInit(void) //为了欺骗编译器
{
}