中断函数可以进入,我设置的LED标志也都能动作。在中断服务函数里加的串口数据发送却不能执行,这是为什么。串口程序也单独测过

2019-08-17 03:23发布

u8  conmmend_start[]=         {0x7e,0x03,0x01,0x02,0xef}; //2¥·Å
u8  conmmend_pause[]=         {0x7e,0x03,0x02,0x01,0xef}; //ÔYí£
u8  conmmend_music_down[]=    {0x7e,0x03,0x03,0x00,0xef}; //ÏÂò»Çú
u8  conmmend_music_up[]=      {0x7e,0x03,0x04,0x07,0xef}; //éÏò»Çú

u8 M_Type;   //Ä£ê½Ñ¡Ôñ±êÖ¾
u8 PWM_numb;


u8 cnt=0;

void EXTIX_Init(void)
{

        EXTI_InitTypeDef EXTI_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

    KEY_Init();         //        °′¼ü¶Ë¿ú3õê¼»ˉ

          RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);        //ê1Äü¸′óÃ1|Äüê±Öó

    //GPIOA.7 ÖD¶ÏÏßòÔ¼°ÖD¶Ï3õê¼»ˉÅäÖà  Ï½μÑØ′¥·¢
          GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource7);

          EXTI_InitStructure.EXTI_Line=EXTI_Line7;        //KEY2
          EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;       
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
          EXTI_InitStructure.EXTI_LineCmd = ENABLE;
          EXTI_Init(&EXTI_InitStructure);                 //¸ù¾YEXTI_InitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèEXTI¼Ä′æÆ÷

   //GPIO¡£8          ÖD¶ÏÏßòÔ¼°ÖD¶Ï3õê¼»ˉÅäÖà ϽμÑØ′¥·¢ //KEY1
          GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource9);
          EXTI_InitStructure.EXTI_Line=EXTI_Line9;
          EXTI_Init(&EXTI_InitStructure);                  //¸ù¾YEXTI_InitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèEXTI¼Ä′æÆ÷

   //GPIOA.11          ÖD¶ÏÏßòÔ¼°ÖD¶Ï3õê¼»ˉÅäÖà Ï½μÑØ′¥·¢        //KEY0
          GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource11);
          EXTI_InitStructure.EXTI_Line=EXTI_Line11;
          EXTI_Init(&EXTI_InitStructure);                  //¸ù¾YEXTI_InitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèEXTI¼Ä′æÆ÷




    NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;                        //ê1Äü°′¼üKEY2ËùÔúμÄía2¿ÖD¶Ïí¨μà
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03;        //ÇàÕ¼óÅÏ輶2£¬
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;                                        //×óóÅÏ輶3
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //ê1Äüía2¿ÖD¶Ïí¨μà
          NVIC_Init(&NVIC_InitStructure);


          NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;                        //ê1Äü°′¼üKEY1ËùÔúμÄía2¿ÖD¶Ïí¨μà
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03;        //ÇàÕ¼óÅÏ輶2
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;                                        //×óóÅÏ輶2
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //ê1Äüía2¿ÖD¶Ïí¨μà
          NVIC_Init(&NVIC_InitStructure);            //¸ù¾YNVIC_InitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèNVIC¼Ä′æÆ÷


}


//ía2¿ÖD¶Ï7 8·tÎñ3ìDò
void EXTI9_5_IRQHandler()
{
        u8 t;
        if(M_Type==MODE_GRAPIC)
         {
                        delay_ms(10);//Ïû¶¶
                        if(KEY0==0)    //PA7°′Ï    ±£Ö¤PWM_numbÔú0μ½6Ö®¼ä±ä»ˉ
                         {       
         LED1=0;
                                 LED4=1;
                                 PWM_numb++;
                                 if(PWM_numb>=7)PWM_numb=0;
                         }
                        if(KEY1==0)    //PA9°′ÏÂ
                         {
                                 LED1=1;
                                 LED4=0;
                                 PWM_numb++;
                                 if(PWM_numb==0)PWM_numb=6;                                 
                         }
         }
        if(M_Type==MODE_MUSIC)
                {
                        delay_ms(10);//Ïû¶¶
                 if(KEY0==0)    //PA7°′ÏÂ
                         {       
                                LED2=0;                         
                                for(t=0;t<5;t++)
                                        {
                                                USART_SendData(USART1, conmmend_music_down[t]);//&#207;ò′&#174;&#191;ú1·¢&#203;íêy&#190;Y0x7e,0x03,0x03,0x00,0xef
                                                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//μè′y·¢&#203;í&#189;áê&#248;
                                        }
                         }
                 if(KEY1==0)    //PA8°′&#207;&#194;
                         {
                                LED2=1;       
                                for(t=0;t<5;t++)
                                {
                                        USART_SendData(USART1, conmmend_music_up[t]);//&#207;ò′&#174;&#191;ú1·¢&#203;íêy&#190;Y0x7e,0x03,0x03,0x00,0xef
                                        while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//μè′y·¢&#203;í&#189;áê&#248;
                                }
                         }
                }
        EXTI_ClearITPendingBit(EXTI_Line7); //&#199;&#229;3yLINE7é&#207;μ&#196;&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;
        EXTI_ClearITPendingBit(EXTI_Line8); //&#199;&#229;3yLINE8é&#207;μ&#196;&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;
}       
//ía2&#191;&#214;D&#182;&#207;7 8·t&#206;&#241;3ìDò
void EXTI15_10_IRQHandler()
{
        u8 t;
        delay_ms(10);//&#207;&#251;&#182;&#182;
        if(KEY2==0)    //PA8°′&#207;&#194;
         {
    LED3=~LED3;                 
    if(LED3==0)
                 {
                                M_Type=MODE_GRAPIC;    //&#199;D&#187;&#187;&#214;á×&#212;&#182;¨ò&#229;&#209;Yê&#190;&#196;£ê&#189;£&#172;2¢í£&#214;12¥·&#197;ò&#244;à&#214;
                          LED8=1;
                                for(t=0;t<5;t++)
                                        {
                                                USART_SendData(USART1, conmmend_pause[t]);//&#207;ò′&#174;&#191;ú1·¢&#203;íêy&#190;Y0x7e,0x03,0x02,0x01,0xef
                                                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//μè′y·¢&#203;í&#189;áê&#248;
                                        }
                        }
   if(LED3==1)
                {
                        M_Type=MODE_MUSIC;   //&#199;D&#187;&#187;&#214;áò&#244;à&#214;&#196;£ê&#189;£&#172;2¢2¥·&#197;ò&#244;à&#214;
                        LED8=0;
                        for(t=0;t<5;t++)
                                {
                                        USART_SendData(USART1, conmmend_start[t]);//&#207;ò′&#174;&#191;ú1·¢&#203;íêy&#190;Y0x7e,0x03,0x01,0x02,0xef
                                        while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//μè′y·¢&#203;í&#189;áê&#248;
                                }
                }
        }
        EXTI_ClearITPendingBit(EXTI_Line11); //&#199;&#229;3yLINE0é&#207;μ&#196;&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;  
}       










友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
6条回答
ARM学员
2019-08-17 06:34
仅仅是不能执行吗,系统有没有死掉?在中断里面程序执行的时间尽量短,调用“USART_SendData()”函数程序每发送一个字节MCU会等待标志位置位之后再发送下一字节,用的时间就会很长,你这中断服务函数里面尽然还有“delay_ms(10)”函数,哎,不说其他的,这样的代码水平太低了,还有很大的上升空间呀

一周热门 更多>