Jump to content

    

Отладка с приемом по UART

Народ подскажите, натолкнулся на такую штуку:

Включен USART1 на прием и разрешен только один тип прерывания по приему байта.

void USART1_IRQHandler(void){
    char bt;
    if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET){
        bt = (char)USART_ReceiveData(USART1);
        USART_ClearITPendingBit(USART1, USART_IT_RXNE);
        if(bt != 0){
        bUartRx[cUartRx] = bt;
        if(cUartRx >= (BRXSIZE-2)) bUartRx[(BRXSIZE-1)] = 0, cUartRx = 0, fUartRxOver = 1;
            else cUartRx++, bUartRx[cUartRx] = 0;
        xSemaphoreGiveFromISR(xSemRxInBuf, NULL);
        }
    }                                                            
}

void UART_Init(void){
    GPIO_InitTypeDef GPIO_InitStruct;
    USART_InitTypeDef USART_InitStruct;
    NVIC_InitTypeDef NVIC_InitStruct;
    
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
    
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;    
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
        GPIO_Init(GPIOA, &GPIO_InitStruct);
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
        GPIO_Init(GPIOA, &GPIO_InitStruct);
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1);
    
    USART_InitStruct.USART_BaudRate = 19200;
    USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    USART_InitStruct.USART_Parity = USART_Parity_No;
    USART_InitStruct.USART_StopBits = USART_StopBits_1;
    USART_InitStruct.USART_WordLength = USART_WordLength_8b;
        USART_Init(USART1, &USART_InitStruct);
        USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
        USART_Cmd(USART1, ENABLE);

    NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStruct.NVIC_IRQChannelPriority = 0;
        NVIC_Init(&NVIC_InitStruct);

 

Так вот, во время отладки при нажатии Stop или остановки по брекпоинту, если в этот момент что то принималось в UART, то после запуска отладчика все время висим в обработчике прерывания. Причем все флаги сброшены и больше не устанавливаются, даже если приходят данные.

 

P.S.

STM32F051R8T6

Keil v.5.23.0.0

Share this post


Link to post
Share on other sites
bt = (char)USART_ReceiveData(USART1);

USART_ClearITPendingBit(USART1, USART_IT_RXNE);

Нафига принудительно чистите RXNE??? Подумайте что будет, если новый символ придёт между этих 2-х строчек.

И прочитайте мануал.

А также - напрочь отсутствует обработка ошибочных ситуаций (см. биты USART_SR). Не знаю как там эти ваши библиотеки конфигурят UART, но если они разрешают прерывания по каким-то из этих флагов и произойдёт такое событие (например - переполнение приёма когда остановились на бряке), то как раз и будете всё время попадать в ISR.

Share this post


Link to post
Share on other sites

Без обработки ошибок - работать будет непредсказуемо.

Share this post


Link to post
Share on other sites
Без обработки ошибок - работать будет непредсказуемо.

Понял.

То есть даже если не включены прерывания по ошибкам, флаги все равно нужно сбрасывать при их установке?

Share this post


Link to post
Share on other sites
Понял.

То есть даже если не включены прерывания по ошибкам, флаги все равно нужно сбрасывать при их установке?

ЕМНИП, я на такое налетал с переполнением (OVERFLOW). Если остановить программу, то переполнение гарантировано, естественно. Обрабатывать это мне не нужно было, и там есть бит в регистре конфигурации, который отключает вот это самое переполнение, вот я его и отключил.

Share this post


Link to post
Share on other sites
ЕМНИП, я на такое налетал с переполнением (OVERFLOW).

Да как только отключил, все работает нормально.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this