蓝桥杯学习-基本概念-解读G431-2.GPIO

目录

一.配置GPIO初始化函数的步骤

①定义GPIO初始化变量-GPIO_InitTypeDef

②使能对应GPIO时钟-_HAL_RCC_GPIOx_CLK_ENABLE()

③配置GPIO状态-HAL_GPIO_Init()

二.有关GPIO的HAL函数

①HAL_GPIO_ReadPin-读

②HAL_GPIO_WritePin-写

③HAL_GPIO_TogglePin-倒置


一.配置GPIO初始化函数的步骤

  • 如果使用Cube预先进行设置则不需要我们去写GPIO的初始化函数
  • 但是为了以防万一,我们需要了解如何写。如下:
static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOF_CLK_ENABLE();
  __HAL_RCC_GPIOD_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_8 
                          |GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12, GPIO_PIN_RESET);

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);

  /*Configure GPIO pins : PC13 PC14 PC15 PC8 
                           PC9 PC10 PC11 PC12 */
  GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_8 
                          |GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  /*Configure GPIO pin : PD2 */
  GPIO_InitStruct.Pin = GPIO_PIN_2;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

}

①定义GPIO初始化变量-GPIO_InitTypeDef

GPIO_InitTypeDef GPIO_InitStruct = {0};

②使能对应GPIO时钟-_HAL_RCC_GPIOx_CLK_ENABLE()

  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOF_CLK_ENABLE();
  __HAL_RCC_GPIOD_CLK_ENABLE();

③配置GPIO状态-HAL_GPIO_Init()

  /*Configure GPIO pin : PD2 */
  GPIO_InitStruct.Pin = GPIO_PIN_2;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
  • 查看结构体GPIO_InitTypeDef的定义,如下:
typedef struct
{
  uint32_t Pin;        /*!< Specifies the GPIO pins to be configured.
                           This parameter can be any value of @ref GPIO_pins */

  uint32_t Mode;       /*!< Specifies the operating mode for the selected pins.
                           This parameter can be a value of @ref GPIO_mode */

  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 */

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

  uint32_t Alternate;  /*!< Peripheral to be connected to the selected pins
                            This parameter can be a value of @ref GPIOEx_Alternate_function_selection */
} GPIO_InitTypeDef;
    • 从上倒下,依据英文可得:
      • Pin-GPIO的引脚-‘GPIO_Pin_x’
      • Mode-GPIO的模式
        • 模式特别多,但是主要使用的是:
#define  GPIO_MODE_INPUT                        (0x00000000U)   /*!<输入模式                  */
#define  GPIO_MODE_OUTPUT_PP                    (0x00000001U)   /*!<推挽输出                 */
#define  GPIO_MODE_OUTPUT_OD                    (0x00000011U)   /*!<开漏输出               */
#define  GPIO_MODE_AF_PP                        (0x00000002U)   /*!<复用推挽输出     */
#define  GPIO_MODE_AF_OD                        (0x00000012U)   /*!<复用开漏输出    */
#define  GPIO_MODE_ANALOG                       (0x00000003U)   /*!<模拟模式 */
      • Pull- 选择上拉还是下拉
        • 有3个模式:
#define  GPIO_MODE_INPUT                        (0x00000000U)   /*!<输入模式                  */
#define  GPIO_MODE_OUTPUT_PP                    (0x00000001U)   /*!<推挽输出                 */
#define  GPIO_MODE_OUTPUT_OD                    (0x00000011U)   /*!<开漏输出               */
#define  GPIO_MODE_AF_PP                        (0x00000002U)   /*!<复用推挽输出     */
#define  GPIO_MODE_AF_OD                        (0x00000012U)   /*!<复用开漏输出    */
#define  GPIO_MODE_ANALOG                       (0x00000003U)   /*!<模拟模式 */
      • Speed-GPIO的速度
        • 有4个速度模式:
#define  GPIO_SPEED_FREQ_LOW        (0x00000000U)   /*!<5Mhz */
#define  GPIO_SPEED_FREQ_MEDIUM     (0x00000001U)   /*!<5 MHz to 25 MHz*/
#define  GPIO_SPEED_FREQ_HIGH       (0x00000002U)   /*!<25 MHz to 50 MHz*/
#define  GPIO_SPEED_FREQ_VERY_HIGH  (0x00000003U)   /*!<50 MHz to 120 MHz*/
  • 步骤其实和STM32F10x系列使用标准库的GPIO初始化相同,触类旁通

