Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
YtKur
0 / 0 / 0
Регистрация: 13.03.2019
Сообщений: 5
1

Проблема с USART STM32f303

13.03.2019, 21:11. Просмотров 156. Ответов 11
Метки нет (Все метки)

Доброго времени суток. Настроил USART, отсылает сообщения. Но, когда разрешаю прерывания по окончанию отправки сообщения, USART перестает их отправлять. МК STM32f303VC.
USART конфигурирую так:
C
1
2
3
4
5
6
7
8
9
10
11
void USART1Config(){
    GPIOC -> MODER |= (GPIO_MODER_MODER4_1 );// Tx out AF
    GPIOC -> MODER &= ~(GPIO_MODER_MODER5);//Rx in 
    GPIOC -> OSPEEDR |= (GPIO_OSPEEDER_OSPEEDR4 | GPIO_OSPEEDER_OSPEEDR5);//high speed
    GPIOC -> AFR[0] |= 0x00070000;//TX AF num
    USART1 -> CR1 &= ~(USART_CR1_OVER8);
    USART1 -> BRR = 32000000 / 9600;
    USART1 -> CR1 |= USART_CR1_TCIE;
    USART1 -> CR1 |= USART_CR1_RE | USART_CR1_TE;
    USART1 -> CR1 |= USART_CR1_UE;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.03.2019, 21:11
Ответы с готовыми решениями:

USART в STM32F303 [закрыто]
USORT. Вроде все нормально, как положено инициализируется и т.д., но не работает ;) Код#include...

Прерывания USART на STM32F303
Здравствуйте,я столкнулся с проблемой связанной с прерыванием USORT3. Мне нужно принимать и...

Проблема с USART
Также вопрос про USORT на STM32F407 (с использованием DMA) Вот код: main.c #include...

Проблема USART на STM32F3Discovery
Господа, слезно прошу помощи. Плата STM32F3Dyscovery подключена к BlueTooth-адаптеру HC-06. Ноут...

STMF415RGT6-проблема с USART.
Доброго времени суток! Продолжая работу с STM32F15RGT6 наткнулся на проблему в виде не желающего...

11
tvsdig
15 / 14 / 4
Регистрация: 22.09.2017
Сообщений: 39
13.03.2019, 21:24 2
А обработчик прерывания есть? может контроллер тупо падает в исключение?

Покажите код обработчика прерывания и код где Вы разрешаете прерывания по окончанию отправки сообщения.
0
YtKur
0 / 0 / 0
Регистрация: 13.03.2019
Сообщений: 5
13.03.2019, 21:32  [ТС] 3
Разрешаю прерывания в отдельной функции:
C
1
2
3
4
5
void InterruptConfig(){
    __enable_irq();
    NVIC_EnableIRQ(USART1_IRQn);
    USART1 -> CR1 |= USART_CR1_TCIE;
}
Обработчик тоже есть, правда примитивный:
C
1
2
3
4
void USART1_IRQHandler(){
    USART1->CR1 |= USART_ICR_TCCF;
    GPIOA -> ODR |= GPIO_ODR_3;
}
0
tvsdig
15 / 14 / 4
Регистрация: 22.09.2017
Сообщений: 39
13.03.2019, 21:50 4
Похоже что он у Вас все время сидит в прерывании и не выходит из него.

Обработчик прерывания USART1_IRQHandler() один и вызывается на все разрешенные прерывания, будь то прием или окончание отправки байта, нештатные ситуации. Поэтому сначала нужно понять какое событие привело к прерыванию.

Я использую SPL и обработчик прерывания выглядит так.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
void USART1_IRQHandler(void) 
{
  uint16_t data = 0;
  if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { // получен байт ?
    USART_ClearITPendingBit(USART1, USART_IT_RXNE); // сброс флага "получен байт"
    data = USART_ReceiveData(USART1); // читаем байт 
    ....
  }
 
  if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET) // регистр данных пустой?
  {
      USART_SendData(USART1, data); // кладем следующий байт для передачи
  }
  
  if(USART_GetITStatus(USART1, USART_IT_TC) != RESET) // передача байта закончена?
  {
     .....
  }
}
функция USART_GetITStatus() читает состояние USART1->SR регистра и по битам определяет что за событие произошло.
USART_ClearITPendingBit() сбрасывает флаг перывания, иначе обработчик все время будет вызываться.
0
YtKur
0 / 0 / 0
Регистрация: 13.03.2019
Сообщений: 5
13.03.2019, 22:05  [ТС] 5
Дело в том, что у меня разрешено только прерывание по окончанию отправки пакета, если конечно какие-то прерывания не разрешены по умолчанию. Но он и самый первый пакет не отправляет, так что, насколько я понимаю, он вообще не должен в обработчик заходить.

