【STM32开发之寄存器版】(一)-GPIO

一、前言

STM32的GPIO(通用输入输出)是STM32微控制器中用于连接和控制外部设备的重要功能。为了从底层探究其工作原理,本文将基于寄存器对STM32进行GPIO功能的开发。本文涉及到的硬件设备和实验目标如下:

  • 硬件设备:正点原子STM32F103ZET6精英板
  • 实验目标:实现LED0(PB5)和LED1(PE5)的流水灯效果

二、GPIO的八种工作模式

STM32的IO口可以由软件配置成如下8种工作模式:

IO口工作模式应用场景
输入浮空输入捕获、串口RX、SPI_SCK的从模式等
输入上拉OTG、外部中断输入
输入下拉某些使能情况
模拟输入ADC
推挽输出LED、继电器等
开漏输出/
复用功能推挽输出输出比较、互补输出、串口TX
复用功能开漏输出I2C_SCL、I2C_SDA

三、寄存器介绍

3.1 控制GPIO的寄存器

STM32的每个IO口都可以自由编程,但IO口寄存器必须要按32位字被访问,STM32的每个IO端口都有7个寄存器来控制,如下表所示:

寄存器功能
GPIOx_CRL (x=A..E)端口配置低寄存器
GPIOx_CRH (x=A..E)端口配置高寄存器
GPIOx_IDR (x=A..E)端口输入数据寄存器
GPIOx_ODR (x=A..E)端口输出数据寄存器
GPIOx_BSRR (x=A..E)端口位设置/清除寄存器
GPIOx_BRR (x=A..E)端口位清除寄存器
GPIOx_LCKR (x=A..E)端口配置锁定寄存器

其中,最常用的4个寄存器是CRL、CRH、IDR、ODR。

3.1.1 STM32的IO口配置

STM32的IO口位配置表如下所示:

在流水灯的输出模式下,MODE[1:0]可以控制最大输出速度:

3.1.2 CRL/CRH寄存器

《STM32中文参考手册》对CRL寄存器的描述如下:

CRL控制每个并口的低8位(相应的,CRH控制每个并口的高八位)。每个独立的IO由4个位控制,高两位为CNF寄存器,用来区别配置模式,低两位为MODE寄存器,用来控制最大输出速度。 

若将某一位输出端口设置为50MHz推挽输出,则该位的CRL寄存器应设置为0X3(即0011)

对CRH的寄存器配置同理。

3.1.3 IDR寄存器

《STM32中文参考手册》对IDR寄存器的描述如下:

IDR寄存器为只读寄存器,且只能以字(16位)的形式读出,读出的值为对应I/O口的状态。由于流水灯位IO输出实验,故用不到IDR寄存器。

3.1.4 ODR寄存器

《STM32中文参考手册》对ORD寄存器的描述如下:

ODR寄存器为可读可写寄存器,且只能以字(16位)的形式读出。本次实验可以通过ODR寄存器实现LED灯的翻转效果。 

3.2 时钟使能寄存器

本文使用到的PB5和PE5分别归属在GPIOB和GPIOE外设下,GPIOB和GPIOE的外设时钟使能是通过RCC下的AHB2外设时钟使能寄存器RCC_AHBENR寄存器设置的。《STM32中文参考手册》对RCC_AHB2ENR寄存器的描述如下:

 通过将位6和为3置1可以实现GPIOB和GPIOE的时钟使能。

四、硬件分析

LED0和LED1的硬件原理图如下所示:

当LED0和LED1为1时关灯;当LED0和LED1为0时开灯。

五、程序撰写

5.1 HARDWARE/led.c

该文件主要实现led的初始化:使能时钟、配置GPIO的工作模式并给予IO口默认电平。

#include "led.h"

void LED_Init(void)
{
	RCC->APB2ENR|=1<<3;    //使能PORTB时钟	   	 
	RCC->APB2ENR|=1<<6;    //使能PORTE时钟	
	   	 
	GPIOB->CRL&=0XFF0FFFFF; 
	GPIOB->CRL|=0X00300000;//PB.5 推挽输出   	 
    GPIOB->ODR|=1<<5;      //PB.5 输出高
											  
	GPIOE->CRL&=0XFF0FFFFF;
	GPIOE->CRL|=0X00300000;//PE.5推挽输出
	GPIOE->ODR|=1<<5;      //PE.5输出高 
}

5.2 HARDWARE/led.h

该文件主要通过宏定义调用Pxout(y)函数。

#ifndef __LED_H
#define __LED_H	 
#include "sys.h"

//LED端口定义
#define LED0 PBout(5)	// DS0
#define LED1 PEout(5)	// DS1	

void LED_Init(void);	//初始化		 				    
#endif

5.3 USER/test.c

该文件主要实现流水灯的主功能。

#include "sys.h"
#include "usart.h"		
#include "delay.h"	
#include "led.h"

int main(void)
{				  
	Stm32_Clock_Init(9);//系统时钟设置
	delay_init(72);	  	//延时初始化
	LED_Init();		  	//初始化与LED连接的硬件接口
	while(1)
	{
		LED0=0;
		LED1=1;
		delay_ms(300);
		LED0=1;
		LED1=0;
		delay_ms(300);
	}	 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值