1.普通中断
STM32Cube配置
代码如下
#define B1 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)
#define LED1 HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_8)
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin==GPIO_PIN_0)
{
LED1;
}
}#define B1 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)
#define LED1 HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_8)
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin==GPIO_PIN_0)
{
LED1;
}
}
在处理防抖上还没有多想
2.定时器中断
选择为中断模式
选择上升沿产生中断
打开中断
编写中断回调函数
//Key
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin==GPIO_PIN_0)
{
if(led_state%2==0)
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}
else
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}
led_state++;
}
}
3.轮询方式
采用每隔十毫秒扫描一遍的方式
GPIO配置为输入模式
代码:
void TIME()
{
// if(++led_count==1000){led_count=0;led_flag=1;}
if(++key_count==1000){key_count=0;key_scan=1;}
}
void Key_Scan()
{
if(key_scan==1)
{
switch (keystate)
{
case key_check:
{
if(B1==GPIO_PIN_RESET|B2==GPIO_PIN_RESET|B3==GPIO_PIN_RESET|B4==GPIO_PIN_RESET)
{
keystate = key_press;
}
}
break;
case key_press:
{
if(B1==GPIO_PIN_RESET){keystate = key_release;key_value=1;}
else if(B2==GPIO_PIN_RESET){keystate = key_release;key_value=2;}
else if(B3==GPIO_PIN_RESET){keystate = key_release;key_value=3;}
else if(B4==GPIO_PIN_RESET){keystate = key_release;key_value=4;}
}
break;
case key_release:
{
if(B1==GPIO_PIN_RESET|B2==GPIO_PIN_RESET|B3==GPIO_PIN_RESET|B4==GPIO_PIN_RESET)
{
key_time = key_time+10;
}
else
{
keystate = key_check;
key_flag=1;
}
}
break;
}
}
}