• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

一个仪器通过按键设置参数(写eeprom)时,无法用外部中断

huihui163 2017-05-08 浏览量:933

一个仪器通过按键设置参数(写eeprom)时,无法用外部中断,就是设置的四个数字,比如设置到第二个数字时,不想设置了,想退出,但是退不出来,只有设置完四个数字后才退出设置状态,用外部中断也打不断

     #define  s1  PB_IDR_bit.IDR7  
     #define  s2  PB_IDR_bit.IDR4
     #define  s3  PB_IDR_bit.IDR0  
     #define  s4  PB_IDR_bit.IDR6//PD_IDR_bit.IDR6  

void KEY2Init() //PB0做外部中断
{
        
  PB_DDR_bit.DDR0 = 0;      //
  PB_CR1_bit.C10 = 1;       //GPB->PIN2 
  PB_CR2_bit.C20 = 1;  //1     //GPB->PIN2    
  EXTI_CR1_bit.P0IS = 2;//2    //Portx       
  EXTI_CONF_bit.PBLIS = 0;  //PB[3:0]
        
}


#pragma vector = EXTI0_vector    //2       //外部中断线2_中断向量号
__interrupt void GPIOB_Line0_IRQHandler(void) //2
{
  if(EXTI_SR1_bit.P0F == 1)  //2  
  {
    delay(2000);
       if(EXTI_SR1_bit.P0F == 1)
         {
           EXTI_SR1_bit.P0F = 1;//清除中断标志
         //PD_ODR_bit.ODR3 = 0;   //关背开
           //delay(1500);
           //delay(1500);
         //PD_ODR_bit.ODR3 = 1;   //关背光
            
               if(te == 0) te = 1;
               else te = 0;
    //if(PB_ODR_bit.ODR0 == 0)delay(300);
   //LED4_ON();
   //delay(100);
   //LED4_OFF();
   //delay(100);
    }
  }
}

 void EEPROM_Word_Write(unsigned int address , unsigned char *data)
{
	eepromaddress = address;

	FLASH_CR1_bit.FIX = 1;      //设定编程时间为标准编程时间

	//MASS 密钥,解除EEPROM的保护
	FLASH_DUKR = 0xae; //P
	FLASH_DUKR = 0x56; //P

	FLASH_CR2_bit.WPRG = 1;     //设置字编模式

	*((unsigned int *)address) = data[0]; //写第一个字节    //char
        //while(FLASH_IAPSR_bit.EOP == 1);    
	*(((unsigned int *)address) + 1) = data[1];     //写第二个字节
        //while(FLASH_IAPSR_bit.EOP == 1);    
	*(((unsigned int *)address) + 2) = data[2];     //写第三个字节
        //while(FLASH_IAPSR_bit.EOP == 1);    
	*(((unsigned int *)address) + 3) = data[3];     //写第四个字节

	while(FLASH_IAPSR_bit.EOP == 1);                //等待编程结束
}


