奇怪现象 中断屏蔽EXTI->IMR&=0<<1; 一加另外一个中断都进不了,搞了好久,求大神帮忙

2019-08-17 05:53发布

#include "delay.h"
 #include "sys.h"
  #include "usart.h"
 #include "ov7620.h"
 #include "timer.h"
 #include "dma.h"
 #include "led.h"
 #include "LCD.h"
///初始化引脚PA1,PA6,PA11,PB0~7
 void GPIO_INT()
 {  
  RCC->APB2ENR |=1<<3;    //使能PORTB时钟
 GPIOB->CRL &=0x00000000;
 GPIOB->CRL |=0x88888888;   //PB0~7设置为浮空输入
 
 RCC->APB2ENR |=1<<2;    //使能PORTA时钟
 GPIOA->CRH&=0XFFF0FFFF;
 GPIOA->CRH|=0X00080000;     //PA12输入
  GPIOA->ODR|=1<<12;     //PA12上拉  GPIOA->CRL &=0xF0FFFF0F;
 GPIOA->CRL |=0x08000080;   //PA1,PA6设置为浮空输入
 GPIOA->ODR|=0<<1;     //PA1下拉
  GPIOA->ODR|=0<<6;     //PA6下拉  
 }     //外部中断0服务程序
//初始化PA13,PD2为中断输入.
void EXTIX_Init(void)
{
  EXTI_InitTypeDef EXTI_InitStructure;
 
 JTAG_Set(0X02);                                       //关闭JTAG和SWD   JTAG_SWD_DISABLE=0X02
 
   
//GPIOA.1中断线以及中断初始化配置
   GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource1); //配置引脚与中断的连接
   EXTI_InitStructure.EXTI_Line=EXTI_Line1;        //修改点
   EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; 
   EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;     //上升沿触发
   EXTI_InitStructure.EXTI_LineCmd = ENABLE;
   EXTI_Init(&EXTI_InitStructure);                             //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
 
//GPIOA.12中断线以及中断初始化配置
 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource12); //配置引脚与中断的连接
   EXTI_InitStructure.EXTI_Line=EXTI_Line12;        //修改点
   EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; 
   EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;    //下降沿触发
   EXTI_InitStructure.EXTI_LineCmd = ENABLE;
   EXTI_Init(&EXTI_InitStructure);                          //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
 
 MY_NVIC_Init(2,1,EXTI1_IRQn,2);                          //抢占2,子优先级1,组2 
    MY_NVIC_Init(2,2,EXTI15_10_IRQn,2);                        //抢占2,子优先级2,组2
 EXTI->IMR&=0<<1;                                           //  关闭line BIT1上的中断
    EXTI->EMR&=0<<1;                                           //  屏蔽line BIT1上的中断
  }
//串口数据发送
//u8 szm; //行数
void CLHS_sj(void)
{
     u8 m,i;
  while(USART_RX_STA&0X80==0);
  
  USART1->DR= 0X00;             //协议码
     while ((USART1->SR&0X40)==0);
     USART1->DR= 0Xff;         
    while ((USART1->SR&0X40)==0);
 
  USART1->DR= 0X01;         
     while ((USART1->SR&0X40)==0);
     USART1->DR= 0X00;         
    while ((USART1->SR&0X40)==0);   
  for(i=0;i<40;i++)
     {
   for(m=0;m<120;m++)   
   {
     USART1->DR=ov7620_Buf[m];         
         while((USART1->SR&0X40)==0);         //等待发送结束
   }
     }
}
 u8 kaishizd;
u8 ghs;             //采样的隔行数
u8 HANGSHUJU;     //行的数据
    //外部中断12 服务程序
void EXTI15_10_IRQHandler()

   if(EXTI_GetITStatus(EXTI_Line12) != RESET)
 { LED1=~LED1;
 //  HANGSHUJU=0;
   EXTI->IMR|=1<<1; //  开启line BIT1上的中断
      EXTI->EMR|=1<<1; //  开启line BIT1上的中断
   EXTI->IMR&=0<<12;//  关闭line BIT12上的中断
      EXTI->EMR&=0<<12;//  屏蔽line BIT12上的中断
   EXTI->R=1<<12;
 }    
}
 
