Страница 1 из 1

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

Добавлено: Вс июн 16, 2024 18:07:47
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);

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

Добавлено: Вс июн 16, 2024 18:38:08
КРАМ
А где включение разрешений в NVIC?
Да и локальные разрешения я в приведенном коде не обнаружил.

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

Добавлено: Вс июн 16, 2024 18:48:29
NotoriousCoder)
Все это делалось в функции UART_IT_Init, которая, как Вы видите, закомментирована. Проблема не в этом

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

Добавлено: Вс июн 16, 2024 18:51:43
КРАМ
[uquote="NotoriousCoder)",url="/forum/viewtopic.php?p=4591889#p4591889"]Все это делалось[/uquote]
Дело не в том, что и где делалось. Важно что показывает отладчик в реальной работе.
Ну и отсутствие чтения в обработчике гарантировано вешает прием с выставлением флага переполнения.

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

Добавлено: Вс июн 16, 2024 19:43:17
NotoriousCoder)
Извините, не очень понимаю, что должен показать отладчик. Ну, вот, не выставляется флаг/не вызывается прерывание. Вешал прерывание также на RXNE, если я правильно понимаю, если RXNE флага нету, то и прерывания тоже не будет

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

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
. Так что в таком случае может отладчик показать?

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

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

Добавлено after 2 minutes 15 seconds:
Re: Не выставляется RXNE флаг и не работают прерывания в USART
ЗЫ. Недостаток SPL в неявной инициализации. Думаете, что все сделали, а на самом деле... )))

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

Добавлено: Вс июн 16, 2024 20:12:42
NotoriousCoder)
Ну, справедливости ради, я писал на cmsis, просто решил попытаться, авось заработает) Спасибо большое за наводки, завтра буду пробовать разбираться вновь

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

Добавлено: Вс июн 16, 2024 21:20:38
JackSmith
[uquote="NotoriousCoder)",url="/forum/viewtopic.php?p=4591900#p4591900"]Ну, вот, не выставляется флаг/не вызывается прерывание. Вешал прерывание также на RXNE, если я правильно понимаю, если RXNE флага нету, то[/uquote]
обработчик прерывания должен обрабатывать также флаг ORE, причем он проверяется в первую очередь. в свое время тоже долго возлся с отладкой разбираясь как там все работает. ставите бряк на обработчик и запускаете трасировку.

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

Добавлено: Вс июн 16, 2024 21:28:51
КРАМ
[uquote="JackSmith",url="/forum/viewtopic.php?p=4591943#p4591943"]обработчик прерывания должен обрабатывать также флаг ORE[/uquote]
Оверран так же должен вызвать прерывание с тем же разрешением, что и прием, а его нет.

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

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