10.GPIO模块

GPIO指的是通用输入输出。

根据数据手册中列出的每个I/O端口的特定硬件特征, GPIO端口的每个位可以由软件分别配置
成多种模式。
输入浮空
输入上拉
输入下拉
模拟输入
开漏输出
推挽式输出
推挽式复用功能
开漏复用功能

我们来看看固件库是如何给我们封装的函数。

在固件库的封装上来看,也不是那么繁琐的.

stm32f10x_gpio.h,加上注释也就只有300多行,里面都是一些对port、pin的宏定义、封装结构体。

/**
* @brief    GPIO  Init s  tructure   definition
*/

typedef struct
{
uint16_t     GPIO_Pin;                                             /*!< Specifies the GPIO pins to be configured.This parameter can be any value of @ref GPIO_pins_define */

GPIOSpeed_TypeDef     GPIO_Speed;                 /*!< Specifies the speed for the selected pins.This parameter can be a value of @ref GPIOSpeed_TypeDef */

GPIOMode_TypeDef       GPIO_Mode;                  /*!< Specifies the operating mode for the selected pins. This parameter

                                                       can be a value of */ @ref GPIOMode_TypeDef */                       
}GPIO_InitTypeDef;

//定义一个结构体,用typedef定义了一个结构体,GPIO_InitTypeDef,包含

{uint16_t     GPIO_Pin;       //用户指定一个pin引脚

            #define GPIO_Pin_0 ((uint16_t)0x0001) /*!< Pin 0 selected */

            #define GPIO_Pin_1 ((uint16_t)0x0002) /*!< Pin 1 selected */
            #define GPIO_Pin_2 ((uint16_t)0x0004) /*!< Pin 2 selected */
            #define GPIO_Pin_3 ((uint16_t)0x0008) /*!< Pin 3 selected */
            #define GPIO_Pin_4 ((uint16_t)0x0010) /*!< Pin 4 selected */
            #define GPIO_Pin_5 ((uint16_t)0x0020) /*!< Pin 5 selected */
            #define GPIO_Pin_6 ((uint16_t)0x0040) /*!< Pin 6 selected */
            #define GPIO_Pin_7 ((uint16_t)0x0080) /*!< Pin 7 selected */
            #define GPIO_Pin_8 ((uint16_t)0x0100) /*!< Pin 8 selected */
            #define GPIO_Pin_9 ((uint16_t)0x0200) /*!< Pin 9 selected */
            #define GPIO_Pin_10 ((uint16_t)0x0400) /*!< Pin 10 selected */
            #define GPIO_Pin_11 ((uint16_t)0x0800) /*!< Pin 11 selected */
            #define GPIO_Pin_12 ((uint16_t)0x1000) /*!< Pin 12 selected */
            #define GPIO_Pin_13 ((uint16_t)0x2000) /*!< Pin 13 selected */
            #define GPIO_Pin_14 ((uint16_t)0x4000) /*!< Pin 14 selected */
            #define GPIO_Pin_15 ((uint16_t)0x8000) /*!< Pin 15 selected */
            #define GPIO_Pin_All ((uint16_t)0xFFFF) /*!< All pins selected */

GPIOSpeed_TypeDef  GPIO_Speed;     //GPIOSpeed_TypeDef  枚举类型的GPIO_Speed,

            用typedef定义了了枚举类型

            typedef enum

            {
              GPIO_Speed_10MHz = 1,
              GPIO_Speed_2MHz,
              GPIO_Speed_50MHz
            }GPIOSpeed_TypeDef;

GPIOMode_TypeDef   GPIO_Mode;         //GPIOMode_TypeDef   枚举类型的GPIO_Mode,

            用typedef定义了了枚举类型

            typedef enum
            {

              GPIO_Mode_AIN = 0x0,                                                      //模拟输入
              GPIO_Mode_IN_FLOATING = 0x04,                                   //浮空输入
              GPIO_Mode_IPD = 0x28,               //下拉输入
              GPIO_Mode_IPU = 0x48,                                                   //上拉输入
              GPIO_Mode_Out_OD = 0x14,            //开漏输出
              GPIO_Mode_Out_PP = 0x10,                                           //推挽输出
              GPIO_Mode_AF_OD = 0x1C,                                           //复用开漏输出
              GPIO_Mode_AF_PP = 0x18                                             //复用推挽输出
            }GPIOMode_TypeDef;

还有一些类似的定义...

接下来随stm32f10x_gpio.c

在前面都是一样的方法:进行位带定义

/* ------------ RCC registers bit address in the alias region ----------------*/
#define AFIO_OFFSET (AFIO_BASE - PERIPH_BASE)

/* --- EVENTCR Register -----*/

/* Alias word address of EVOE bit */
#define EVCR_OFFSET (AFIO_OFFSET + 0x00)
#define EVOE_BitNumber ((uint8_t)0x07)
#define EVCR_EVOE_BB (PERIPH_BB_BASE + (EVCR_OFFSET * 32) + (EVOE_BitNumber * 4))

函数:

/**
* @brief Initializes the GPIOx peripheral according to the specified
* parameters in the GPIO_InitStruct.
* @param GPIOx: where x can be (A..G) to select the GPIO peripheral.
* @param GPIO_InitStruct: pointer to a GPIO_InitTypeDef structure that
* contains the configuration information for the specified GPIO peripheral.
* @retval None
*/
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct){...}         //GPIO初始化

/**
* @brief Sets the selected data port bits.
* @param GPIOx: where x can be (A..G) to select the GPIO peripheral.
* @param GPIO_Pin: specifies the port bits to be written.
* This parameter can be any combination of GPIO_Pin_x where x can be (0..15).
* @retval None
*/
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin){...}                          //位置1

/**
* @brief Clears the selected data port bits.
* @param GPIOx: where x can be (A..G) to select the GPIO peripheral.
* @param GPIO_Pin: specifies the port bits to be written.
* This parameter can be any combination of GPIO_Pin_x where x can be (0..15).
* @retval None
*/
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin){...}                //复位 置0

.....还有很多函数,也有功能重复的,常用的其实也就那么几个,等用到的时候在添加吧...

中断

/**
* @brief Selects the GPIO pin used as EXTI Line.
* @param GPIO_PortSource: selects the GPIO port to be used as source for EXTI lines.
* This parameter can be GPIO_PortSourceGPIOx where x can be (A..G).
* @param GPIO_PinSource: specifies the EXTI line to be configured.
* This parameter can be GPIO_PinSourcex where x can be (0..15).
* @retval None
*/

 //中断配置,,  1.GPIO_PortSourceGPIOx where x can be (A..G).2.GPIO_PinSourcex where x can be (0..15).
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource){...}       

 

还有AFIO,复用端口函数

void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState){}     //复用映射,注意要同时开启AFIO时钟。

 

posted @ 2020-04-15 09:40  A_Powered  阅读(857)  评论(0编辑  收藏  举报