STM32f1系列的GPIO位操作实现

这里写自定义目录标题


gpio_operate.c

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file    gpio.c
  * @brief   This file provides code for the configuration
  *          of all used GPIO pins.
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2023 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/
#include "gpio_operate.h"

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/*----------------------------------------------------------------------------*/
/* Configure GPIO                                                             */
/*----------------------------------------------------------------------------*/
/* USER CODE BEGIN 1 */
Bit_GPIO *W_GPIOA=(Bit_GPIO*)&GPIOA->ODR;//读GPIO的结构体
Bit_GPIO *W_GPIOB=(Bit_GPIO*)&GPIOB->ODR;
Bit_GPIO *W_GPIOC=(Bit_GPIO*)&GPIOC->ODR;
Bit_GPIO *W_GPIOD=(Bit_GPIO*)&GPIOD->ODR;
Bit_GPIO *W_GPIOE=(Bit_GPIO*)&GPIOE->ODR;
//用引脚多的MCU时往后扩展
Bit_GPIO *R_GPIOA=(Bit_GPIO*)&GPIOA->IDR;//写GPIO的结构体
Bit_GPIO *R_GPIOB=(Bit_GPIO*)&GPIOB->IDR;
Bit_GPIO *R_GPIOC=(Bit_GPIO*)&GPIOC->IDR;
Bit_GPIO *R_GPIOD=(Bit_GPIO*)&GPIOD->IDR;
Bit_GPIO *R_GPIOE=(Bit_GPIO*)&GPIOE->IDR;
//用引脚多的MCU时往后扩展
/* USER CODE END 1 */


/***************************************************************
  *  @brief     设置GPIO端口的模式
  *  @param     *GPIOx:GPIO端口: GPIOA,GPIOB 
	*							pin:引脚号
	*							pin_mode:端口速度
	*							pin_cnf:端口模式
  *  @note      一次只能设置一个端口,该函数没有打开GPIO端口时钟,需要手动打开
  *  @Sample usage:     初始化时调用
 **************************************************************/

void GPIO_Set(GPIO_TypeDef  *GPIOx,PIN pin,PIN_MODE pin_mode,PIN_CNF pin_cnf)
{
	Set_GPIO *set_gpio=(Set_GPIO*)&GPIOx->CRL;
	Set_GPIO_CLOCK *set_gpio_clock=(Set_GPIO_CLOCK *)RCC->APB2ENR;
	switch((uint32_t)GPIOx)
	{
		case (uint32_t)GPIOA:set_gpio_clock->GPIOAEN=1;break;
		case (uint32_t)GPIOB:set_gpio_clock->GPIOAEN=1;break;
		case (uint32_t)GPIOC:set_gpio_clock->GPIOAEN=1;break;
		case (uint32_t)GPIOD:set_gpio_clock->GPIOAEN=1;break;
		case (uint32_t)GPIOE:set_gpio_clock->GPIOAEN=1;break;
		//用引脚多的MCU时往后扩展
	}
	switch(pin)
	{
		case PIN0:set_gpio->CNF0=pin_cnf;
		set_gpio->MODE0=pin_mode;break;
		case PIN1:set_gpio->CNF1=pin_cnf;
		set_gpio->MODE1=pin_mode;break;
		case PIN2:set_gpio->CNF2=pin_cnf;
		set_gpio->MODE2=pin_mode;break;
		case PIN3:set_gpio->CNF3=pin_cnf;
		set_gpio->MODE3=pin_mode;break;
		case PIN4:set_gpio->CNF4=pin_cnf;
		set_gpio->MODE4=pin_mode;break;
		case PIN5:set_gpio->CNF5=pin_cnf;
		set_gpio->MODE5=pin_mode;break;
		case PIN6:set_gpio->CNF6=pin_cnf;
		set_gpio->MODE6=pin_mode;break;
		case PIN7:set_gpio->CNF7=pin_cnf;
		set_gpio->MODE7=pin_mode;break;
		case PIN8:set_gpio->CNF8=pin_cnf;
		set_gpio->MODE8=pin_mode;break;
		case PIN9:set_gpio->CNF9=pin_cnf;
		set_gpio->MODE9=pin_mode;break;
		case PIN10:set_gpio->CNF10=pin_cnf;
		set_gpio->MODE10=pin_mode;break;
		case PIN11:set_gpio->CNF11=pin_cnf;
		set_gpio->MODE11=pin_mode;break;
		case PIN12:set_gpio->CNF12=pin_cnf;
		set_gpio->MODE12=pin_mode;break;
		case PIN13:set_gpio->CNF13=pin_cnf;
		set_gpio->MODE13=pin_mode;break;
		case PIN14:set_gpio->CNF14=pin_cnf;
		set_gpio->MODE14=pin_mode;break;
		case PIN15:set_gpio->CNF15=pin_cnf;
		set_gpio->MODE15=pin_mode;break;
	}
}
/* USER CODE BEGIN 2 */

