AnsweredAssumed Answered

STM32F407 using two usart interrups simultaneously

Question asked by yarmohammadi.amir on Nov 7, 2016
Latest reply on Nov 8, 2016 by Clive One
Hi,

I have a problem reading data simultaneously in usart1 and usart2 receive interrupts , in usart2 RX interrupt I can read continues incoming data package at 50Hz , each package size is 9 bytes , a header byte , 6 bytes of data and 2 bytes of checksum , I have no problem in this part , but simultaneously I need to read data from a device connected to usart1 , I can not receive correct data package in usart1 RX interrupt , the package size is not fix and it is between 8 to 32 bytes including checksum bytes , sometimes I receive checksum error and sometimes I can not receive complete package .

this is my usart1 and usart2 implementation code :

void init_USART1(uint32_t baudrate)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    USART_InitTypeDef USART_InitStruct;
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
    
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
    
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;         
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;        
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;            
    GPIO_Init(GPIOA, &GPIO_InitStruct);                
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);
    USART_InitStruct.USART_BaudRate = 38400;            
    USART_InitStruct.USART_WordLength = USART_WordLength_8b;
    USART_InitStruct.USART_StopBits = USART_StopBits_1;        
    USART_InitStruct.USART_Parity = USART_Parity_No;        
    USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStruct.USART_Mode = /*USART_Mode_Tx |*/ USART_Mode_Rx;
    USART_Init(USART1, &USART_InitStruct);        
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
    
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;    
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;        
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            
    NVIC_Init(&NVIC_InitStructure);                        

    USART_Cmd(USART1, ENABLE);
}

void init_USART2(uint32_t baudrate)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    USART_InitTypeDef USART_InitStruct;
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);    
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;             
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;    
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;            
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;            
    GPIO_Init(GPIOA, &GPIO_InitStruct);                    
    
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2);
    USART_InitStruct.USART_BaudRate = 38400;    
    USART_InitStruct.USART_WordLength = USART_WordLength_8b;
    USART_InitStruct.USART_StopBits = USART_StopBits_1;    
    USART_InitStruct.USART_Parity = USART_Parity_No;        
    USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStruct.USART_Mode = /*USART_Mode_Tx |*/ USART_Mode_Rx;
    USART_Init(USART2, &USART_InitStruct);        
    
    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
    
    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;    
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;        
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            
    NVIC_Init(&NVIC_InitStructure);                        

    USART_Cmd(USART2, ENABLE);
}

RX Interrupts :

void USART1_IRQHandler(void)
{
    if( USART_GetITStatus(USART1, USART_IT_RXNE) )
    {
        if (canSend == 1)
        {
            char t = USART1->DR;
            if ((t != ';') && (t != ':'))
            {
                cnt2++;
                received_string2[cnt2] = t;
            }
            if (t == ';') //else
            {
                if (canSend == 1)
                {
                    checksum = 0;
                    checksum = received_string2[1] + received_string2[2] + received_string2[3] + received_string2[4] + received_string2[5] + received_string2[6] + received_string2[7];
                    checksumUnion.checks = checksum;
                    b1 = checksumUnion.bytes[0];
                    b2 = checksumUnion.bytes[1];
                    USART3_Send_Byte(':');
                    delay_ms(2);
                    for (q=1; q<8; q++)
                    {
                        USART3_Send_Byte(received_string2[q]);
                        delay_ms(2);
                        received_string2[q] = '\0';
                    }
                    USART3_Send_Byte(b1);
                    delay_ms(2);
                    USART3_Send_Byte(b2);
                    delay_ms(2);
                    USART3_Send_Byte(';');
                    delay_ms(2);
                    cnt2 = -1;
                }
            }
        }
    }
}

void USART2_IRQHandler(void)
{
    if( USART_GetITStatus(USART2, USART_IT_RXNE) )
    {
        char t = USART2->DR;
        USART_Cmd(USART1, DISABLE);
        
        //canSend = 0;
        if (t != ';')
        {
            cnt++;
            received_string[cnt] = t;
        }
        if (t == ';')
        {
            char * src;
            src = received_string;
            if (strstr(src , "STOP") != NULL)
            {
                for (q=0; q<cnt+1; q++)
                {
                    received_string[q] = '\0';
                }
                canSend = 0;
            }
            else if (strstr(src , "START") != NULL)
            {
                for (q=0; q<cnt+1; q++)
                {
                    received_string[q] = '\0';
                }
                USART_Cmd(USART1, ENABLE);
                canSend = 1;
            }
            else
            {
                cnt++;
                received_string[cnt] = ';';
                for (q=1; q<11; q++)
                {
                    received_string2[q] = '\0';
                }
                for (q=0; q<cnt+1; q++)
                {
                    USART3_Send_Byte(received_string[q]);
                    delay_ms(20);
                    received_string[q] = '\0';
                }
                delay_ms(1000);
                //canSend = 1;
                USART_Cmd(USART1, ENABLE);
                cnt = -1;
            }
        }
    }
}

please help me fix this problem .
 
Best Regards,
Amir .

Outcomes