--中断功能的初步理解
时间:10-02
整理:3721RD
点击:
从电路连接上:PC13--BUTTON
PB7--LED2
PB13--LED3
按键在没有被按下的时候PC13是低电平,当按键被按下之后,对应得电平变为高电平。
首先在STM32CUBEMX选择对应的IO的功能,对应的BUTTON选择为EXIT13的中断的功能。
然后进入对应的GPIO的设置中,设置LED的输出电平,还有就是BUTTON的触发方式。
第一个选项中,可以选择对应的触发方式,上升沿触发,下降沿触发,上升下降沿吃法,根据我们BUTTON的电路,需要在按下的时候响应我们的请求,因此设置为上升沿触发。
接下来就是使能对应的中断,并且设计对应的中断优先级
中断EXIT13是在中断线EXIT15_10上面的,所以如图勾选,在后面的两项中可以设置对应的中断优先级。
设置完以后就可以生成代码。
然后添加我们需要的一些功能,测试一下:
这边首先写一个电平翻转+串口发送的功能。
①串口定向功能
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/**
* @brief Retargets the C library printf function to the USART.
* @param None
* @retval None
*/
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
②:LED控制,作为中断服务程序
void GPIO_Toggle()
{
HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin);
HAL_GPIO_TogglePin(LED3_GPIO_Port, LED3_Pin);
printf("OK");
}
③:中断服务程序
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin==GPIO_PIN_13)
{
GPIO_Toggle();
}
}
通过运行以后可以得到测试结果:
之所以会连续发送,是存在抖动的结果。可以通过软件去抖实现对应的避免,也可以通过硬件电路来解决这个问题。