STM32学习3—GPIO口的配置

一、认识GPIO
通用输入输出口的简称,是控制引脚,可与外部设备连接起来,实现与外部的通讯、控制、数据传输等。
STM32F103VET6 型号的芯片有 GPIOA、GPIOB、GPIOC 至 GPIOE 共 5 组 GPIO,每组16个引脚。每个I/O口可设置为8种模式,每个I/O口由7个寄存器控制(配置模式的端口配置寄存器CRL和CRH(模式、速度);数据寄存器IDR和ODR;置位/复位寄存器BSRR;复位寄存器BRR;锁存寄存器LCKR)。
二、GPIO的8种工作模式
分为三类:
1、输入模式(禁止输出,通过GPIOx——IDR读取I/O状态。)
模拟输入:用于ADC采集,或低功耗下省电
浮空输入:输入电平不确定,由外部输入决定,接按键时用此模式。
上拉输入:默认电平上拉
下拉输入:默认电平下拉
2、输出模式
推挽输出:连接数字器件,输出高低电平
开漏输出:不连接外部上拉电阻输出低电平;连接外部上拉电阻可输出高低电平
3、复用功能(可用其他片上外设控制GPIO引脚,作为外设的一部分,第二功能)
复用推挽输出、复用开漏输出
三、GPIO口配置步骤
1、使能PORTx(x=A~E)
1开启,0关闭
2、配置I/O口模式(具体配置参考资料,此处不列出)
端口配置低寄存器GPIOx_CRL(x=A~E),控制低8位(4bit为一组,控制一个I/O)
端口配置低寄存器GPIOx_CRH(x=A~E),控制高8位
3、配置端输入和输出电平
端口输入数据寄存器GPIOx_IDR (x=A~E)
端口输出数据寄存器GPIOx_ODR (x=A~E) 只可置1,不可写0,可用BSRR清除
4、配置相关寄存器
端口位设置/清除寄存器GPIOx_BSRR (x=A~E)
端口位清除寄存器GPIOx_BRR(x=A~E)
以上具体看数据手册
四、以点亮LED灯做例
简单实现流水灯
创建bsp_led.c文件,编写GPIO初始化函数以及其他函数。编写bsp_led.h文件,进行GPIO口宏定义,和函数声明。
#include “bsp_led.h”
1、bsp_led.c中

#include "bsp_led.h"
//GPIO初始化
void LED_GPIO_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;	
	RCC_APB2PeriphClockCmd(LED_R_GPIO_CLK|LED_G_GPIO_CLK|LED_B_GPIO_CLK, ENABLE);
	
	GPIO_InitStructure.GPIO_Pin=LED_R_GPIO_Pin;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(LED_R_GPIO_PORT, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin=LED_G_GPIO_Pin;
	GPIO_Init(LED_G_GPIO_PORT, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin=LED_B_GPIO_Pin;
	GPIO_Init(LED_B_GPIO_PORT, &GPIO_InitStructure);
	
	GPIO_SetBits(LED_R_GPIO_PORT, LED_G_GPIO_Pin);
	GPIO_SetBits(LED_G_GPIO_PORT, LED_G_GPIO_Pin);
	GPIO_SetBits(LED_B_GPIO_PORT, LED_G_GPIO_Pin);
}

2、bsp_led.h中

#ifndef __BSP_LED_H
#define __BSP_LED_H

#include "stm32f10x.h"

#define LED_R_GPIO_PORT   GPIOB
#define LED_R_GPIO_Pin    GPIO_Pin_5
#define LED_R_GPIO_CLK    RCC_APB2Periph_GPIOB

#define LED_G_GPIO_PORT   GPIOB
#define LED_G_GPIO_Pin    GPIO_Pin_0
#define LED_G_GPIO_CLK    RCC_APB2Periph_GPIOB

#define LED_B_GPIO_PORT   GPIOB
#define LED_B_GPIO_Pin    GPIO_Pin_1
#define LED_B_GPIO_CLK    RCC_APB2Periph_GPIOB

#define LED_R_OFF  (GPIO_SetBits(LED_R_GPIO_PORT, LED_R_GPIO_Pin))
#define LED_R_ON (GPIO_ResetBits(LED_R_GPIO_PORT, LED_R_GPIO_Pin))

#define LED_G_OFF  (GPIO_SetBits(LED_G_GPIO_PORT, LED_G_GPIO_Pin))
#define LED_G_ON (GPIO_ResetBits(LED_G_GPIO_PORT, LED_G_GPIO_Pin))

#define LED_B_OFF (GPIO_SetBits(LED_B_GPIO_PORT, LED_B_GPIO_Pin))
#define LED_B_ON (GPIO_ResetBits(LED_B_GPIO_PORT, LED_B_GPIO_Pin))

#define LED_Red       LED_R_ON;LED_G_OFF;LED_B_OFF
#define LED_Green  		LED_R_OFF;LED_G_ON;LED_B_OFF
#define LED_Blue   		LED_R_OFF;LED_G_OFF;LED_B_ON
#define LED_Yellow    LED_R_ON;LED_G_ON ;LED_B_OFF
#define LED_Purple    LED_R_ON;LED_G_OFF;  LED_B_ON
#define LED_Cyan      LED_R_OFF;LED_G_ON ; LED_B_ON
#define LED_White     LED_R_ON;LED_G_ON;   LED_B_ON
#define LED_Black     LED_R_OFF;LED_G_OFF; LED_B_OFF

void LED_GPIO_Config(void);
#endif /* __BSP_LED_H */

3、主函数中

   #include "stm32f10x.h"
    #include "bsp_led.h“
    void Delay(uint32_t count)
{
	for(;count>0;count--)
	;
}
int main(void)
{
	LED_GPIO_Config();
	
	while(1)
	{
		LED_Red;Delay(0xfffff);
		LED_Green;Delay(0xfffff);
		LED_Blue;Delay(0xfffff);
		LED_Yellow;Delay(0xfffff);
		LED_Purple;Delay(0xfffff);
		LED_Cyan;Delay(0xfffff);
		LED_White;Delay(0xfffff);
		LED_Black;Delay(0xfffff);
	}
}
发布了24 篇原创文章 · 获赞 9 · 访问量 2758

猜你喜欢

转载自blog.csdn.net/fancyZT/article/details/96132874