Jump to content

    
Sign in to follow this  
maxntf

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

Recommended Posts

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

Включен 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
Понял.

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this