Не выставляется RXNE флаг и не работают прерывания в USART

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
NotoriousCoder)
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Вс июл 30, 2023 14:12:33

Не выставляется RXNE флаг и не работают прерывания в USART

Сообщение NotoriousCoder) »

Добрый день! Писал на cmsis, не работало, переписал на SPL - не работает опять. TX замкнул на RX, поэтому проблема только в коде. Функция отправки работает нормально, но виснет прием данных. Пытался сделать прерывания по RXNE флагу, также не работает. Подскажите, пожалуйста, что не так?

Код: Выделить всё

   GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_StructInit(&GPIO_InitStructure);

	/* ENABLE GPIOC clock */
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);

	/* ENABLE USART clock */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

	/* Configure GPIOC4, GPIOC5 pins, AF7 */
	GPIO_PinAFConfig(GPIOC, GPIO_PinSource4, GPIO_AF_7);
	GPIO_PinAFConfig(GPIOC, GPIO_PinSource5, GPIO_AF_7);

	/* Mode */
	// PС4 -> TX UART
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
	GPIO_Init(GPIOC, &GPIO_InitStructure); //инициализируем

	//PС5  -> RX UART
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
	GPIO_Init(GPIOC, &GPIO_InitStructure);//инициализируем

	/* Configure USART */
	USART_InitTypeDef USART_InitStructure;
	USART_StructInit(&USART_InitStructure);

	/* UART mode (RX, TX) */
	USART_InitStructure.USART_Mode = (USART_Mode_Rx | USART_Mode_Tx);
	USART_InitStructure.USART_BaudRate = 115200;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_Parity = USART_Parity_No;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

	USART_Init(USART1, &USART_InitStructure);

	//UART_IT_Init();

	/* USART Start */
	USART_Cmd(USART1, ENABLE);
Отправка данных

Код: Выделить всё

void UART_SendStr(USART_TypeDef* USARTx, const uint8_t* s, uint32_t len){
   uint32_t p = 0;
	while (p < len){
		while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);
		USART_SendData(USARTx, s[p]);
		p++;
	}
}
Прием данных (тут я уже до максимума упростил; в цикле виснет)

Код: Выделить всё

   while (USART_GetFlagStatus(USARTx, USART_FLAG_RXNE) == RESET);
	return USART_ReceiveData(USARTx);
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25124
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Не выставляется RXNE флаг и не работают прерывания в USA

Сообщение КРАМ »

А где включение разрешений в NVIC?
Да и локальные разрешения я в приведенном коде не обнаружил.
NotoriousCoder)
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Вс июл 30, 2023 14:12:33

Re: Не выставляется RXNE флаг и не работают прерывания в USA

Сообщение NotoriousCoder) »

Все это делалось в функции UART_IT_Init, которая, как Вы видите, закомментирована. Проблема не в этом
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25124
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Не выставляется RXNE флаг и не работают прерывания в USA

Сообщение КРАМ »

[uquote="NotoriousCoder)",url="/forum/viewtopic.php?p=4591889#p4591889"]Все это делалось[/uquote]
Дело не в том, что и где делалось. Важно что показывает отладчик в реальной работе.
Ну и отсутствие чтения в обработчике гарантировано вешает прием с выставлением флага переполнения.
NotoriousCoder)
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Вс июл 30, 2023 14:12:33

Re: Не выставляется RXNE флаг и не работают прерывания в USA

Сообщение NotoriousCoder) »

Извините, не очень понимаю, что должен показать отладчик. Ну, вот, не выставляется флаг/не вызывается прерывание. Вешал прерывание также на RXNE, если я правильно понимаю, если RXNE флага нету, то и прерывания тоже не будет

Код: Выделить всё

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
. Так что в таком случае может отладчик показать?
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25124
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Не выставляется RXNE флаг и не работают прерывания в USA

Сообщение КРАМ »

Отладчик должен показать ТРИ вещи.
Наличие локального разрешения по ожидаемому флагу, наличие разрешения в NVIC и наличие самого ожидаемого флага.
Вот и все.
При наличии обоих разрешений и отсутствии флага - неверно мапирован пин приемника. То есть тупо нет входного сигнала на USARTе.
При отсутствии любого из разрешений копайте код в месте ожидаемой инициализации этих разрешений.

Добавлено after 2 minutes 15 seconds:
Re: Не выставляется RXNE флаг и не работают прерывания в USART
ЗЫ. Недостаток SPL в неявной инициализации. Думаете, что все сделали, а на самом деле... )))
NotoriousCoder)
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Вс июл 30, 2023 14:12:33

Re: Не выставляется RXNE флаг и не работают прерывания в USA

Сообщение NotoriousCoder) »

Ну, справедливости ради, я писал на cmsis, просто решил попытаться, авось заработает) Спасибо большое за наводки, завтра буду пробовать разбираться вновь
Аватара пользователя
JackSmith
Потрогал лапой паяльник
Сообщения: 332
Зарегистрирован: Ср мар 09, 2016 08:07:41

Re: Не выставляется RXNE флаг и не работают прерывания в USA

Сообщение JackSmith »

[uquote="NotoriousCoder)",url="/forum/viewtopic.php?p=4591900#p4591900"]Ну, вот, не выставляется флаг/не вызывается прерывание. Вешал прерывание также на RXNE, если я правильно понимаю, если RXNE флага нету, то[/uquote]
обработчик прерывания должен обрабатывать также флаг ORE, причем он проверяется в первую очередь. в свое время тоже долго возлся с отладкой разбираясь как там все работает. ставите бряк на обработчик и запускаете трасировку.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25124
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Не выставляется RXNE флаг и не работают прерывания в USA

Сообщение КРАМ »

[uquote="JackSmith",url="/forum/viewtopic.php?p=4591943#p4591943"]обработчик прерывания должен обрабатывать также флаг ORE[/uquote]
Оверран так же должен вызвать прерывание с тем же разрешением, что и прием, а его нет.
NotoriousCoder)
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Вс июл 30, 2023 14:12:33

Re: Не выставляется RXNE флаг и не работают прерывания в USA

Сообщение NotoriousCoder) »

Блин, мужики, я фееричный болван) Функцию инициализации (та, что первая) тупо забыл вызвать :)) Сижу еще, думаю... Всем спасибо за ответы, а мне нужно быть чуточку внимательнее. Вопрос решен
Ответить

Вернуться в «ARM»