/* USER CODE END 2 */

gpio_operate.h

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file    gpio.h
  * @brief   This file contains all the function prototypes for
  *          the gpio.c file
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2023 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __GPIO_OPERATE_H__
#define __GPIO_OPERATE_H__

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include "main.h"

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* USER CODE BEGIN Private defines */
typedef struct Bit_GPIO
{
	uint16_t Pin0:1;
	uint16_t Pin1:1;
	uint16_t Pin2:1;
	uint16_t Pin3:1;
	uint16_t Pin4:1;
	uint16_t Pin5:1;
	uint16_t Pin6:1;
	uint16_t Pin7:1;
	uint16_t Pin8:1;
	uint16_t Pin9:1;
	uint16_t Pin10:1;
	uint16_t Pin11:1;
	uint16_t Pin12:1;
	uint16_t Pin13:1;
	uint16_t Pin14:1;
	uint16_t Pin15:1;
}Bit_GPIO;
typedef struct Set_GPIO
{
	uint32_t MODE0:2;
	uint32_t CNF0:2;
	uint32_t MODE1:2;
	uint32_t CNF1:2;
	uint32_t MODE2:2;
	uint32_t CNF2:2;
	uint32_t MODE3:2;
	uint32_t CNF3:2;
	uint32_t MODE4:2;
	uint32_t CNF4:2;
	uint32_t MODE5:2;
	uint32_t CNF5:2;
	uint32_t MODE6:2;
	uint32_t CNF6:2;
	uint32_t MODE7:2;
	uint32_t CNF7:2;
	uint32_t MODE8:2;
	uint32_t CNF8:2;
	uint32_t MODE9:2;
	uint32_t CNF9:2;
	uint32_t MODE10:2;
	uint32_t CNF10:2;
	uint32_t MODE11:2;
	uint32_t CNF11:2;
	uint32_t MODE12:2;
	uint32_t CNF12:2;
	uint32_t MODE13:2;
	uint32_t CNF13:2;
	uint32_t MODE14:2;
	uint32_t CNF14:2;
	uint32_t MODE15:2;
	uint32_t CNF15:2;
}Set_GPIO;
typedef struct Set_GPIO_CLOCK
{
	uint32_t :2;
	uint32_t GPIOAEN:1;
	uint32_t GPIOBEN:1;
	uint32_t GPIOCEN:1;
	uint32_t GPIODEN:1;
	uint32_t GPIOEEN:1;
	uint32_t :25;
}Set_GPIO_CLOCK;
typedef enum PIN
{
	PIN0=0,
	PIN1,
	PIN2,
	PIN3,
	PIN4,
	PIN5,
	PIN6,
	PIN7,
	PIN8,
	PIN9,
	PIN10,
	PIN11,
	PIN12,
	PIN13,
	PIN14,
	PIN15
}PIN;
typedef enum PIN_MODE
{
	INPUT=0,
	OUTPUT_10MHZ,
	OUTPUT_2MHZ,
	OUTPUT_50MHZ,
}PIN_MODE;
typedef enum PIN_CNF
{
	ANALOG=0,				//模拟输入
	IN,							//浮空输入
	PULL,						//上下拉输入
	OUTPUT_PP=0x00,	//通用推挽
	OUTPUT_OD,			//通用开漏
	AF_PP,					//复用推挽
	AF_OD						//复用开漏
}PIN_CNF;
/* USER CODE END Private defines */
extern Bit_GPIO *W_GPIOA;//写GPIO的结构体
extern Bit_GPIO *W_GPIOB;
extern Bit_GPIO *W_GPIOC;
extern Bit_GPIO *W_GPIOD;
extern Bit_GPIO *W_GPIOE;

extern Bit_GPIO *R_GPIOA;//写读PIO的结构体
extern Bit_GPIO *R_GPIOB;
extern Bit_GPIO *R_GPIOC;
extern Bit_GPIO *R_GPIOD;
extern Bit_GPIO *R_GPIOE;

void GPIO_Set(GPIO_TypeDef  *GPIOx,PIN pin,PIN_MODE pin_mode,PIN_CNF pin_cnf);
/* USER CODE BEGIN Prototypes */

/* USER CODE END Prototypes */

#ifdef __cplusplus
}
#endif
#endif /*__ __GPIO_OPERATE_H__ */


使用方法

	GPIO_Set(GPIOC,PIN14,INPUT,PULL);//初始化端口
	
	W_GPIOC->Pin14=1;//设置端口
	uint8_t R_GPIOC->Pin14;//读取端口
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值