【NUCLEO-L4R5ZI评测】外部中断&定时器中断
本帖最后由 donatello1996 于 2018-1-18 23:53 编辑外部中断和定时器中断都是单片机中非常重要也非常常用的中断,外部中断存在的意义是避免系统轮询检测GPIO电平的变化,在检测按键输入和传感器状态时尤为重要;而定时器中断则是启动一个独立于主循环的计时,通常用于执行一些实时性较高的任务,如检测传感器的读数。
STM32的HAL库在中断服务函数的处理上算是非常人性化了,结合CubeMX软件,所有定时器中断和外部中断的初始化简直是傻瓜式的操作。STM32的主频和存储容量都很大,因此定时器的可设置范围非常大,精度也挺高。
我们的L4+板子上面有个蓝色的用户按钮,连接着PC13和VCC,因此需要初始化的参数就是EXTI15_10_IRQn中断线以及PC13——上升沿触发——下拉或浮空输入,外部中断触发打印串口信息并翻转红色LED灯(PB14):
void EXTI15_10_IRQHandler_Config()
{
__HAL_RCC_GPIOC_CLK_ENABLE();
GPIO_InitStructure.Mode = GPIO_MODE_IT_RISING;
GPIO_InitStructure.Pull = GPIO_NOPULL;
GPIO_InitStructure.Pin = GPIO_PIN_13;
HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);
HAL_NVIC_SetPriority(EXTI15_10_IRQn,2,0);
HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
}
void EXTI15_10_IRQHandler()
{
if(__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_13) != RESET)
{
printf("按下蓝色按钮,进入外部中断,翻转红色LED灯。\n");
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_14);
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_13);
}
}
配置定时器向上计数模式,不分频,装载值为5000即0.5秒溢出,定时器中断触发打印串口信息并翻转蓝色LED灯(PB7):
void TIM3_Init(int arr,int psc)
{
__HAL_RCC_TIM3_CLK_ENABLE();
TIM3_Handler.Instance=TIM3;
TIM3_Handler.Init.Prescaler=psc;
TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;
TIM3_Handler.Init.Period=arr;
TIM3_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
HAL_TIM_Base_Init(&TIM3_Handler);
HAL_TIM_Base_Start_IT(&TIM3_Handler);
HAL_NVIC_SetPriority(TIM3_IRQn,1,2);
HAL_NVIC_EnableIRQ(TIM3_IRQn);
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim==(&TIM3_Handler))
{
printf("定时器3定时完毕,翻转绿色LED灯。\n\n\n");
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_7);
}
}
效果图:
工程文件:
页:
[1]