Перейти к содержанию

    

Отладка с приемом по 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
bt = (char)USART_ReceiveData(USART1);

USART_ClearITPendingBit(USART1, USART_IT_RXNE);

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Без обработки ошибок - работать будет непредсказуемо.

Понял.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Понял.

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
ЕМНИП, я на такое налетал с переполнением (OVERFLOW).

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация