реклама на сайте
подробности

 
 
> STM32F103. Виснет после второй посылки UART
Evgeniyk
сообщение Nov 16 2012, 09:24
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 62
Регистрация: 5-04-06
Пользователь №: 15 836



Здравствуйте. По прерыванию таймера нужно отправить двухбайтное число. Отправляю посылками по 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. В этом случае он работает. Т.е именно в прерывании работать не хотят.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 3)
Lotor
сообщение Nov 16 2012, 10:01
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866



В прерывании имхо дурная практика вызывать функции и делать что-то тяжеловесное с ожиданием установки каких-то флагов.
Причина, опять-таки имхо, в стеке.


--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Nov 16 2012, 11:29
Сообщение #3


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Попробуйте проверять флаг TXE вместо TC. Ну и конечно лучше не висеть зря в прерывании.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
paskal
сообщение Nov 17 2012, 18:17
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 29-10-06
Из: Тула
Пользователь №: 21 769



Цитата(Evgeniyk @ Nov 16 2012, 12:24) *
Здравствуйте. По прерыванию таймера нужно отправить двухбайтное число. Отправляю посылками по 1 байту (почемуто функция USART_SendData при попытке отправить двухбайтное число виснет).

А мне кажется что функция USART_SendData не предназначена для отправки сразу 2-х байт. Только одного.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 07:58
Рейтинг@Mail.ru


Страница сгенерированна за 0.01408 секунд с 7
ELECTRONIX ©2004-2016