外部中断exit

外部中断EXIT
中断的原理
  • 不同的硬件对应不同的中断,计算机的中断系统能够加强CPU对多任务事件的处理能力。中断机制是现代计算机系统中的基础设施之一,它在系统中起着通信网络作用,以协调系统对各种外部事件的响应和处理。中断是实现多道程序设计的必要条件。 中断是CPU对系统发生的某个事件作出的一种反应。 引起中断的事件称为中断源。中断源向CPU提出处理的请求称为中断请求。发生中断时被打断程序的暂停点称为断点。CPU暂停现行程序而转为响应中断请求的过程称为中断响应。处理中断源的程序称为中断处理程序。CPU执行有关的中断处理程序称为中断处理。而返回断点的过程称为中断返回。中断的实现实行软件和硬件综合完成,硬件部分叫做硬件装置,软件部分称为软件处理程序。
    在这里插入图片描述
  • 只有产生中断的时候,程序才会跳出主程序去执行中断程序,这样不仅可以解决系统重复扫描判断以至于占用过多系统资源的问题,也可以简化系统结构。
中断程序
  • 中断优先级程序(决定了在多个中断产生时的解决顺序)
    static void EXIT_NVIC_Config(void) //static强调只能在此文件中使用
    {
    NVIC_InitTypeDef NVIC_InitStruct;
    /* NVIC初始化结构体 */
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //优先级分组
    NVIC_InitStruct.NVIC_IRQChannel = EXTI2_IRQn; //中断源
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1; //子优先级
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE ; //中断使能
    NVIC_Init(&NVIC_InitStruct);
    }

配置中断优先级分组:抢占优先级和子优先级
形参如下:
NVIC_PriorityGroup_0: 0bit for 抢占优先级
4 bits for 子优先级
NVIC_PriorityGroup_1: 1 bit for 抢占优先级
3 bits for 子优先级
NVIC_PriorityGroup_2: 2 bit for
2 bits for 子优先级
NVIC_PriorityGroup_3: 3 bit for 抢占优先级
1 bits for 子优先级
NVIC_PriorityGroup_4: 4 bit for 抢占优先级
0 bits for 子优先级
注意 如果优先级分组为 0,则抢占优先级就不存在,优先级就全部由子优先级控制,反之,则由抢占优先级控制

  • 中断初始化函数(这里采用GPIO口的外部中断)
    void EXTI_Config()
    {
    GPIO_InitTypeDef GPIO_InitStruct;
    EXTI_InitTypeDef EXTI_InitStruct;
    //结构体名称必须在{ 的后面
    EXIT_NVIC_Config(); //调用中断优先级程序

    /* GPIO结构体 */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2; //输入不用设置传输速度
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA,&GPIO_InitStruct );

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource2);
    //初始化exti
    /* EXTI结构体 */
    EXTI_InitStruct.EXTI_Line = EXTI_Line2;
    EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式
    EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿触发
    EXTI_InitStruct.EXTI_LineCmd = ENABLE; //中断使能
    EXTI_Init(&EXTI_InitStruct);

}

中断服务程序
  • 中断服务程序可以视为子程序,只有当满足条件时才会执行。
    void EXTI2_IRQHandler(void)
    {
    if(EXTI_GetITStatus(EXTI_Line2)!= 0) //响应中断
    GPIO_SetBits( GPIOA,GPIO_Pin_1);
    EXTI_ClearITPendingBit( EXTI_Line2); //清除中断标志位
    }
    (中断服务程序写在stm32f10x_it.c文件中,中断函数名可以在启动文件startup.s中找到)
    中断服务程序不需要写在主程序main中,只需要将其中断初始化函数在程序中调用即可。
    不同的中断源对应从不同的中断服务函数名称
    在这里插入图片描述
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值