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

 
 
> STM32F407IG, непонятое поведение бита TC в регистре USART3->SR
sidy
сообщение Jul 26 2012, 09:11
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 280
Регистрация: 2-11-08
Пользователь №: 41 333



Здравствуйте уважаемы форумчане, осваиваю STM32F407IG и столкнулся с такой проблемой при первом запуске программы срабатывает прерывание по окончанию передачи, т.е. устанавливается бит TC в регистре USART3->SR, хотя я еще ничего не передавал. Ниже кусок кода:
CODE
//********************************************************************************
//*Настройка прерываний
//********************************************************************************
NVIC_EnableIRQ (USART3_IRQn); //Разрешаем прерывние USART3
USART_ITConfig(USART3, USART_IT_TXE, ENABLE);
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
//********************************************************************************
//*Разрешаем работу USART3: //********************************************************************************
USART_Cmd(USART3, ENABLE); //Разрешаем работу USART3
USART3->SR&=~USART_SR_TC;
while(1){
data=0;
};
}

void USART3_IRQHandler (void) {
//********************************************************************************
//* RS485 прерывание от приемника
//********************************************************************************
//if ((USART3->SR&USART_SR_RXNE)){
if (USART_GetITStatus(USART3, USART_IT_RXNE)==SET){
RS485_Buffer[RS485_Count]=USART_ReceiveData(USART3);
RS485_Count++;
}
//********************************************************************************
//*RS485 прерывание от передатчика
//********************************************************************************
//if((USART3->SR&USART_SR_TC)){
if (USART_GetITStatus(USART3, USART_IT_TС)==SET){
USART3->SR&=~USART_SR_TC;//Очищаем флаг окончания передачи
USART3->DR=RS485_Buffer[RS485_Count++];
};
}

Когда я смотрю отладчиком бит TC устанавливается после разрешения тактирования переферийного модуля USART3, затем сбрасывается когда разрешаются прерывания USART3: NVIC_EnableIRQ (USART3_IRQn); затем усанавливается, когда разрешается работа модуля USART3: USART_Cmd(USART3, ENABLE).
После этого я сбрасываю этот бит USART3->SR&=~USART_SR_TC;. Затем я ставлю точку останова в функции прерывания после строки if (USART_GetITStatus(USART3, USART_IT_TС)==SET) и при первом же запуске попадаю на эту точку останова. Никак не могу понять с чем это связано, ведь данный бит устанавливается после завершения передачи, а я еще ничего не передавал.

Сообщение отредактировал IgorKossak - Jul 26 2012, 09:45
Причина редактирования: [codebox] для длинного кода
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
vlad_new
сообщение Jul 26 2012, 20:43
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 218
Регистрация: 24-06-10
Пользователь №: 58 127



Цитата
устанавливается бит TC в регистре USART3->SR, хотя я еще ничего не передавал.

Передатчик пуст? - Получите прерывание.
Цитата
После этого я сбрасываю этот бит USART3->SR&=~USART_SR_TC;.

Пока UART не протактируется на сколько то тактов - сбрасить TC не удасться. Собственно сам то триггер вроде как сбросится, но через
несколько десятков тактов он все равно взводится. Так что либо надо поставить задержку перед сбросом TC либо в прерывании от TC сделать флаг первого вхождения. А за одно там и приемник прочитать, поскольку при включении питания и перепрограммирования лапок, приемник принимает 1 байт мусора.
Ну вот как то так.
Go to the top of the page
 
+Quote Post



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

 


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


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