提示:小白自学,大神看到不对的地方请指出指导一下。
中断是啥
中断可以这样比喻:你在做一件事情,然后电话打进来,你去做电话里要求你做的是,然后做完了又回来做刚才没做完的事情。
NVIC
嵌套向量中断控制器,属于内核外设,管理着包括内核和片上所有外设的中断相关的功能。
EXTI
外部 中断/事件 控制器
EXTI 有20个中断/事件线,每个GPIO都可以被设置为输入线,占用 EXTI0至EXTI15。
中断分组、主优先级、子优先级
一般来说先选定优先级分组,选好之后就不要改了,因为改分组可能会使程序错乱。然后配置主优先级和子优先级。
如果同一分组里,主优先级相同,子优先级越低,越先发生。如果是主优先级不同,那么主优先级越低,也越先发生。等一个发生完了,再接下一个发生…当然,如果一个优先级高的先发生了,这是来了个低的,是不会打断这个正在发生的。
配置过程分析
用的是按键中断1.初始化要连接到EXTI的GPIO
代码如下(示例):
GPIO_InitTypeDef GPIO_InitStruct; //声明结构体
RCC_APB2PeriphClockCmd(KEY1_INT_GPIO_CLK, ENABLE); //开时钟
GPIO_InitStruct.GPIO_Pin = KEY1_INT_GPIO_PIN; //配置按键的引脚
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; //配置模式
GPIO_Init( KEY1_INT_GPIO_PORT , &GPIO_InitStruct); //端口初始化写入
2.初始化EXTI用于产生中断/事件
代码如下(示例):
EXTI_InitTypeDef EXTI_InitStruct;//声明结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//打开APB2的时钟
GPIO_EXTILineConfig( GPIO_PortSourceGPIOA, GPIO_PinSource0);//选择GPIO引脚作为EXTI线
EXTI_InitStruct.EXTI_Line = EXTI_Line0;//选择EXTI线
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;//选择中断模式
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;//选择上升触发类型
EXTI_InitStruct.EXTI_LineCmd = ENABLE;//EXTI使能
EXTI_Init( &EXTI_InitStruct);
3.初始化NVIC,用于处理中断
代码如下(示例)
NVIC_InitTypeDef NVIC_InitStruct;//声明结构体
NVIC_PriorityGroupConfig( NVIC_PriorityGroup_1);//选择优先级分组
NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;//选择中断源
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;//选择主优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;//选择子优先级
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//中断使能
NVIC_Init( &NVIC_InitStruct);
NVIC_IROChannel:用来设置中断源,不同的中断中断源不一样,且不可写错,即使写错了程序也不会报错,只会导致不响应中断。
有需要的可以去固件库里查所需要的中断源
4.编写中断服务函数
#define LED_G_TOGGLE {LED_GPIO_PORT->ODR ^= LED_GPIO_PIN;}//寄存器异或实现亮灭
void EXTI0_IRQHandler(void)
{
if(EXTI_GetITStatus( EXTI_Line0) != RESET )//检测是否按下
{
LED_TOGGLE;//灯亮灭
}
EXTI_ClearITPendingBit( EXTI_Line0 );//清除
}
5.主函数
int main(void)
{
LED_GPIO_Config();
EXTI_KEY1_Config();
while(1)
{
}
}
总结
算是对STM32的中断有了个了解,会用按键中断来电灯,这算是入门的一大步嘛?哈哈哈,