• UCOSII下外部中断的实现


    1、外部中断初始化函数


    // EXTI initialize 
    void EXTIX_INIT(void)
    {
        EXTI_InitTypeDef EXTI_InitStructure;                            //定义外部中断结构体
    
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);             //使能外部中断时钟
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource1);      //将GPIOA.1与中断线1映射起来
    
        EXTI_InitStructure.EXTI_Line    = EXTI_Line1;                   //设置中断线
        EXTI_InitStructure.EXTI_Mode    = EXTI_Mode_Interrupt;          //中断触发模式
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;         //下降沿触发
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;                       //使能外部中断线
        EXTI_Init(&EXTI_InitStructure);                                 //外部中断初始化
    
        BSP_IntVectSet(BSP_INT_ID_EXTI1,EXTI1_IRQHandler);              //设置中断号跟对应的中断服务函数 
        BSP_IntEn(BSP_INT_ID_EXTI1);                                    //使能指定中断
    }
    • 配置中断初始化时,需要注意的是,在uCOS系统上的中断机制跟裸机上不一样 

    其中几个关键的中断函数(定义在Bsp_int.c)

    void BSP_IntVectSet(CPU_DATA int_id, CPU_FNCT_VOID isr);//设置中断向量及处理中断服务函数,产生中断时将跳至中断服务函数的地址 
    void BSP_IntEn (CPU_DATA int_id) //使能指定中断 
    void BSP_IntDis (CPU_DATA int_id) //禁用指定中断(视程序需要) 
    void BSP_IntDisAll (void) //禁用所有中断(视程序需要)

    2、中断优先级配置


    void NVICSTR_INIT(void)
    {
        NVIC_InitTypeDef NVIC_InitStructure;                                                //定义优先级结构体
    
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);                                     //设置NVIC中断分组
        NVIC_InitStructure.NVIC_IRQChannel                      = EXTI1_IRQChannel;         //使能只能外部中断通道
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority    = 1;                        //抢占优先级1
        NVIC_InitStructure.NVIC_IRQChannelSubPriority           = 0;                        //子优先级0
        NVIC_InitStructure.NVIC_IRQChannelCmd                   = ENABLE;                   //使能外部中断通道
        NVIC_Init(&NVIC_InitStructure);                                                     //中断优先级分组初始化
    }
    • 写优先级分配应该不难,基本都大同小异,不一样的是中断通道的定义名,裸机的定义跟uCOS的定义不一样,这个查一下系统文件就能找到了。 

    在Bsp_int.c中,还有一个函数可用来设置中断优先级,有兴趣的读者可以试试 
    void BSP_IntPrioSet (CPU_DATA int_id, CPU_INT08U prio) //设置中断优先级

    3、中断服务函数

    这里的中断服务函数名可以自己定义,不过也不能太随便,至少要能看出来是哪个中断的对接函数


    //EXTI1 interrupt handle
    void EXTI1_IRQHandler()
    {
        OSIntEnter();
    
        ACounter1 = 30;                             //中断操作
    
        EXTI_ClearITPendingBit(EXTI_Line1);         //清除中断标志位
    
        OSIntExit();   
    
    }

    中断服务函数名需与外部中断初始化中的BSP_IntVectSet()第二个参数一致 
    这里还需讲明一点,函数中用到了OSIntEnter() 与 OSIntExit(),这里大概讲一下作用 
    在uC/OS-II中,通常在进入中断时需要使用OSIntEnter() ;退出中断前使用OSIntExit(); 
    在中断服务函数中使用这对函数,在中断结束后可进行任务调度,使得系统更加“实时” 
    若中断函数的运行不做信号量处理,对任务没有触发作用的,可以忽视不用

    这样就完成了外部中断的配置,把EXTIX_INIT()放入系统初始化函数中,运行时待指定的IO有高低电平触发时,将触发对应的中断操作 

  • 相关阅读:
    异常日志以及非异常日志记录方法
    oracle 监测数据库是否存在指定字段
    listview禁止双击一条之后选中复选框按钮的方法
    oracle 的rowid和rownum
    修改文件的名字的写法
    使用C#读取XML节点,修改XML节点
    BZOJ 1004: [HNOI2008]Cards
    P5022 旅行 (NOIP2018)
    P5021 赛道修建 (NOIP2018)
    P5020 货币系统 (NOIP2018)
  • 原文地址:https://www.cnblogs.com/zhangbing12304/p/9316466.html
Copyright © 2020-2023  润新知