在使用CubeMX配置GPIO口时的时候,对于某一个引脚只能选择用来输出或者输入。而有时我们需要在STM32上使用一些外设,比如DHT11温湿度传感器,其中的DATA口需要既能接收信号又能发送信号,所以我们可以参照CubeMX自动生成的GPIO初始化来进行配置。
//下面是自动生成的GPIO初始化函数,GPIOB的6引脚用来输出
void MX_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};/* GPIO Ports Clock Enable */__HAL_RCC_GPIOD_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();/*Configure GPIO pin Output Level */HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);/*Configure GPIO pin : PB6 */GPIO_InitStruct.Pin = GPIO_PIN_6;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);}
下面就是照葫芦画瓢。
//形参mode用来写入该引脚是用来输出还是输入的
void DHT_GPIO_Init(uint32_t mode)
{GPIO_InitTypeDef GPIO_InitStruct = {0};__HAL_RCC_GPIOB_CLK_ENABLE();/*Configure GPIO pin : PB8 */GPIO_InitStruct.Pin = GPIO_PIN_7;GPIO_InitStruct.Mode = mode;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
有了这个初始化函数我们就可以在主函数或者其他函数中使用它了
DHT_GPIO_Init(GPIO_MODE_OUTPUT_PP);//输出引脚
DHT_GPIO_Init(GPIO_MODE_INPUT);//输入引脚
举个例子,此时我需要对DHT11进行时序分析,我们如何使用这里的PB7口来启动DHT11
void DHT11_Start()
{DHT_GPIO_Init(GPIO_MODE_OUTPUT_PP);/此时用作输出引脚DHT_HIGH;DHT_LOW;HAL_Delay(30);DHT_HIGH;DHT_GPIO_Init(GPIO_MODE_INPUT);/此时用作输入引脚while(DHT_VALUE);while(!DHT_VALUE);while(DHT_VALUE);
}