项目要求:
利用震动传感器实现点灯效果,当传感器察觉震动,led灯亮。否则不亮
接线及引脚:
传感器信号引脚DO接PA4;
led1灯的引脚接PB8;
所以中断的信号源就是PA4引脚;
配置STM32:
PB8设置成output,输出给led。
打开使能中断,这里要注意的是,将抢占优先级设置为2。(主要是要低于滴答计时器的优先级就可以了),默认滴答计时器的优先级是最低的,容易被其他中断干扰,阻塞程序,造成卡死。
代码
/* USER CODE BEGIN 0 */
//重写中断服务函数,如果检测到EXIT中断请求,则进入此函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
//一根中断线上有多个中断源,判断中断源是否来自PA4
if(GPIO_Pin == GPIO_PIN_4)
{
//如果中断源来自PA4(检测要PA4被拉低)
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4) == RESET)
//PB8输出低电平LED灯亮
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);
HAL_Delay(3000);
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);
}
//如果未检测到PA4则,PB8输出高电平,关闭LED1
else
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
}
}
注意:因为使用了Delay延时函数,在main中函数中要调整滴答计时器的优先级,调整为0;
代码为
/* USER CODE BEGIN SysInit */
HAL_NVIC_SetPriority(SysTick_IRQn,0,0);
/* USER CODE END SysInit */