作为一名初学者,配置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工程,配置外部高速时钟:
输入需要的频率,点击回车,STM32CubeMX会自动配置(在这里我把时钟频率设为了最高(72),但其实不设也行)
配置工程信息,完成后点击右上的GENERATE CODE,生成文件
点击Open Project打开工程 打开gpio.c,gpio.h
找到输入,输出的函数,复制到文本文档后删去(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