这里写自定义目录标题
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;//读取端口