1.实现功能
实验板上有三个按键,和三个led灯。当烧入程序后,三个灯都是关断状态。
如果按下其中一个按键,则对应一个led灯变亮。当松开时,对应的led灯关灭。
硬件图如下:
2.软件编程实现
本人使用cubemax配置rcc和引脚。
通过本例程可以来学习头文件的应用,以及枚举的应用。
- 在gpio.h中添加数据类型,Led_TypeDef,KEYState_TypeDef
typedef enum
{
LED0,
LED1,
LED2,
}Led_TypeDef;
typedef enum
{
KEY0 = 0,
KEY1 = 1,
WK_UP = 2,
KEY_NONE = 3,
}KEYState_TypeDef;
2.在gpio.h中添加函数声明,这些函数会在其他.c文件中被调用。
void BSP_LED_On(Led_TypeDef Led);
void BSP_LED_Off(Led_TypeDef Led);
void BSP_LED_Toggle(Led_TypeDef Led);
KEYState_TypeDef BSP_KEY_GetState(void);
- 在gpio.c中声明两个数组
GPIO_TypeDef* GPIO_PORT[] = {LED0_GPIO_Port,
LED1_GPIO_Port,
LED2_GPIO_Port};
const uint16_t GPIO_PIN[] = {LED0_Pin,
LED1_Pin,
LED2_Pin };
4.在gpio.c中定义函数
KEYState_TypeDef BSP_KEY_GetState(void)
{
/* Check the pressed keys */
if(HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin) == GPIO_PIN_RESET)
{
return (KEYState_TypeDef) KEY0;
}
else if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin) == GPIO_PIN_RESET)
{
return (KEYState_TypeDef) KEY1;
}
else if(HAL_GPIO_ReadPin(WK_UP_GPIO_Port,WK_UP_Pin) == GPIO_PIN_SET)
{
return (KEYState_TypeDef) WK_UP;
}
else
{
return (KEYState_TypeDef) KEY_NONE;
}
}
/**
* @brief Turns selected LED On.
* @param Led: LED to be set on
* This parameter can be one of the following values:
* @arg LED0
* @arg LED1
* @arg LED2
* @retval None
*/
void BSP_LED_On(Led_TypeDef Led)
{
HAL_GPIO_WritePin(GPIO_PORT[Led], GPIO_PIN[Led], GPIO_PIN_RESET);
}
/**
* @brief Turns selected LED Off.
* @param Led: LED to be set off
* This parameter can be one of the following values:
* @arg LED0
* @arg LED1
* @arg LED2
* @retval None
*/
void BSP_LED_Off(Led_TypeDef Led)
{
HAL_GPIO_WritePin(GPIO_PORT[Led], GPIO_PIN[Led], GPIO_PIN_SET);
}
/**
* @brief Toggles the selected LED.
* @param Led: LED to be toggled
* This parameter can be one of the following values:
* @arg LED0
* @arg LED1
* @arg LED2
* @retval None
*/
void BSP_LED_Toggle(Led_TypeDef Led)
{
HAL_GPIO_TogglePin(GPIO_PORT[Led], GPIO_PIN[Led]);
}
在此.c文件中,还有引脚初始化的配置,是在cubemax中设置的。按键相连接的引脚设置为输入模式;led相连接的引脚设置为输出模式,推挽输出,无需上拉和下拉。
5.main.c
switch(BSP_KEY_GetState())
{
case KEY0:
BSP_LED_On(LED0);break;
case KEY1:
BSP_LED_On(LED1);break;
case WK_UP:
BSP_LED_On(LED2);break;
default:
BSP_LED_Off(LED0);
BSP_LED_Off(LED1);
BSP_LED_Off(LED2);
break;
}