**
针对HAL库的中断操作,使用按键实例进行说下,以供参考
---------------------------
**
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)//回调函数
{
if(GPIO_Pin==KEY1_GPIO_PIN)
{
HAL_Delay(20);// 延时一小段时间,消除抖动
if(HAL_GPIO_ReadPin(KEY1_GPIO,KEY1_GPIO_PIN)==KEY1_DOWN_LEVEL)//按键1判断
{
BEEP_TOGGLE;
LED1_ON;
LED2_ON;
LED3_ON;
}
__HAL_GPIO_EXTI_CLEAR_IT(KEY1_GPIO_PIN);
}
else if(GPIO_Pin==KEY2_GPIO_PIN)
{
HAL_Delay(20);// 延时一小段时间,消除抖动
if(HAL_GPIO_ReadPin(KEY2_GPIO,KEY2_GPIO_PIN)==KEY2_DOWN_LEVEL)//按键2判断
{
BEEP_TOGGLE;
LED1_OFF;
LED2_OFF;
LED3_OFF;
}
__HAL_GPIO_EXTI_CLEAR_IT(KEY2_GPIO_PIN);
}
}
1.开启中断,配置中断 HAL_TIM_Base_Start_IT( &htim6);//开启基本定时器中断模式计数
2.回调处理(中断处理)
在it.c中的中断函数基本不处理内容,回调函数的中断配置
void TIM2_IRQHandler(void)
{
/* USER CODE BEGIN TIM2_IRQn 0 */
/* USER CODE END TIM2_IRQn 0 */
HAL_TIM_IRQHandler(&htim2);
/* USER CODE BEGIN TIM2_IRQn 1 */
/* USER CODE END TIM2_IRQn 1 */
}
真正的处理在
main.c中的
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
//if(htim == (&htim1))
if(TIM1 == htim->Instance)
{
}
if (htim->Instance == htim3.Instance)
{
}
}
计数模式:
定时器有如下三种计数模式
递增计数模式:计数器从 0 计数到自动重载值,然后重新从 0 开始计数并生成计数器上溢事件。
递减计数模式:计数器从自动重载值开始递减到 0,然后重新从自动重载值开始计数并生成计数器下溢事件。
中心对齐模式:计数器从 0 开始计数到自动重载值 – 1 ,生成计数器上溢事件;然后从自动重载值开始向下计数到 1 并生成计数器下溢事件。之后从0 开始重新计数。
ETR外部脉冲计数器, 标准库获取计数器值用TIM_GetCounter函数,HAL函数中,直接调用值即可配置
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start(&htim1);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,(GPIO_PinState)!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0));
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,(GPIO_PinState)!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0));
printf("num=%d\r\n",htim1.Instance->CNT);
}
/* USER CODE END 3 */
int main(void)
{
HAL_Init();
SystemClock_Config();
LED_GPIO_Init();
BASIC_TIMx_Init();
HAL_TIM_Base_Start_IT(&htimx);
/* 无限循环 */
while (1)
{
if(timer_count==1000)
{
timer_count=0;
LED1_TOGGLE;
LED2_TOGGLE;
LED3_TOGGLE;
}
}
}
/**
* 函数功能: 非阻塞模式下定时器的回调函数
* 输入参数: htim:定时器句柄
* 返 回 值: 无
* 说 明: 无
*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
timer_count++;
}