void ADC_key_t(void)
   {
     uchar  mr=0x2d,mt=0x25,mm=0x1c,me=0x13;  
     uchar  mh=0x01;  //0x02
     uchar  Di=0;
       // delay(2000);
       // if(s1==0) return;
         //PD_ODR_bit.ODR3 = 0;
      clear_screen();
      
     if(s2 == 0x00)       //
          {   //PD_ODR_bit.ODR3 = 0;
            //delay(200);
              Di=0;
             
              while(s2 != 0x00)
              {delay(200); FeedTheIWDog();
              }
              while(s2 == 0x00)  
              {
                delay(300);//while(PA_IDR_bit.IDR4 == 0x00);       
                  Di++;   if(Di==10) Di=0;
              if(Di==0){display_graphic_8x16(mh,mr,ing0);}   
              if(Di==1){display_graphic_8x16(mh,mr,ing1);}  //Dgh_kong;          
              if(Di==2){display_graphic_8x16(mh,mr,ing2);}
              if(Di==3){display_graphic_8x16(mh,mr,ing3);}
              if(Di==4){display_graphic_8x16(mh,mr,ing4);}
              if(Di==5){display_graphic_8x16(mh,mr,ing5);}
              if(Di==6){display_graphic_8x16(mh,mr,ing6);}
              if(Di==7){display_graphic_8x16(mh,mr,ing7);}
              if(Di==8){display_graphic_8x16(mh,mr,ing8);}
              if(Di==9){display_graphic_8x16(mh,mr,ing9);}
              delay(5000); //FeedTheIWDog();
              }
              
              D_data[0]=S_qianwei = Di;//设置千位
             // EEPROM_Word_Write(0x1000, D_data);
             //------------------------------------------------ 
              
              while(s2 != 0x00)
              {delay(200); FeedTheIWDog();
              }
              while(s2 == 0x00)
              {      
                   Di++;   if(Di==10) Di=0;  
              if(Di==0){display_graphic_8x16(mh,mt,ing0);}   
              if(Di==1){display_graphic_8x16(mh,mt,ing1);}
              if(Di==2){display_graphic_8x16(mh,mt,ing2);}
              if(Di==3){display_graphic_8x16(mh,mt,ing3);}
              if(Di==4){display_graphic_8x16(mh,mt,ing4);}
              if(Di==5){display_graphic_8x16(mh,mt,ing5);}
              if(Di==6){display_graphic_8x16(mh,mt,ing6);}
              if(Di==7){display_graphic_8x16(mh,mt,ing7);}
              if(Di==8){display_graphic_8x16(mh,mt,ing8);}
              if(Di==9){display_graphic_8x16(mh,mt,ing9);}     
                       //display_graphic_8x16(0x04,0x50,Dgh_kong);
               delay(2000); //FeedTheIWDog();
              }
            
               D_data[1]=S_baiwei = Di;//设置百位
              //EEPROM_Word_Write(0x1000, D_data);
               //-------------------------------------------------
              
              while(s2 != 0x00)
              {delay(200); FeedTheIWDog();
              }
              while(s2 == 0x00)
              {      
                  Di++;   if(Di==10) Di=0;  
              if(Di==0){display_graphic_8x16(mh,mm,ing0);}   
              if(Di==1){display_graphic_8x16(mh,mm,ing1);}
              if(Di==2){display_graphic_8x16(mh,mm,ing2);}
              if(Di==3){display_graphic_8x16(mh,mm,ing3);}
              if(Di==4){display_graphic_8x16(mh,mm,ing4);}
              if(Di==5){display_graphic_8x16(mh,mm,ing5);}
              if(Di==6){display_graphic_8x16(mh,mm,ing6);}
              if(Di==7){display_graphic_8x16(mh,mm,ing7);}
              if(Di==8){display_graphic_8x16(mh,mm,ing8);}
              if(Di==9){display_graphic_8x16(mh,mm,ing9);}
              delay(2000); //FeedTheIWDog();
              }
             //-------------------------------------------------
               D_data[2]=S_shiwei = Di;//设置十位
              //EEPROM_Word_Write(0x1000, D_data);
              //-------------------------------------------------
              
              while(s2 != 0x00)
              {delay(200); //FeedTheIWDog();
              }   
              while(s2 == 0x00)  
              {      
                  Di++;   if(Di==10) Di=0;  
              if(Di==0){display_graphic_8x16(mh,me,ing0);}   
              if(Di==1){display_graphic_8x16(mh,me,ing1);}
              if(Di==2){display_graphic_8x16(mh,me,ing2);}
              if(Di==3){display_graphic_8x16(mh,me,ing3);}
              if(Di==4){display_graphic_8x16(mh,me,ing4);}
              if(Di==5){display_graphic_8x16(mh,me,ing5);}
              if(Di==6){display_graphic_8x16(mh,me,ing6);}
              if(Di==7){display_graphic_8x16(mh,me,ing7);} 
              if(Di==8){display_graphic_8x16(mh,me,ing8);}
              if(Di==9){display_graphic_8x16(mh,me,ing9);}
              delay(2000); //FeedTheIWDog();
              }
             
              D_data[3] = S_gewei = Di;  //设置个位
             //---------------------------------------------------
              S_Data = S_qianwei*1000 + S_baiwei*100 + S_shiwei*10 + S_gewei;//设置的参数
              EEPROM_Word_Write(0x1000, D_data);
               
        } 
     }
int main(void)
{ 
    CLK_CKDIVR = 0x00;     //内部时钟为1分频 = 16Mhz                
    asm("sim"); //关闭系统总中断  
    LED1_Init();
    KEY1Init();
    ADC_Init();
    Timer4Init();                               
    KEY2Init(); 
    KEY6Init(); 
   
     eepromaddress = 0x1000; //设EEPROM的首地址为0X1000    
    D_data[0] = *((unsigned int*)eepromaddress);         //读第一个字节数据   
    D_data[1] = *(((unsigned int*)eepromaddress) + 1);   //读第二个字节数据 
    D_data[2] = *(((unsigned int*)eepromaddress) + 2);   //读第三个字节数据
    D_data[3] = *(((unsigned int*)eepromaddress) + 3);   //读第四个字节数据  
      Ddata_read ();//液晶屏显示数据
      
             //--------------------------------------------
    S_Data = D_data[0]*1000 + D_data[1]*100 + D_data[2]*10 + D_data[3];    
 //-------------------------------------------------------   
         asm("rim");   //打开系统总中断            
      
    while(1)  
	  {     
              
		
            
              
      
                 
     
          if((s1==1)&&(s2==0)) {delay(200);PD_ODR_bit.ODR3 =!PD_ODR_bit.ODR3;}  
    //**********************************************************************************************************
          if((s1==0)&&(s2==1))  {delay(200);PD_ODR_bit.ODR4 = !PD_ODR_bit.ODR4;}                 
     //**********************************************************************************************************  
          if((s1==0)&&(s2==0)) {PD_ODR_bit.ODR3 = 0;PD_ODR_bit.ODR4 = 0; ADC_key_t();PD_ODR_bit.ODR3 = 1; } //fg=0;
          }   
}      
0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 您有Code可以上傳描述嗎?

    看文字描述不太清楚問題在哪

    EEPROM是走One Wire,以時序來傳送Data,

    不管ISR還是Busy waiting,

    可隨時中斷傳輸的,

    但具體要看您寫法,

    以上可再討論


    • 发布于 2017-05-08
    • 举报
    • 评论 8
    • 0
    • 0