Добавил проверку флага прерывания, не завелось.
0
tvsdig
15 / 14 / 4
Регистрация: 22.09.2017
Сообщений: 39
13.03.2019, 22:16 6
Цитата Сообщение от YtKur Посмотреть сообщение
если конечно какие-то прерывания не разрешены по умолчанию
Прерывания по-умолчанию запрещены.

А как происходит отправка, покажите функцию.
В какой момент Вы записываете в регистр новый байт?
0
YtKur
0 / 0 / 0
Регистрация: 13.03.2019
Сообщений: 5
13.03.2019, 22:20  [ТС] 7
C
1
2
3
4
5
6
7
8
9
10
11
int main(void)
{
    RCCConfig();
    USART1Config();
    InterruptConfig();
 
    USART1 -> TDR = 10;
    while(1){
 
    }
    return 0;
0
tvsdig
15 / 14 / 4
Регистрация: 22.09.2017
Сообщений: 39
13.03.2019, 22:32 8
Так это же отправка 1 байта.

Как только Вы выставили флаг USART_CR1_TCIE тут же сработало прерывание USART1_IRQHandler()
так как регистр данных пуст.

Поменяйте местами строки 5 и 7 в main, должно отправить байт.

И в прерывании нужно писать USART1->ISR |= USART_ICR_TCCF;
И вообще нужно выключать прерывание TC на момент окончания передачи пакета, иначе будет все время сидеть в нем.
0
YtKur
0 / 0 / 0
Регистрация: 13.03.2019
Сообщений: 5
14.03.2019, 21:26  [ТС] 9
Исправил ошибку, оказалось неправильно написал имя обработчика прерываний
Правильно:
C
1
void USART1_EXTI25_IRQHandler()
0
tvsdig
15 / 14 / 4
Регистрация: 22.09.2017
Сообщений: 39
14.03.2019, 21:41 10
Цитата Сообщение от YtKur Посмотреть сообщение
void USART1_EXTI25_IRQHandler()
Хм. А вроде в файле stm32f30x.h вот такая строка USART1_IRQn = 37, /*!< USART1 global Interrupt
а в файле startup_stm32f303xC.s: DCD USART1_IRQHandler ; USART1
0
locm
2199 / 924 / 118
Регистрация: 28.10.2011
Сообщений: 3,069
Записей в блоге: 6
15.03.2019, 01:02 11
Цитата Сообщение от tvsdig Посмотреть сообщение
в файле stm32f30x.h вот такая строка USART1_IRQn = 37
Номер прерывания и имя не одно и тоже.
Имя задается в стартап файле, в таблице векторов прерываний.
0
tvsdig
15 / 14 / 4
Регистрация: 22.09.2017
Сообщений: 39
15.03.2019, 21:25 12
Цитата Сообщение от locm Посмотреть сообщение
Имя задается в стартап файле, в таблице векторов прерываний.
Я и не говорю что одно и тоже
в стартап файле для контроллера stm32f303VC вот это:
startup_stm32f303xC.s: DCD USART1_IRQHandler ; USART1

а такую строку не видел ни разу чтобы uart был совмещен с прерываниями EXTI
void USART1_EXTI25_IRQHandler()
0
15.03.2019, 21:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.03.2019, 21:25

Проблема с отправкой по USART STM32F3
Добрый вечер, никак не могу найти ошибку в коде для отправки данных с микроконтроллера на ПК с...

STM32F407 Проблема с передатчиком USART
У меня плата STM32F4-Dyscovery. Стандартный SystemInit вырезан. Приемник(RX) работает правильно,...

передача данных с 2 портов can и 1 usart в usart
Доброго времени суток форумчане! Пытаюсь написать код для stm32f4disko с помощью которого можно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru