stm32 HAL库函数——GPIO

断了今生、忘了曾经 提交于 2019-12-16 13:05:34
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);
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!