【STM32-野火】---学习笔记---三.使用寄存器点亮LED灯

GPIO跟引脚有什么区别?

GPIO包含在引脚中。而引脚中不仅有GPIO,还有VCC、GND等引脚。

如何查找每一个GPIO的功能说明?

对于STM32来说:《STM32F103xCED 英文数据手册》 -> 《3 Pinouts and pin describeptions》 -> 《Table 5.High-density STM32F103xx pin definitions 》中查找。

1 GPIO功能框图

请添加图片描述

  • 第一部分:保护二极管。

    • 引脚的两个保护二级管可以防止引脚外部过高或过低的电压输入,当引脚电压高于 VDD 时,上方的二极管导通,当引脚电压低于 VSS 时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁。
    • 如果引脚电压大于VDD很多的话,就会烧坏芯片。如果直接接电机的话,在驱动电机的时候反向电动势会直接击穿芯片,需要一个驱动电路进行隔离。
  • 第二部分:推挽输出。

    • 由GPIOx_CRL与GPIOx_CRH控制,每四位控制一个GPIO。
    • 推挽输出模式输出高电平为3.3V(由VDD决定),低电平为0V(由VSS决定)。
    • 推挽输出优点:开关效率效率高,电流大,驱动能力强。
    • 开漏模式只能输出低电平(由内部电路提供),不能输出高电平。要输出高电平只能通过外部的电路:通过上拉电阻接到电源中。开漏模式输出高电平时的电压由外部的上拉电源决定。
    • 开漏输出具有“线与”功能,一个为低,全部为低,多用于I2C和SMBUS总线。
  • 第三部分:输出数据寄存器 (ODR)。

    • 通过修改输出数据寄存器的值可以修改 GPIO 引脚的输出电平。
    • “置位/复位寄存器GPIOx_BSRR”可以通过修改输出数据寄存器的值从而影响电路的输出。
  • 第四部分:复用功能输出。

    • 复用”是指 STM32 的其它片上外设对 GPIO 引脚进行控制,此时 GPIO 引脚用作该外设功能的一部分,算是第二用途。从其它外设引出来的“复用功能输出信号”与 GPIO本身的数据据寄存器都连接到双 MOS 管结构的输入中,通过图中的梯形结构作为开关切换选择。
  • 第五部分:输出数据寄存器(IDR)。

    • 看 GPIO 结构框图的上半部分, GPIO 引脚经过内部的上、下拉电阻,可以配置成上/下拉输入,然后再连接到施密特触发器,信号经过触发器后,模拟信号转化为 0、 1 的数字信号,然后存储在“输入数据寄存器 GPIOx_IDR”中,通过读取该寄存器就可以了解 GPIO 引脚的电平状态。
  • 第六部分:复用功能输入。

    • 与“复用功能输出”模式类似,在“复用功能输入模式”时, GPIO 引脚的信号传输到 STM32 其它片上外设,由该外设读取引脚状态。
  • 第七部分:模拟输入。

    • 当 GPIO 引脚用于 ADC 采集电压的输入通道时,用作“模拟输入”功能,此时信号是不经过施密特触发器的,因为经过施密特触发器后信号只有 0、 1 两种状态,所以 ADC 外设要采集到原始的模拟信号,信号源输入必须在施密特触发器之前。
    • 类似地,当 GPIO 引脚用于 DAC 作为模拟电压输出通道时,此时作为“模拟输出”功能, DAC 的模拟信号输出就不经过双 MOS 管结构,模拟信号直接输出到引脚。

