zl程序教程

您现在的位置是:首页 >  大数据

当前栏目

STM32之GPIO配置(寄存器/库函数)

配置寄存器 STM32 GPIO 库函数
2023-09-11 14:20:47 时间

GPIO初始化结构体

在这里插入图片描述

GPIO初始化

先声明GPIO初始化的结构体;然后打开GPIO所挂载的总线的时钟;再对结构体成员进行配置,包括GPIO的引脚,模式,速度;最后对GPIO的结构体进行初始化并选定指定的GPIO组。
在这里插入图片描述

GPIO_Mode相关内容

在这里插入图片描述
模拟输入、浮空输入、下拉输入、上拉输入、通用开漏输出、通用推挽输出、复用开漏输出、复用推挽输出。

GPIO相关函数

①GPIO初始化函数
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
②GPIO结构体初始化函数
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
③设置一组IO口为高电平
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
④设置一组IO口为低电平
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
⑤设置一个IO口为高或低电平
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
⑥设置一组IO口为高或低电平
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
⑦读取一个引脚的输入值
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
⑧读取一组引脚的输入值
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
⑨读取一个引脚的输出值
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
⑩读取一组引脚的输出值
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);

GPIO的位带操作

#define GPIOC_ODR_Addr		(GPIOC_BASE + 0X0C)
#define PCout(n)		*(uint16_t*)((GPIOC_ODR_Addr & 0xF0000000+0X02000000+(GPIOC_ODR_Addr & 0x00FFFFFF)<<5)+(n<<2))

寄存器配置GPIO

/**************************************************************************************************************
关于配置GPIO输出状态的三个寄存器ODR、BRR、BSRR

1.ODR寄存器:可读可写,既能控制管脚为高电平,也能控制管脚为低电平。管脚对应位写1为高电平,写0为低电平。

2.BSRR只写寄存器:既能控制管脚为高电平,也能控制管脚为低电平。
		对寄存器高16bit写1对应管脚为低电平,对寄存器低16bit写1对应管脚为高电平;写0无动作。

3.BRR只写寄存器:只能改变管脚状态为低电平,对寄存器管脚对于位写1相应管脚会为低电平。写0无动作。

	*注意:用BSRR和BRR去改变管脚状态的时候,没有被中断打断的风险。也就不需要关闭中断。
	
	置位 |=  ,   清0  &=~
	
	GPIO输出初始化顺序
			1.选定具体的GPIO
			2.配置GPIO工作模式(CRL和CRH寄存器)
			3.控制GPIO输出高低电平(ODR、BRR、BSRR)
**************************************************************************************************************/

#define PERIPH_BASE           ((uint32_t)0x40000000)		//外设总线基地址

#define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000)		//APB2总线基地址

#define GPIOA_BASE            (APB2PERIPH_BASE + 0x0800)	//GPIOA基地址
#define GPIOB_BASE            (APB2PERIPH_BASE + 0x0C00)	//GPIOB基地址
#define GPIOC_BASE            (APB2PERIPH_BASE + 0x1000)	//GPIOC基地址
#define GPIOD_BASE            (APB2PERIPH_BASE + 0x1400)	//GPIOD基地址
#define GPIOE_BASE            (APB2PERIPH_BASE + 0x1800)	//GPIOE基地址
#define GPIOF_BASE            (APB2PERIPH_BASE + 0x1C00)	//GPIOF基地址
#define GPIOG_BASE            (APB2PERIPH_BASE + 0x2000)	//GPIOG基地址

#define GPIOx_CRL			  (GPIOx_BASE + 0X00)			//端口配置低寄存器
#define GPIOx_CRH			  (GPIOx_BASE + 0X04)			//端口配置高寄存器
#define GPIOx_IDR			  (GPIOx_BASE + 0X08)			//端口输入数据寄存器
#define GPIOx_ODR			  (GPIOx_BASE + 0X0C)			//端口输出数据寄存器
#define GPIOx_BSRR			  (GPIOx_BASE + 0X10)			//端口位设置/清除寄存器
#define GPIOx_BRR			  (GPIOx_BASE + 0X14)			//端口位清除寄存器
#define GPIOx_LCKR			  (GPIOx_BASE + 0X18)			//端口配置锁定寄存器

//eg: GPIOC_IDR	:	0x40000000+0x10000+0x1000+0X08 = 0x40011008
//示例:闪烁灯
void GPIOC3_Init(void)
{
	*(unsigned int*)0x40021018 |= 	0x01 << 4;				//打开GPIOC端口的时钟RCC,APB2外设时钟使能寄存器
	
    *(unsigned int*)0x40011000 |= 	0x03 << 12;				//配置CRL寄存器中的IO3的模式为输出模式,最大速度50Mhz
 // *(unsigned int*)0x40011000 |= 	0x01 << 12;				//最大速度10Mhz
 // *(unsigned int*)0x40011000 |= 	0x02 << 12;				//最大速度2Mhz
	
    *(unsigned int*)0x4001100C &=~ (0x01 << 3);				//控制ODR寄存器,对IO3进行清零复位
}

int main(void)
{
    GPIOC3_Init();
    while(1)
    {	
		//unsigned int *p 表示定义变量unsigned int类型的指针变量p
        //向地址0x40011010指向的内存里的第19位写入1
        *(unsigned int*)0x40011010 |= (0x01 << (16+3));		//BSRR寄存器写GPIO低电平
        SysTick_Delay_ms(500);
        *(unsigned int*)0x40011010 |= (0x01 << 3);			//BSRR寄存器写GPIO高电平
        SysTick_Delay_ms(500);
    }
}

STM32F10xxx存储器映像图

在这里插入图片描述在这里插入图片描述