zoukankan      html  css  js  c++  java
  • stm32 HAL库函数——GPIO

    void  HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init);
    void  HAL_GPIO_DeInit(GPIO_TypeDef  *GPIOx, uint32_t GPIO_Pin);
    GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
    void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
    void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
    HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
    void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);
    void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);

    以上内容复制自stm32f7xx_hal_gpio.h

    初始化HAL库

    HAL_Init();

    初始化时钟(正点原子系统文件夹里得函数)

    void Stm32_Clock_Init(u32 plln,u32 pllm,u32 pllp,u32 pllq)

      //plln:主PLL倍频系数(PLL倍频),取值范围:64~432.

      //pllm:主PLL和音频PLL分频系数(PLL之前的分频),取值范围:2~63.

      //pllp:系统时钟的主PLL分频系数(PLL之后的分频),取值范围:2,4,6,8.(仅限这4个值!)

      //pllq:USB/SDIO/随机数产生器等的主PLL分频系数(PLL之后的分频),取值范围:2~15.

    使能io口时钟

    __HAL_RCC_GPIOB_CLK_ENABLE();

    初始化GPIO模式

    void HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init)

    第一个参数填GPIOA GPIOB GPIOC 等等

    第二个参数是结构体

    typedef struct
    {
      uint32_t Pin;       /*!< Specifies the GPIO pins to be configured.
                               This parameter can be any value of @ref GPIO_pins_define */
    
      uint32_t Mode;      /*!< Specifies the operating mode for the selected pins.
                               This parameter can be a value of @ref GPIO_mode_define */
    
      uint32_t Pull;      /*!< Specifies the Pull-up or Pull-Down activation for the selected pins.
                               This parameter can be a value of @ref GPIO_pull_define */
    
      uint32_t Speed;     /*!< Specifies the speed for the selected pins.
                               This parameter can be a value of @ref GPIO_speed_define */
    
      uint32_t Alternate;  /*!< Peripheral to be connected to the selected pins. 
                                This parameter can be a value of @ref GPIO_Alternate_function_selection */
    }GPIO_InitTypeDef;

    比如结构体中Speed变量有如下几种宏定义:

    /** @defgroup GPIO_speed_define  GPIO speed define
      * @brief GPIO Output Maximum frequency
      * @{
      */  
    #define  GPIO_SPEED_FREQ_LOW         ((uint32_t)0x00000000U)  /*!< Low speed     */
    #define  GPIO_SPEED_FREQ_MEDIUM      ((uint32_t)0x00000001U)  /*!< Medium speed  */
    #define  GPIO_SPEED_FREQ_HIGH        ((uint32_t)0x00000002U)  /*!< Fast speed    */
    #define  GPIO_SPEED_FREQ_VERY_HIGH   ((uint32_t)0x00000003U)  /*!< High speed    */

    至于结构体里面其他变量的宏定义 hal_gpio.h中又详细的说明,本文不一一列举

    下面是一个例子:

    GPIO_InitTypeDef    GPIO_Initure; 
    GPIO_Initure.Pin=GPIO_PIN_0;            //PB0 
    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;    //推挽输出 
    GPIO_Initure.Pull=GPIO_PULLUP;                            //上拉 
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;                //高速 
    HAL_GPIO_Init(GPIOB,&GPIO_Initure); 

    ODR 寄存器

    void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); 

    BSRR寄存器

    void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin,GPIO_PinState PinState); 

    后面的参数PinState只有两个成员:GPIO_PIN_SET GPIO_PIN_RESET

    ODR 和 BSRR 寄存器的区别:

    对于 BSRR 寄存器,你写 0 的话,对 IO 口电平是没有任何影响的。
    我们要设置某个 IO 口电平,只需要相关位设置为 1 即可。而 ODR 寄存器,我们要设置某个 IO口电平,我们首先需要读出来 ODR 寄存器的值,
    然后对整个 ODR 寄存器重新赋值来达到设置某个或者某些 IO 口的目的,而 BSRR 寄存器,我们就不需要先读,而是直接设置即可,这在多任务实时操作系统中作用很大。

    读取IO口电平

    GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); 

    GPIO 相关的函数我们先讲解到这里。虽然 IO 操作步骤很简单,这里我们还是做个概括性的总结,操作步骤为: 

    1) 使能 IO 口时钟,调用函数为__HAL_RCC_GPIOX_CLK_ENABLE(其中 X=A~K)。 

    2) 初始化 IO 参数。调用函数 HAL_GPIO_Init(); 

    3) 操作 IO 输入输出。操作 IO 的方法就是上面我们讲解的方法。

    void  HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init);
  • 相关阅读:
    C#获取上级文件夹路径
    C#string与byte数组转行
    C#BAT与VBS文件的创建和执行调用
    C#生成条形码
    C#根据生日计算所属十二星座
    C#获取某一字符串第N到第N+1空格的字符
    WPF的DataGrid表格动态加载合并列
    WPF递归设置CheckBox与TextBox禁用联动
    WPF基础知识
    WPF Popup绑定目标控件上下左右位置
  • 原文地址:https://www.cnblogs.com/qifeng1024/p/12025154.html
Copyright © 2011-2022 走看看