void EXTI1_IRQHandler() 

    if(EXTI_GetITStatus(EXTI_Line1) != RESET) 
 { HANGSHUJU++;
 // LED0=~LED0;
  if(HANGSHUJU>0||HANGSHUJU<53) ghs=4;  
  if(HANGSHUJU>52||HANGSHUJU<181) ghs=6;
  if(HANGSHUJU>180||HANGSHUJU<240) ghs=12;
  if(HANGSHUJU==240)
  {  LED0=~LED0;
    CLHS_sj();
    EXTI->IMR&=0<<1;//  关闭line BIT1上的中断
          EXTI->EMR&=0<<1;//  屏蔽line BIT1上的中断  
    EXTI->IMR|=1<<12;//  开启line BIT12上的中断
          EXTI->EMR|=1<<12;//  开启line BIT12上的中断
      
  } 
   if(HANGSHUJU%ghs==0)
   {  
   MYDMA_Enable(DMA1_Channel6);
   }
   EXTI->R=1<<1;
  }
}


  u8 hdsj; //采集的行数目
u16 ov7620_Buf[40][120];   //第一数组
//u8 baochun;  //用于数据保存
u8 SHUODING; //锁定用于判断数组    //DMA1的各通道配置
//从存储器->外设模式/8位数据宽度/存储器增量模式
//DMA_CHXMA通道CHX
//cpar:外设地址
//cmar:存储器地址
//cndtr:数据传输器
void MYDMA_Config(DMA_Channel_TypeDef*DMA_CHx)
{ u32 DR_Base;                  //做缓冲器,不知道为什么非要不可
 RCC->AHBENR|=1<<0;            //开启DMA1时钟
 __nop();                      //等待 DMA1 时钟稳定
    __nop();                      //经测试最少 2 个 nop
    __nop();
 DR_Base=OV7620_DATA;
 DMA_CHx->CPAR=DR_Base;    //DMA1 外设地址
 DMA_CHx->CMAR=(u32)ov7620_Buf[0];   //DMA1, 存储器地址
 DMA_CHx->CNDTR=240;                 //DMA1,传输数据量
 DMA_CHx->CCR=0X00000000;   //复位
 DMA_CHx->CCR|=0<<4;      //从外设器件读数据
 DMA_CHx->CCR|=0<<5;                 //普通模式 
 DMA_CHx->CCR|=0<<6;      //外设地址非增量模式
 DMA_CHx->CCR|=1<<7;      //存储器增量模式
 DMA_CHx->CCR|=1<<8;      //外设数据宽度为16位
 DMA_CHx->CCR|=1<<10;     //存储器数据宽度16位
 DMA_CHx->CCR|=1<<13;     //高优先级
 DMA_CHx->CCR|=0<<14;     //非存储器到存储器模式 
// DMA_CHx->CCR|=1<<5;      //循环模式
 DMA_CHx->CCR|=1<<1;      //传输完成中断使能
//  DMA_CHx->CCR|=1<<0;      //开启DMA传输
 MY_NVIC_Init(1,1,DMA1_Channel6_IRQn,1);//抢占2,子优先级1,组1
   
}
        //DMA中断函数
 void DMA1_Channel6_IRQHandler()
{
 
 KAISHI(DMA1_Channel6);
 
}
//开启一次DMA传输
void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)
{
 TIM3->DIER|=1<<9;           //捕获比较1事件的DMA请求使能
 DMA_CHx->CCR|=1<<0;            //开启DMA传输  
} //从新设定目的寄存器
void KAISHI(DMA_Channel_TypeDef*DMA_CHx)
 { 
   DMA_CHx->CCR&=~(1<<0);     //关闭DMA传输
  hdsj++;
  if(hdsj>39)
   hdsj=0;
  DMA_CHx->CNDTR=120 ;         //DMA1,传输数据量
  DMA_CHx->CMAR=(u32)ov7620_Buf[hdsj];  //DMA1, 存储器地址 
    
 }
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。