STM32初学入门笔记(1):STM32CubeMX配置STM32GPIO输出/输入在程序中切换

作为一名初学者,配置GPIO点灯肯定是第一个程序,但要是想要在一个端口同时实现输入和输出该怎么做呢?

首先,先要了解一下STM32的8种GPIO输入/输出模式:

(1)GPIO_Mode_AIN 模拟输入

(2)GPIO_Mode_IN_FLOATING浮空输入

(3)GPIO_Mode_IPD 下拉输入

(4)GPIO_Mode_IPU 上拉输入

(5)GPIO_Mode_Out_OD开漏输出

(6)GPIO_Mode_Out_PP推挽输出

(7)GPIO_Mode_AF_OD 复用开漏输出

(8)GPIO_Mode_AF_PP 复用推挽输出

作为初学者,这么多的模式肯定用不完,所以先从简单的来(关于8种GPIO模式的解释有很多,我就不班门弄斧了)

先来搞清楚我们的目的,如果只是单纯的想要同时实现输入输出,只需要使用下拉(上拉)输入和开漏(推挽)输出就行了

工程开始:

打开STM32CubeMX,新建一个STM32工程,配置外部高速时钟:

STM32初学入门笔记(1):STM32CubeMX配置STM32GPIO输出/输入在程序中切换_第1张图片

 STM32初学入门笔记(1):STM32CubeMX配置STM32GPIO输出/输入在程序中切换_第2张图片

输入需要的频率,点击回车,STM32CubeMX会自动配置(在这里我把时钟频率设为了最高(72),但其实不设也行) 

 STM32初学入门笔记(1):STM32CubeMX配置STM32GPIO输出/输入在程序中切换_第3张图片

配置调试STM32初学入门笔记(1):STM32CubeMX配置STM32GPIO输出/输入在程序中切换_第4张图片 

STM32初学入门笔记(1):STM32CubeMX配置STM32GPIO输出/输入在程序中切换_第5张图片

分别配置输入和输出(用于后面写库函数)STM32初学入门笔记(1):STM32CubeMX配置STM32GPIO输出/输入在程序中切换_第6张图片 STM32初学入门笔记(1):STM32CubeMX配置STM32GPIO输出/输入在程序中切换_第7张图片

 配置工程信息,完成后点击右上的GENERATE CODE,生成文件STM32初学入门笔记(1):STM32CubeMX配置STM32GPIO输出/输入在程序中切换_第8张图片

点击Open Project打开工程STM32初学入门笔记(1):STM32CubeMX配置STM32GPIO输出/输入在程序中切换_第9张图片 打开gpio.c,gpio.h

STM32初学入门笔记(1):STM32CubeMX配置STM32GPIO输出/输入在程序中切换_第10张图片

 找到输入,输出的函数,复制到文本文档后删去(gpio.h里的函数声明和main.c的初始化也要一并删去),并在下面写一个函数结构:

void HAL_GPIO_MODE_SET(uint16_t n){
    ①
	if (n == 0){
      ②
    }else if (n == 1){
      ③
    }
}

  GPIO_InitTypeDef GPIO_InitStruct = {0};

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

然后把复制到文本文档中的这个代码复制到①处

  /*Configure GPIO pin : PC13 */
  GPIO_InitStruct.Pin = GPIO_PIN_13;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

这个代码复制到②处

  /*Configure GPIO pin : PC14 */
  GPIO_InitStruct.Pin = GPIO_PIN_14;
  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);

这个代码复制到③处,然后将所有的端口改为同一端口(我这里改的是PC13,也就是对应LED的端口),最后应得到如下函数:

/* USER CODE BEGIN 2 */
void HAL_GPIO_MODE_SET(uint16_t n){
	  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
    __HAL_RCC_GPIOC_CLK_ENABLE();
    __HAL_RCC_GPIOD_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();
		if (n == 0){  /*Configure GPIO pin : PC13 */
      GPIO_InitStruct.Pin = GPIO_PIN_13;
      GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
		}else if(n == 1){
		  /*Configure GPIO pin : PC13 */
      GPIO_InitStruct.Pin = GPIO_PIN_13;
      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);
		}
}
/* USER CODE END 2 */

然后转到gpio.h中,添加函数声明:

/* USER CODE BEGIN Private defines */
void HAL_GPIO_MODE_SET(uint16_t);
/* USER CODE END Private defines */

再转到main.c中,添加初始化:

  /* USER CODE BEGIN 2 */
  HAL_GPIO_MODE_SET(1);
  /* USER CODE END 2 */

这个会默认初始化为输出模式,如果想要改变为输入,只需要把1改为0。

最后写一下主循环,添加自己需要的程序即可,下面是一个示例:

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		HAL_GPIO_MODE_SET(1);
		HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
		HAL_Delay(500);
		HAL_GPIO_MODE_SET(0);
		HAL_Delay(500);
  }
  /* USER CODE END 3 */
}

在这个程序中,先将PC13的电平设为低(因为STM32F103的核心板PC13连接的是灯的负极),点亮LED,然后把PC13的模式设为输入,看到灯熄灭了,就说明模式切换起作用了。 

都看到这里了点点关注再走呗

 交流Q群:659512171

你可能感兴趣的:(STM32,stm32,单片机,笔记)