读取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 GPIOCvoid 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。
xxxxxxxxxxstatic 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。
xxxxxxxxxxuint8_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指示灯亮和灭。
xxxxxxxxxxwhile (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灯的状态。
