① 异常(中断)
中断的过程:
(1)保护现场(压栈);
(2)返回地址(终端地址的下一地址)压栈;
(3)PC,ISR(终端子程序);
② 中断嵌套(NVIC)
1、优先级高的可以打断优先级低的;
(1)抢占式优先级
(2)响应式优先级
2、优先级特性:
(1)中断嵌套,抢占高的可以打断抢占低的;
(2)抢占优先级相同时,相应优先级高的起作用;
(3)均相同时,看向量表中位置;
3、使能。
③ EXTI(外部中断)
1、16根线对应十六个管脚号;
2、边沿触发
(1)上升沿;
(2)下降沿;
(3)双边沿;
④ 使用中断方式控制按键
成果:呼吸灯工作,KEY_1控制按下时蜂鸣器响,不按时不响,KEY_2控制呼吸灯颜色。
代码:
#include "Key_Use.h"
#define MAX 20
static u32 j=MAX, i=0, k=0, l=0, a=0, b=0;
void LED_Breath()
{
while(1)
{
if(a==3)
a=0;
if(a == 0)
{
LED_G_OFF();
LED_B_OFF();
LED_R_ON();
HAL_Delay(i);
LED_R_OFF();
HAL_Delay(j);
}
if(a == 1)
{
LED_R_OFF();
LED_B_OFF();
LED_G_ON();
HAL_Delay(i);
LED_G_OFF();
HAL_Delay(j);
}
if(a == 2)
{
LED_R_OFF();
LED_G_OFF();
LED_B_ON();
HAL_Delay(i);
LED_B_OFF();
HAL_Delay(j);
}
if(l < MAX)
{
l++;
i++;
j--;
}
if(l == MAX)
{
k++;
i--;
j++;
}
if(k == MAX)
{
HAL_Delay(100);
k = 0;
l = 0;
}
}
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == P_0)
{
if((Key_1_Scan() & 0x01) == 0x01)
BEEP_ON();
if((Key_1_Scan() & 0x01) == 0x00)
BEEP_OFF();
}
if(GPIO_Pin == P_13)
a++;
}