DK板子上有两个用户按键:
其中,B1是复位按键,B2是用户按键。
这与原理图是一致的:
在代码中,配置PC13输入模式,并使能下降沿触发中断。
static void EXTI13_IRQHandler_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable GPIOC clock */
__HAL_RCC_GPIOC_CLK_ENABLE();
/* Configure PC.13 pin as input floating */
GPIO_InitStructure.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStructure.Pull = GPIO_NOPULL;
GPIO_InitStructure.Pin = BUTTON_USER_PIN;
HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);
/* Enable and set line 13 Interrupt to the lowest priority */
HAL_NVIC_SetPriority(EXTI13_IRQn, 2, 0);
HAL_NVIC_EnableIRQ(EXTI13_IRQn);
}
初始化LED,这样在按键按下后,可以改变LED的状态。
int32_t BSP_LED_Init(Led_TypeDef Led)
{
int32_t status = BSP_ERROR_NONE;
GPIO_InitTypeDef GPIO_Init;
/* Enable the GPIO_LED Clock */
if (Led == LED9)
{
LED9_GPIO_CLK_ENABLE();
}
else /* Led = LED10 */
{
/* Enable VddIO2 for GPIOG */
__HAL_RCC_PWR_CLK_ENABLE();
HAL_PWREx_EnableVddIO2();
LED10_GPIO_CLK_ENABLE();
}
/* configure the GPIO_LED pin */
GPIO_Init.Pin = LED_PIN[Led];
GPIO_Init.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_Init.Pull = GPIO_PULLUP;
GPIO_Init.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(LED_PORT[Led], &GPIO_Init);
HAL_GPIO_WritePin(LED_PORT[Led], LED_PIN[Led], GPIO_PIN_SET);
return status;
}
下面是中断服务程序:
void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == BUTTON_USER_PIN)
{
/* Toggle LED10 */
BSP_LED_Toggle(LED10);
}
}
编译代码:
arm-none-eabi-size GPIO_EXTI.elf
arm-none-eabi-objdump -h -S GPIO_EXTI.elf > "GPIO_EXTI.list"
text data bss dec hex filename
8088 24 1568 9680 25d0 GPIO_EXTI.elf
Finished building: default.size.stdout
Finished building: GPIO_EXTI.list
22:10:51 Build Finished. 0 errors, 0 warnings. (took 4s.653ms)
烧录程序,失败了,看来ST-LINK升级在所难免。
点击open in update mode
升级成功
点击小虫子进入debug模式,之后全速运行
按下板子上的用户按键,小灯状态会进行翻转。
|