Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F407IG
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
sidy
Здравствуйте уважаемы форумчане, осваиваю 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) и при первом же запуске попадаю на эту точку останова. Никак не могу понять с чем это связано, ведь данный бит устанавливается после завершения передачи, а я еще ничего не передавал.
vlad_new
Цитата
устанавливается бит TC в регистре USART3->SR, хотя я еще ничего не передавал.

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

Пока UART не протактируется на сколько то тактов - сбрасить TC не удасться. Собственно сам то триггер вроде как сбросится, но через
несколько десятков тактов он все равно взводится. Так что либо надо поставить задержку перед сбросом TC либо в прерывании от TC сделать флаг первого вхождения. А за одно там и приемник прочитать, поскольку при включении питания и перепрограммирования лапок, приемник принимает 1 байт мусора.
Ну вот как то так.
sidy
Спасибо, а где можно про это прочитать - может быть еще какие-нибудь тонкости, а то искал в Reference manual STM32F405xx, STM32F407xx, STM32F415xx and STM32F417xx advanced ARM-based 32-bit MCUs. Ни слова про это, хотя в нем 1315 страниц, а отдельного документа по использованию usart для данных контроллеров на сайте st.com нет.
vlad_new
А нигде. Просто очередной подводный камень. Ни первый и не последний sm.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.