二.有关GPIO的HAL函数

  • 查阅HAL的GPIO头文件可知,有:
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);

下面介绍常用的GPIO函数(其实没什么必要,大致明白即可,实际上都是对寄存器进行操作)

①HAL_GPIO_ReadPin-读

/**
  * @brief  Read the specified input port pin.
  * @param  GPIOx where x can be (A..G) to select the GPIO peripheral for STM32G4xx family
  * @param  GPIO_Pin specifies the port bit to read.
  *         This parameter can be any combination of GPIO_PIN_x where x can be (0..15).
  * @retval The input port pin value.
  */
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{
  GPIO_PinState bitstatus;

  /* Check the parameters */
  assert_param(IS_GPIO_PIN(GPIO_Pin));

  if ((GPIOx->IDR & GPIO_Pin) != 0x00U)
  {
    bitstatus = GPIO_PIN_SET;
  }
  else
  {
    bitstatus = GPIO_PIN_RESET;
  }
  return bitstatus;
}
  • 简介brief写此函数用于读取选择的输入引脚
  • 至于入口参数十分简单不用赘述
  • 看函数主体可见实际是读取GPIO的寄存器IDR即Input Data Register的值,与STM32F10x的标准库函数相同

②HAL_GPIO_WritePin-写

/**
  * @brief  Set or clear the selected data port bit.
  *
  * @note   This function uses GPIOx_BSRR and GPIOx_BRR registers to allow atomic read/modify
  *         accesses. In this way, there is no risk of an IRQ occurring between
  *         the read and the modify access.
  *
  * @param  GPIOx where x can be (A..G) to select the GPIO peripheral for STM32G4xx family
  * @param  GPIO_Pin specifies the port bit to be written.
  *         This parameter can be any combination of GPIO_PIN_x where x can be (0..15).
  * @param  PinState specifies the value to be written to the selected bit.
  *         This parameter can be one of the GPIO_PinState enum values:
  *            @arg GPIO_PIN_RESET: to clear the port pin
  *            @arg GPIO_PIN_SET: to set the port pin
  * @retval None
  */
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
{
  /* Check the parameters */
  assert_param(IS_GPIO_PIN(GPIO_Pin));
  assert_param(IS_GPIO_PIN_ACTION(PinState));

  if (PinState != GPIO_PIN_RESET)
  {
    GPIOx->BSRR = (uint32_t)GPIO_Pin;
  }
  else
  {
    GPIOx->BRR = (uint32_t)GPIO_Pin;
  }
}

③HAL_GPIO_TogglePin-倒置

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
rpi.gpio2-0.3.0a3-py3-none-any.whl是一个Python库文件,用于树莓派上的GPIO控制。你可以通过以下步骤进行下载安装: 1. 首先,打开你的电脑上的浏览器,并搜索“rpi.gpio2-0.3.0a3-py3-none-any.whl下载”。你可以在搜索结果中找到一些来源。 2. 在搜索结果中选择一个可信赖的来源,并点击下载链接。可能会有多个来源提供下载。 3. 当下载完成后,你可以在你电脑上查找下载的文件。它通常保存在你设置的默认下载位置中。 4. 现在,你需要将rpi.gpio2-0.3.0a3-py3-none-any.whl文件传输到你的树莓派上。你可以通过以下方法之一进行传输: - 使用USB闪存驱动器:将文件复制到USB闪存驱动器中,然后将其插入树莓派USB口。然后在树莓派上复制文件到某个目录中。 - 使用网络共享:将文件上传到你的树莓派所在的局域网共享文件夹。然后在树莓派上从共享文件夹中复制文件到某个目录中。 5. 在树莓派上打开终端,并导航到你复制文件的目录。 6. 运行以下命令来安装rpi.gpio2-0.3.0a3-py3-none-any.whl库: ``` pip install rpi.gpio2-0.3.0a3-py3-none-any.whl ``` 这将自动安装所需的库文件。 7. 安装完成后,你可以在你的Python程序中使用`import rpi.gpio2`来引入该库,并开始使用树莓派上的GPIO控制。 确保你从官方或可信赖的开发者下载该文件,以避免安全和兼容性问题。了解和遵循每个资源提供者的安装说明是非常重要的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值