huihui163 回复了 MOP:代码已上传,您可以看一下, 回复
huihui163 回复了 MOP:还有个问题,写完eeprom后程序是怎么执行的 回复
MOP 回复了 huihui163:不太完整s1,s2沒看到定義,不過您的ADC_key_t函數中,所有設置都是while loop,一般來說中斷是優先級的,您的中斷函數也可以列上去嗎? 看看是否中斷函數設置,啟用有問題 回复
MOP 回复了 MOP:且全局中斷也有問題: 應該是 开总中断 _asm(“rim”); 禁止中断 _asm(“sim”); 进入停机模式 _asm(“halt”); 中断返回 _asm(“iret”); 等待中断 _asm(“wfi”); 软件中断 _asm(“trap”); 回复
MOP 回复了 huihui163:而您的是asm("sim"); 和asm("sim"); 回复
MOP 回复了 MOP:asm(“rim”); 回复
huihui163 回复了 MOP:你好,我的外部中断应该没问题吧,不设置参数时,外部中断可以正常使用,就是设置时外中断不起作用 回复
MOP 回复了 huihui163:您再把整份Code發上來也可,因為這樣不太好看問題在哪,中斷打開和關閉是_asm(..),而您的是asm(...),所以我才有疑問 回复

其他答案 数量:5
  • 仪器?指的是单片机吧?你没设置完没法退出,说明程序就是没设置完一直while死等,这个没办法,解决方法呢,要么就按复位键,要么就重新烧程序。至于外部中断没法打断的问题,估计是程序里面设置了屏蔽外部中断。

    • 发布于2017-05-08
    • 举报
    • 评论 4
    • 0
    • 0
huihui163 回复了 donatello :单片机用的是stm8l151k4,查资料说如果没有RWW功能的话是写eeprom时,所有外中断和定时器中断都关闭了 回复
donatello 回复了 huihui163 :程序如果单纯在死等的话外部中断是可以打断的,不然这个死等是发生在子函数里面? 回复
huihui163 回复了 donatello :设置时按一下按键触发中断不起作用,设置完了,刚才按那个按键才起作用 回复
huihui163 回复了 donatello :代码已上传,您可以看一下, 回复

  • 看一下代码吧,应该是做了限制了的。

    应该是写EEPROM时关中断了吧。

    会判断是不是设置完成了4个数,设置完了再开中断,没有设置完就等着。

    • 发布于2017-05-08
    • 举报
    • 评论 3
    • 0
    • 0
huihui163 回复了 汉云 :单片机用的是stm8l151k4,查资料说如果没有RWW功能的话是写eeprom时,所有外中断和定时器中断都关闭了 回复
huihui163 回复了 汉云 :代码已上传,您可以看一下, 回复
huihui163 回复了 汉云 :你好,我中断一直开着呢 回复

  • 这个可能是程序的结构设计的问题,中断应该是被屏蔽了(一般的有 进一个函数处理 会关中断,出函数 在开中断的情况)
    • 发布于2017-05-08
    • 举报
    • 评论 2
    • 0
    • 0
huihui163 回复了 Eagleson :单片机用的是stm8l151k4,查资料说如果没有RWW功能的话是写eeprom时,所有外中断和定时器中断都关闭了 回复
huihui163 回复了 Eagleson :代码已上传,您可以看一下, 回复

  • 你要启用外部中断才行,这个在程序里面就要实现,就是说你在程序里面用一个中断跳转指令,一旦检测到退出的信号就跳出循环设置


    找个程序给你吧,参考一下这篇文章http://www.doc88.com/p-087373540971.html

    • 发布于2017-05-08
    • 举报
    • 评论 2
    • 0
    • 0
huihui163 回复了 chen0000009 :代码已上传,您可以看一下, 回复
chen0000009 回复了 chen0000009 :你的中断跳转指令呢? 回复

  • 可能是你的单片机的问题,用i2c的外置eeprom,随时能中断
    • 发布于2017-05-08
    • 举报
    • 评论 2
    • 0
    • 0
huihui163 回复了 xukejing :代码已上传,您可以看一下, 回复
huihui163 回复了 xukejing :代码已上传,您可以看一下, 回复

相关问题

问题达人换一批

一个仪器通过按键设置参数(写eeprom)时,无法用外部中断