• 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时钟。

  • 相关阅读:
    PB笔记之导入、导出组件
    pb笔记之数据窗口设置操作
    PB笔记之第一行数据不能删除的解决方法
    PowerBuilder学习笔记之行删除卡死问题
    PB笔记之数据窗口行不能编辑的原因
    PB笔记之导出为Excel的方法
    PowerBuilder学习笔记之导入Excel数据
    PB笔记之数据窗口添加虚拟列的方法
    PowerBuilder学习笔记之调用事件和函数
    Apache按日切分日志
  • 原文地址:https://www.cnblogs.com/qq376142178/p/12703263.html
Copyright © 2020-2023  润新知