OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2664|回复: 1

在中断服务函数里面改变全局变量给main函数用,结果中断触发不灵敏

[复制链接]

2

主题

5

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2018-5-5
在线时间
8 小时
发表于 2018-5-5 22:44:39 | 显示全部楼层 |阅读模式
1金钱
main函数里面定义全局变量
        volatile u16 data[5]={0x04};
中断服务函数
#include "stm32f10x.h"
#include "exti.h"
#include "LED.h"


//外部中断2服务程序

                extern u16 data[5];          //全局变量

static void NVIC_Configuration(void)
{
                NVIC_InitTypeDef NVIC_InitStructure;
         /*设置NVIC中断分组1: 1位抢占优先级,3位响应优先级*/
          NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);       
       
          NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
    /*设置抢占优先级,抢占优先级设为2*/       
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;       
          /*设置子优先级,子优先级设为1*/
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;               
    /*使能外部中断通*/
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;       
     /*根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器*/               
          NVIC_Init(&NVIC_InitStructure);

          NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
    /*设置抢占优先级,抢占优先级设为2*/       
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;       
          /*设置子优先级,子优先级设为1*/
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;               
    /*使能外部中断通*/
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;       
     /*根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器*/               
          NVIC_Init(&NVIC_InitStructure);
               
                          NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
    /*设置抢占优先级,抢占优先级设为2*/       
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;       
          /*设置子优先级,子优先级设为1*/
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;               
    /*使能外部中断通*/
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;       
     /*根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器*/               
          NVIC_Init(&NVIC_InitStructure);
               
          NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
    /*设置抢占优先级,抢占优先级设为2*/       
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;       
          /*设置子优先级,子优先级设为1*/
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;               
    /*使能外部中断通*/
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;       
     /*根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器*/               
          NVIC_Init(&NVIC_InitStructure);
               
          NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;
    /*设置抢占优先级,抢占优先级设为2*/       
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;       
          /*设置子优先级,子优先级设为1*/
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x04;               
    /*使能外部中断通*/
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;       
     /*根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器*/               
          NVIC_Init(&NVIC_InitStructure);
       
       
        }

void EXTI_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
        EXTI_InitTypeDef EXTI_InitStructure;

    /*开启外设时钟*/
          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO,ENABLE);

    /*初始化  设置为浮空输入*/
          GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
                GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
          GPIO_Init(GPIOC, &GPIO_InitStructure);

       
        //中断线设置
                GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource0);//中断线0
                GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource1);//中断线1
                GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource2);//中断线2
                GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource3);//中断线3
                GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource4);//中断线4

    EXTI_InitStructure.EXTI_Line=EXTI_Line0 | EXTI_Line1 | EXTI_Line2 | EXTI_Line3| EXTI_Line4;
          EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;       
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
          EXTI_InitStructure.EXTI_LineCmd = ENABLE;
          EXTI_Init(&EXTI_InitStructure);                           
               
                /*配置中断控制器NVIC*/
    NVIC_Configuration();
       
}


        EXTI_InitTypeDef EXTI_InitStructure;

        void EXTI0_IRQHandler(void)
        {
               
                if(EXTI_GetITStatus(EXTI_Line0) != RESET)          
                {
                                  EXTI_InitStructure.EXTI_LineCmd = DISABLE;
                                  EXTI_Init(&EXTI_InitStructure);                  
                                        data[0]=GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0);
                                        EXTI_InitStructure.EXTI_LineCmd = ENABLE;
                                  EXTI_Init(&EXTI_InitStructure);         
                }
               
                EXTI_ClearITPendingBit(EXTI_Line0); //清除LINE0上的中断标志位

        }
       
       
                void EXTI1_IRQHandler(void)
        {               
               
                if(EXTI_GetITStatus(EXTI_Line1) != RESET)          
                {
                                        EXTI_InitStructure.EXTI_LineCmd = DISABLE;
                                  EXTI_Init(&EXTI_InitStructure);                  
                                        data[1]=GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_1);
                                        EXTI_InitStructure.EXTI_LineCmd = ENABLE;
                                  EXTI_Init(&EXTI_InitStructure);         
                       
                }
                EXTI_ClearITPendingBit(EXTI_Line1); //清除LINE1上的中断标志位

        }
       
       
        void EXTI2_IRQHandler(void)
{
                if(EXTI_GetITStatus(EXTI_Line1) != RESET)          
                {               
                                  EXTI_InitStructure.EXTI_LineCmd = DISABLE;
                                  EXTI_Init(&EXTI_InitStructure);                  
                                        data[2]=GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_2);
                                        EXTI_InitStructure.EXTI_LineCmd = ENABLE;
                                  EXTI_Init(&EXTI_InitStructure);         
                }
                EXTI_ClearITPendingBit(EXTI_Line5); //清除LINE2上的中断标志位
}       


        void EXTI3_IRQHandler(void)
        {
                if(EXTI_GetITStatus(EXTI_Line3) != RESET)          
                {
                                  EXTI_InitStructure.EXTI_LineCmd = DISABLE;
                                  EXTI_Init(&EXTI_InitStructure);                  
                                        data[3]=GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_3);
                                        EXTI_InitStructure.EXTI_LineCmd = ENABLE;
                                  EXTI_Init(&EXTI_InitStructure);                                
                }
                EXTI_ClearITPendingBit(EXTI_Line3); //清除LINE3上的中断标志位
        }
       
       
        void EXTI4_IRQHandler(void)
        {
                if(EXTI_GetITStatus(EXTI_Line4) != RESET)          
                {
                                  EXTI_InitStructure.EXTI_LineCmd = DISABLE;
                                  EXTI_Init(&EXTI_InitStructure);                  
                                        data[4]=GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_4);
                                        EXTI_InitStructure.EXTI_LineCmd = ENABLE;
                                  EXTI_Init(&EXTI_InitStructure);                                
                }
                EXTI_ClearITPendingBit(EXTI_Line4); //清除LINE4上的中断标志位                
        }
       
line2的中断感觉触发不了,而且程序有点跑偏的感觉





正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-5-6 01:40:29 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-7 13:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表