案例背景:
我们将实现这样一个效果:按下按键KEY,点亮LED灯;松开按键KEY,熄灭LED灯。
- KEY需配置为上拉输入;
- LED需配置为推挽输出。
目录
1 STM32CubeMX中配置 – GPIO
1.1 PIN引脚配置
1.2 GPIO配置
1.2.1 GPIO – DI输入模式
1.2.1 GPIO – DO输出模式
2 生成代码
结尾
1 STM32CubeMX中配置 – GPIO
1.1 PIN引脚配置
依次选择Pinout&Configuration -- > Pinout view,配置如下:
GPIO设置:
- PA1 Pin:配置为GPIO_Input,用于捕获KEY的动作;
- PB4 Pin:配置为GPIO_Ouput,用于控制LED灯。
1.2 GPIO配置
1.2.1 GPIO – DI输入模式
依次选择Pinout&Configuration -- > System Core -- > GPIO,参数配置如下:
GPIO mode:Input mode为输入模式。
GPIO Pull-up/Pull-down:
- No Pull-up and no Pull-down表示引脚未连接到电源或地,引脚浮空输入时,读取结果是不确定的;
- Pull-up表示引脚上拉输入模式(引脚电平拉高至VDD,引脚与VDD之间存在一个高电阻);
- Pull-down表示引脚下拉输入模式(引脚电平拉低至GND,引脚与VDD之间存在一个高电阻)。
User Label:为该GPIO – Input定义一个标签,方便使用。
1.2.1 GPIO – DO输出模式
依次选择Pinout&Configuration -- > System Core -- > GPIO,参数配置如下:
GPIO output level:表示MCU初始化GPIO(调用函数MX_GPIO_Init)后,该引脚输出的电平,Low低电平,High高电平;
GPIO mode:输出模式。
- Output Push Pull表示推挽(Pull)输出模式(输出较大电流),推挽输出,既提高电路的负载能力,又提高开关速度;
- Output Open Drain表示开漏(Drain)输出模式(一般外接上拉电阻,如果外部不接上拉电阻只能输出低电平。驱动电流大小,取决于上拉电阻的大小。),可用于不同电压的系统之间的通信。
GPIO Pull-up/Pull-down:
- No Pull-up and no Pull-down表示引脚未连接到电源或地;
- Pull-up表示引脚上拉输出模式(引脚电平拉高至VDD,引脚与VDD之间存在一个高电阻);
- Pull-down表示引脚下拉输出模式(引脚电平拉低至GND,引脚与VDD之间存在一个高电阻)。
Maximum output speed:IO口速率(I/O口驱动电路的响应速度),当STM32的GPIO端口设置为输出模式时,有三种速度可以选择:Low、Medium和High,通过选择速度来选择不同的驱动电路,达到最佳的噪声控制和降低功耗的目的;
User Label:为该GPIO – Output定义一个标签,方便使用。
2 生成代码
单击GENERATE CODE,生成代码:通过HAL_GPIO_ReadPin捕获KEY的状态;通过HAL_GPIO_WritePin控制LED。
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
GPIO_PinState Pinstatus;
Pinstatus = HAL_GPIO_ReadPin(GPIOA,KEY_DI_Pin);
if(Pinstatus == GPIO_PIN_RESET) // ON KEY
{
HAL_GPIO_WritePin(GPIOB,LED_DO_Pin,GPIO_PIN_RESET); // ON LED
}
else if(Pinstatus == GPIO_PIN_SET) // OFF KEY
{
HAL_GPIO_WritePin(GPIOB,LED_DO_Pin,GPIO_PIN_SET); // OFF LED
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
/** Configure pins as
* Analog
* Input
* Output
* EVENT_OUT
* EXTI
* Free pins are configured automatically as Analog (this feature is enabled through
* the Code Generation settings)
*/
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_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(LED_DO_GPIO_Port, LED_DO_Pin, GPIO_PIN_SET);
/*Configure GPIO pin : PC13 */
GPIO_InitStruct.Pin = GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
/*Configure GPIO pins : PA0 PA2 PA3 PA4
PA5 PA6 PA7 PA8
PA9 PA10 PA11 PA12
PA15 */
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4
|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8
|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12
|GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/*Configure GPIO pin : PtPin */
GPIO_InitStruct.Pin = KEY_DI_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(KEY_DI_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pins : PB0 PB1 PB2 PB10
PB11 PB12 PB13 PB14
PB15 PB3 PB5 PB6
PB7 PB8 PB9 */
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_10
|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14
|GPIO_PIN_15|GPIO_PIN_3|GPIO_PIN_5|GPIO_PIN_6
|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/*Configure GPIO pins : PF6 PF7 */
GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
/*Configure GPIO pin : PtPin */
GPIO_InitStruct.Pin = LED_DO_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(LED_DO_GPIO_Port, &GPIO_InitStruct);
}
结尾
获取更多“汽车电子资讯”和“工具链使用”,
请关注CSDN博客“汽车电子助手”,做您的好助手。