alai-1031494 发表于 2017-10-30 16:20:56

STM32使用3个串口中断和1个外部中断的问题

使用USART1发送,USART2接收,USART3发送和接收,另外使用PE2作为外部中断线。
在NVIC_Configuration()中当注释钓USART3的设置时,程序运行都正常。但是不注释的时候,USART1的发送就没有了,很奇怪,哪个高人给分析分析。
void NVIC_Configuration(void)
{
        NVIC_InitTypeDefNVIC_InitStructure;
       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        //USART1
        NVIC_InitStructure.NVIC_IRQChannel                                                                        = USART1_IRQn;//ÉèÖÃIRQͨµÀ
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//ÉèÖÃÏÈÕ¼ÓÅÏȼ¶
        NVIC_InitStructure.NVIC_IRQChannelSubPriority                        = 1;//ÉèÖôÓÓÅÏȼ¶       
        NVIC_InitStructure.NVIC_IRQChannelCmd                                                        = ENABLE;//ʹÄÜ»òʧÄÜIRQͨµÀ
        NVIC_Init(&NVIC_InitStructure);       
       
        //USART2
        NVIC_InitStructure.NVIC_IRQChannel                                                                        = USART2_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority                        = 2;
        NVIC_InitStructure.NVIC_IRQChannelCmd                                                        = ENABLE;
        NVIC_Init(&NVIC_InitStructure);       

        //USART3
/*        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        NVIC_InitStructure.NVIC_IRQChannel                                                                        = USART3_IRQn;//ÉèÖÃIRQͨµÀ
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//ÉèÖÃÏÈÕ¼ÓÅÏȼ¶
        NVIC_InitStructure.NVIC_IRQChannelSubPriority                        = 3;//ÉèÖôÓÓÅÏȼ¶       
        NVIC_InitStructure.NVIC_IRQChannelCmd                                                        = ENABLE;//ʹÄÜ»òʧÄÜIRQͨµÀ
        NVIC_Init(&NVIC_InitStructure);*/



//Int2:PPS
        NVIC_InitStructure.NVIC_IRQChannel                                                                        = EXTI2_IRQn;//ÉèÖÃIRQͨµÀ
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//ÉèÖÃÏÈÕ¼ÓÅÏȼ¶
        NVIC_InitStructure.NVIC_IRQChannelSubPriority                        = 0;//ÉèÖôÓÓÅÏȼ¶       
        NVIC_InitStructure.NVIC_IRQChannelCmd                                                        = ENABLE;//ʹÄÜ»òʧÄÜIRQͨµÀ
        NVIC_Init(&NVIC_InitStructure);       
}






无薪税绵 发表于 2017-11-23 16:34:47

看你代码中,USART3的中断没有做处理。
你添加处理代码,看看能不能进入中断。

如果不行,试试提升USART3的中断优先级。
如果还是不行,试试注释串口1和2的代码,
先试串口3,看正不正常。
正常了,再还原测试。

还有,
建议初始化串口后,用 USART_GetITStatus 函数,
把 发送完成标志 USART_FLAG_TC 清一下。

聪神聪 发表于 2017-11-24 10:54:15

楼主,看了下你的串口中断处理函数,我的建议是你USART1发送中断完全没必要,amount最大好像72来着,发送能不用中断就不用。用类似下面这种函数发送就好了,希望对你有帮助:lol
void USART3_SendString(u8 *s)
{
        while(*s)
        {
               USART_SendData(USART3,*s++);
   while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET);                  
        }
}

聪神聪 发表于 2017-11-24 10:59:30

刚函数发错了,你的数组里面有很多0x00。你试试这个函数
void USART3_SendBuffer(u8 *s,u8 n)
{
        while(n--)
        {
               USART_SendData(USART3,*s++);
   while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET);                  
        }
}
页: [1]
查看完整版本: STM32使用3个串口中断和1个外部中断的问题