Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F103. Виснет после второй посылки UART
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Evgeniyk
Здравствуйте. По прерыванию таймера нужно отправить двухбайтное число. Отправляю посылками по 1 байту (почемуто функция USART_SendData при попытке отправить двухбайтное число виснет). Код:

Код
void TIM1_UP_IRQHandler(void)
{
    int i = 0;
    uint8_t low = 0;
    uint8_t high = 0;

    if (TIM_ADC->SR & TIM_SR_UIF)
    {
        TIM_ADC->SR &= ~TIM_SR_UIF;
        
        high = (uint8_t) (ADC_Val >> 8);
        low = (uint8_t) (ADC_Val  & 0x00FF);
        print(USART_DIAG, high); //high
        print(USART_DIAG, low);  //low
    }
}

void print(USART_TypeDef* TargetUSART, uint16_t Data)
{
    USART_SendData(TargetUSART, Data);
    while (USART_GetFlagStatus(TargetUSART, USART_FLAG_TC) == RESET);  //виснет тут
}


Первый принт проходит нормально а на втором виснет в цикле проверки флага USART_FLAG_TC. В чем может быть причина? Спасибо

Проверил код в функции main. В этом случае он работает. Т.е именно в прерывании работать не хотят.
Lotor
В прерывании имхо дурная практика вызывать функции и делать что-то тяжеловесное с ожиданием установки каких-то флагов.
Причина, опять-таки имхо, в стеке.
AHTOXA
Попробуйте проверять флаг TXE вместо TC. Ну и конечно лучше не висеть зря в прерывании.
paskal
Цитата(Evgeniyk @ Nov 16 2012, 12:24) *
Здравствуйте. По прерыванию таймера нужно отправить двухбайтное число. Отправляю посылками по 1 байту (почемуто функция USART_SendData при попытке отправить двухбайтное число виснет).

А мне кажется что функция USART_SendData не предназначена для отправки сразу 2-х байт. Только одного.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.