读取STM32控制板上的KEY1按键,控制LED指示灯亮灭。
如下图所示,按键KEY1和LED指示灯为板载元器件,所以不需要外接其他设备。请把type-C数据线连接电脑与STM32控制板的USB Connect接口。
打开STM32CUBEIDE,导入工程,程序源码对应的路径为:
Board_Samples/STM32_Samples/Key
初始化外设GPIO,其中LED_ROS_GPIO对应硬件电路的PC14,GPIO模式为输出模式,KEY1_GPIO对应硬件电路的PC15,GPIO模式为输入上拉模式。
x#define LED_MCU_Pin GPIO_PIN_13
#define LED_MCU_GPIO_Port GPIOC
#define LED_ROS_Pin GPIO_PIN_14
#define LED_ROS_GPIO_Port GPIOC
#define KEY1_Pin GPIO_PIN_15
#define KEY1_GPIO_Port GPIOC
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOH_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOC, LED_MCU_Pin|LED_ROS_Pin, GPIO_PIN_RESET);
/*Configure GPIO pins : PCPin PCPin */
GPIO_InitStruct.Pin = LED_MCU_Pin|LED_ROS_Pin;
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);
/*Configure GPIO pin : PtPin */
GPIO_InitStruct.Pin = KEY1_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(KEY1_GPIO_Port, &GPIO_InitStruct);
}
打开LED灯
xxxxxxxxxx
#define LED_MCU_ON() HAL_GPIO_WritePin(LED_MCU_GPIO_Port, LED_MCU_Pin, SET)
#define LED_ROS_ON() HAL_GPIO_WritePin(LED_ROS_GPIO_Port, LED_ROS_Pin, SET)
关闭LED灯
xxxxxxxxxx
#define LED_MCU_OFF() HAL_GPIO_WritePin(LED_MCU_GPIO_Port, LED_MCU_Pin, RESET)
#define LED_ROS_OFF() HAL_GPIO_WritePin(LED_ROS_GPIO_Port, LED_ROS_Pin, RESET)
控制LED灯状态翻转
xxxxxxxxxx
#define LED_MCU_TOGGLE() HAL_GPIO_TogglePin(LED_MCU_GPIO_Port, LED_MCU_Pin)
#define LED_ROS_TOGGLE() HAL_GPIO_TogglePin(LED_ROS_GPIO_Port, LED_ROS_Pin)
读取按键当前状态值,如果按下返回KEY_PRESS=1,松开返回KEY_RELEASE=0。
xxxxxxxxxx
static uint8_t Key1_is_Press(void)
{
if (!HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin))
{
return KEY_PRESS; // 如果按键被按下,则返回KEY_PRESS
}
return KEY_RELEASE; // 如果按键是松开状态,则返回KEY_RELEASE
}
读取按键K1的状态,需要每10毫秒调用一次。按下KEY1按键返回一次KEY_PRESS,其他情况返回KEY_RELEASE。
xxxxxxxxxx
uint8_t Key1_State(void)
{
static uint16_t key1_state = 0;
if (Key1_is_Press() == KEY_PRESS)
{
if (key1_state < 4)
{
key1_state++;
}
}
else
{
key1_state = 0;
}
if (key1_state == 2)
{
return KEY_PRESS;
}
return KEY_RELEASE;
}
每个10毫秒调用Key1_State函数,根据KEY1按键的状态值,控制LED_ROS指示灯亮和灭。
xxxxxxxxxx
while (1)
{
if (Key1_State())
{
if (led_state)
{
led_state = 0;
LED_ROS_OFF();
}
else
{
led_state = 1;
LED_ROS_ON();
}
}
App_Led_Mcu_Handle();
HAL_Delay(10);
}
在STM32CUBEIDE上的文件管理界面选中要编译的项目,点击工具栏上的编译按钮即可开始编译。
如果没有错误或者警告,则提示编译完成。
按住BOOT0键,再按一下RESET键复位,松开BOOT0键,进入串口烧录模式。然后使用串口烧录工具烧录固件到板子上。
如果有STlink或者JLink,也可以使用STM32CUBEIDE一键烧录固件,更加方便快捷。
MCU_LED灯每隔200毫秒闪烁一次。
当按一下KEY1键时,LED_ROS灯亮,再按一下KEY1键,LED_ROS灯熄灭。每按一下KEY1键,都会改变LED_ROS灯的状态。