STM32学习——GPIO

1、什么是GPIO?

1.1、定义

      GPIO是通用输入输出端口的简称,简单来说就是STM32可控制的引脚STM32芯片的GPIO引脚与外部设备连接起来,从而实现与外部通讯,控制以及数据采集的功能。

       简单来说我们控制GPIO引脚的电平变化,达到我们的各种目的。

1.2、命名规则

      组编号:GPIOA , GPIOB , GPIOC , GPIOD ... GPIOG

       引脚编号:0 , 1 , 2 , 3 , 4 …15

       组合起来: PA0 , PA1 , PA2 … PA15

                            PB0 , PB1 , PB2 … PB15

                            PC0 , PC1 , PC2 … PC15

                                   …

       有一些特殊功能的引脚不能用作IO口。

1.3、内部框架图

1.4、推挽输出与开漏输出

      推挽输出:

       开漏输出:

推挽输出:可以真正的输出高电平和低电平

开漏输出:无法输出真正的高电平,既高电平时没有驱动能力,需要借助外部上拉电阻完成对外驱动

2、点亮LED灯

2.1、PCB原理图接线

 

将PB8或PB9置低电平,实现LED灯的点亮。

3、编程实现

3.1、常用的GPIO HAL库函数:

/* HAL_GPIO_Init函数:初始化GPIO口 */
void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init);

/* HAL_GPIO_WritePin函数:给对应GPIO口引脚写低电平或高电平 */
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState
PinState);

/* HAL_GPIO_TogglePin函数:翻转GPIO口状态 */
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);

结构体 GPIO_InitTypeDef定义:

typedef struct
{
uint32_t Pin;    //表示GPIO引脚
uint32_t Mode;   //输出模式,选择推挽输出还是开漏输出
uint32_t Pull;    //引脚设置(拉高,拉低,既不拉高也不拉低)
uint32_t Speed;    //引脚传输速度
} GPIO_InitTypeDef;

3.2、点灯实现 

3.2.1、配置STM32CubeMX

3.2.2、代码分析

 mian.c文件


#include "main.h"
#include "gpio.h"


void SystemClock_Config(void);

int main(void)
{
  
  HAL_Init();            //初始化HAL库
  
  SystemClock_Config();     //初始化时钟

  MX_GPIO_Init();            //初始化GPIO口

  while (1)
  {
   
  }

}


void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  {
    Error_Handler();
  }
}


void Error_Handler(void)
{
  
  __disable_irq();
  while (1)
  {
  }
}

#ifdef  USE_FULL_ASSERT

void assert_failed(uint8_t *file, uint32_t line)
{
 
}
#endif 

gpio.c文件

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file    gpio.c
  * @brief   This file provides code for the configuration
  *          of all used GPIO pins.
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2023 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/
#include "gpio.h"

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/*----------------------------------------------------------------------------*/
/* Configure GPIO                                                             */
/*----------------------------------------------------------------------------*/
/* USER CODE BEGIN 1 */

/* USER CODE END 1 */

/** Configure pins as
        * Analog
        * Input
        * Output
        * EVENT_OUT
        * EXTI
*/
void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOA_CLK_ENABLE();    //GPIO相关的时钟
  __HAL_RCC_GPIOB_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
/*  给GPIO引脚写函数  */ /* 函数参数:引脚组 , 引脚号 , 写入状态(SET高,RESET低) */
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8|GPIO_PIN_9, GPIO_PIN_SET);

  /*Configure GPIO pins : PB8 PB9 */
  GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

}

/* USER CODE BEGIN 2 */

/* USER CODE END 2 */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值