在固件库中,GPIO总共有8种工作模式,大致可以分为以下三类:

  • 1.输入模式 (模拟/浮空/上拉/下拉)

    • 在输入模式时,施密特触发器打开,输出被禁止,可通过输入数据寄存器 GPIOx_IDR 读取 I/O 状态。其中输入模式,可设置为上拉、下拉、浮空和模拟输入四种。
    • 上拉和下拉输入很好理解,默认的电平由上拉或者下拉决定。
    • 浮空输入的电平是不确定的,完全由外部的输入决定,一般接按键的时候用的是这个模式。
    • 模拟输入则用于 ADC 采集。
  • 2.输出模式 (模拟/浮空/上拉/下拉)

    • 在输出模式中,推挽模式时双 MOS 管以轮流方式工作,输出数据寄存器 GPIOx_ODR 可控制 I/O输出高低电平。
    • 开漏模式时,只有 N-MOS 管工作,输出数据寄存器可控制 I/O 输出高阻态或低电平。输出速度(即 I/O 支持的高低电平状态最高切换频率,支持的频率越高,功耗越大,如果功耗要求不严格,把速度设置成最大即可)可配置,有 2MHz、10MHz、50MHz 的选项。
    • 在输出模式时施密特触发器是打开的,即输入可用,通过输入数据寄存器 GPIOx_IDR 可读取 I/O的实际状态。
  • 3.复用功能 (推挽/开漏)

    • 复用功能模式中,输出使能,输出速度可配置,可工作在开漏及推挽模式,但是输出信号源于其它外设,输出数据寄存器 GPIOx_ODR 无效;输入可用,通过输入数据寄存器可获取 I/O 实际状态,但一般直接用外设的寄存器来获取该数据信号。
    • 通过对 GPIO 寄存器写入不同的参数,就可以改变 GPIO 的工作模式,要了解具体寄存器时一定要查阅《STM32F10X-中文参考手册》中对应外设的寄存器说明。
    • 在 GPIO 外设中,控制端口高低控制寄存器 CRH 和 CRL 可以配置每个 GPIO 的工作模式和工作的速度,每 4 位控制一个 IO, CRH 控制端口的高八位, CRL 控制端口的低 8 位,具体的看 CRH 和 CRL 的寄存器描述。

2 寄存器映射代码

GPIO输出初始化顺序:

  • 1.选定具体的GPIO。
  • 2.配置GPIO的工作模式(CRL与CRH寄存器)。
  • 3.控制GPIO输出高低电平(ODR、BRR与BSRR)。
#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 GPIOB_BASE					(APB2PERIPH_BASE + 0x0C00)

#define RCC_APB2ENR					*(unsigned int*)(RCC_BASE + 0x18)
#define GPIOB_CRL						*(unsigned int*)(GPIOB_BASE + 0x00)
#define GPIOB_CRH						*(unsigned int*)(GPIOB_BASE + 0x04)
#define GPIOB_ODR						*(unsigned int*)(GPIOB_BASE + 0x0C)

void delay(void)
{
	int x, y;
	for(x = 1100; x>0; x--)
	{
		for(y = 1000; y>0; y--);
	}
}
	

int main(void)
{
// 配置时钟
	RCC_APB2ENR |= (1<<3);
	
	// 配置IO口输出模式 
	GPIOB_CRL |= (1<<4); // PB1 Blue
	GPIOB_CRL &= ~(1<<7);
	
	GPIOB_CRL |= (1<<0); // PB0 Green
	GPIOB_CRL &= ~(1<<2);
	
	GPIOB_CRL |= (1<<20); // PB5 Red
	GPIOB_CRL &= ~(1<<22);
	
	GPIOB_ODR |= (1<<1);
	GPIOB_ODR |= (1<<5);
	GPIOB_ODR |= (1<<0);
	
	
	// 配置GPIOB ODR
	while(1)
	{
		GPIOB_ODR &= ~(1<<1); // PB1 = 0
		delay();
		GPIOB_ODR |= (1<<1);
		delay();
	
		GPIOB_ODR &= ~(1<<0); // PB0 = 0
		delay();
		GPIOB_ODR |= (1<<0);
		delay();
	
		GPIOB_ODR &= ~(1<<5); // PB5 = 0
		delay();
		GPIOB_ODR |= (1<<5);
		delay();
	}
}

void SystemInit(void)
{
	// 函数体为空,目的是为了骗过编译器不报错
}
  • 对于基地址采用强制转换方便进行偏移操作,对于具体的寄存器采用” * “取值方便进行赋值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值