cancel
Showing results for 
Search instead for 
Did you mean: 

[STM32F746 Discovery] Receiving multiple bytes over UART7

Ivan Ivan
Associate II
Posted on June 26, 2017 at 13:54

 

 

The original post was too long to process during our migration. Please click on the attachment to read the original post.
4 REPLIES 4
Ivan Ivan
Associate II
Posted on June 26, 2017 at 14:55

Found a small error in code (and modified the starting post, see //here it is! ) and everything seems to be working. That error was not related to the issue, but it works now...

0690X00000607VFQAY.png

I'll ask here if something changes, Okay?

Ivan Ivan
Associate II
Posted on July 04, 2017 at 16:56

Seems like I should Initialize GPIO before setting up any UART clocks:

void init_uart7(){
__HAL_RCC_GPIOF_CLK_ENABLE();
 GPIO_InitTypeDef GPIO_InitStruct;
 /**UART7 GPIO Configuration 
 PF7 ------> UART7_R
X PF6 ------> UART7_TX 
 */
 GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_6;
 GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; /*GPIO_MODE_AF_PP;*/
 GPIO_InitStruct.Pull = GPIO_PULLUP;
 //GPIO_InitStruct.Pull = GPIO_NOPULL;
 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
 GPIO_InitStruct.Alternate = GPIO_AF8_UART7;
 HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);

RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_UART7;
PeriphClkInitStruct.Uart7ClockSelection = RCC_UART7CLKSOURCE_SYSCLK;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
{}
__HAL_RCC_UART7_CLK_ENABLE();
 //now comes the initialization of USART6 params
//baud rate. calculated as in p1002 MCU_ReferenceManual 
//UART7->BRR = 0xAFC4;//9600, over8 = 1; 8 bit data; no parity; 1 stop bit
 UART7->BRR = 0x0EA3; //115200, over8=1; 8 bit data; no parity 1 stop bit
 //USARTDIV=2*216000000/115200 = 3750d = 0x0EA6; 0x6 >> 1 = 3h ; BRR=0x0EA3
 //UART7->CR3 |= USART_CR3_OVRDIS; //This bit is used to disable the receive overrun. Might be worth setting when receiving is invloved
 //do not set this, data are going to get lost!
UART7->CR1 = 0x00;
UART7->CR2 = 0x00;
UART7->CR1 |= USART_CR1_RXNEIE; //enable interrupt on ORE=1 (overrun) or RXNE=1 (rx signal) in the USART_ISR. They should be cleaned after I suppose
NVIC_EnableIRQ(UART7_IRQn);
//USART6->CR1 &= ~USART_CR1_M; //word length: 8 bit 
//USART6->CR2 &= ~USART_CR2_STOP; //1 stop bit
 //p1029
 //0b00000000000000000000000000000000
 //M1(bit28)M0(bit12) -> 0;0 (1 Start bit, 8 data bits, n stop bits) Keep default, no change
UART7->CR1 |= USART_CR1_OVER8; //oversampling=8. involved in calculation of baud rate.
UART7->CR1 |= USART_CR1_RE; //enable receiver
UART7->CR1 |= USART_CR1_TE; //enable transmitter
UART7->CR1 |= USART_CR1_UE; //enable UART7
}�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?

Transmission works, reception does not work.

Defining interruptions is required to getthings better. One should define also this codein stm32f7xx_it.c :

void UART7_IRQHandler(void) {
//p1045 clear registers! 
 UART7->ICR |= USART_ICR_ORECF;
 UART7->RQR |= USART_RQR_RXFRQ;
}�?�?�?�?�?�?

Posted on July 05, 2017 at 09:09

Interrupt handler is being called twice more than the actual number of recieved bytes. Here's edit to make it called exact times:

void UART7_IRQHandler(void) {
if ((UART7->ISR & USART_ISR_RXNE )!=0) {
 //read the data, check it 
 uint8_t UART_data = UART7->RDR;
 globalCounter++;
}
//p1045 clear registers! 
 UART7->ICR |= USART_ICR_ORECF;
 UART7->RQR |= USART_RQR_RXFRQ;
}�?�?�?�?�?�?�?�?�?�?�?�?

Posted on July 05, 2017 at 15:45

Do not enable and process interrupts on transmission, like 

UART7->CR1 |= USART_CR1_TXEIE

or 

UART7->CR1 |= USART_CR1_

TCEIE

It is useless (and leads to bad things)