PA11和PA12的GPIO设置:
//main.c
GPIO_InitStruct.Pin = GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;//PA11下降沿触发中断
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; //PA12下降沿触发中断
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_NVIC_SetPriority(EXTI15_10_IRQn,0,0);//设置中断优先级,enable中断向量表
HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
接下来需要在stm32f1xx_it.c中实现EXTI15_10_IRQHandler:
void EXTI15_10_IRQHandler(void){
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_11)!=0){
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_11);
}
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_12)!=0){
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12);
}
}
然后调用HAL_GPIO_EXTI_Callback来判断并处理中断,消除标志位:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
switch(GPIO_Pin){
caseGPIO_PIN_11:
printf("Pressed\r\n");
mode=!mode; //更改模式
break;
caseGPIO_PIN_12: //增加一圈距离
counter++;
break;
}
}
定时器中断:
定时器初始化:
void MX_TIM3_Init(void)
{
TIM_ClockConfigTypeDef sClockSourceConfig;
TIM_MasterConfigTypeDef sMasterConfig;
TIM_Handler.Instance = TIM3;
TIM_Handler.Init.Prescaler = 48000;
TIM_Handler.Init.CounterMode = TIM_COUNTERMODE_UP;
TIM_Handler.Init.Period = 199; //200ms
TIM_Handler.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_Base_Init(&TIM_Handler);
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
HAL_TIM_ConfigClockSource(&TIM_Handler, &sClockSourceConfig);
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
HAL_TIMEx_MasterConfigSynchronization(&TIM_Handler,&sMasterConfig);
}
计时器中断处理函数:
//stm32f1xx_it.c
void TIM3_IRQHandler(void)
{
HAL_TIM_IRQHandler(&TIM_Handler);
}
//main.c
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef*htim){
if(htim->Instance == TIM3){
timer_flag= 1; //设置flag
timer_counter++;
}