Skip to main content
Graduate II
April 26, 2024
Question

Uart usage with STM32F411RE Nucleo

  • April 26, 2024
  • 2 replies
  • 2106 views

Hello everyone I'm working with Uart on STM32F411RE Nucleo board. It gives a code error, but no data is provided through USART2. Can anyone help me with this problem? The code is as follows: 

void Delay(int time);
static void uart_set_baudrate(uint32_t periph_clk, uint32_t baudrate);
 static uint16_t compute_uart_bd(uint32_t periph_clk, uint32_t baudrate);
 static void Uart_Write(int ch); int __io_putchar(int ch)
 { Uart_Write(ch);
 return ch; } 
int main(void)
 { 
RCC->AHB1ENR |= (1U<<0);
 GPIOA->MODER &= ~(1U<<4);
 GPIOA->MODER |= (1U<<5);
 GPIOA->AFR[0] |= (1U<<8);
 GPIOA->AFR[0] |= (1U<<9);
 GPIOA->AFR[0] |= (1U<<10);
 GPIOA->AFR[0] &=~ (1U<<11);
 RCC->APB1ENR |= (1U<<17);
 uart_set_baudrate(16000000, 115200);
 USART2->CR1 = (1U<<3);
 USART2->CR1 |= (1U<<13);
 while(1) 
{ 
printf("hello\n\r");
 for(int i=0; i<100000; i++)
{} //Delay(10); 
}
} 
void Delay(int time) 
{
 for(int i; time>0; time--) 
{
 
 for(i=0; i<9600; i++) 
{
}
}
} 
static void Uart_Write(int ch)
 { 
while(!(USART2->SR & (1U<<7)))
{};
 USART2->DR = (ch & 0xFF);
 } 
static uint16_t compute_uart_bd(uint32_t periph_clk, uint32_t baudrate) 
{ 
return ((periph_clk + (baudrate/2U))/baudrate);
 } static void uart_set_baudrate(uint32_t periph_clk, uint32_t baudrate) 
{ 
USART2->BRR = compute_uart_bd(periph_clk, baudrate);
 }

Edited (tradition to English) 

 

 

 

 

 

 

 

    This topic has been closed for replies.

    2 replies

    ST Employee
    April 26, 2024

    Hello @Sule_Akcay ,

    I don't know if it is necessary to use direct register access to configure your Uart instance if it is not, I recommend using Hal API which will make your life easier.

    otherwise here is the procedure you should follow described in RM0383 section 19.3:

    Procedure:
    1. Enable the USART by writing the UE bit in USART_CR1 register to 1.
    2. Program the M bit in USART_CR1 to define the word length.
    3. Program the number of stop bits in USART_CR2.
    4. Select DMA enable (DMAT) in USART_CR3 if Multi buffer Communication is to take
    place. Configure the DMA register as explained in multibuffer communication.
    5. Select the desired baud rate using the USART_BRR register.
    6. Set the TE bit in USART_CR1 to send an idle frame as first transmission.
    7. Write the data to send in the USART_DR register (this clears the TXE bit). Repeat this for each data to be transmitted in case of single buffer.
    8. After writing the last data into the USART_DR register, wait until TC=1. This indicates that the transmission of the last frame is complete. This is required for instance when the USART is disabled or enters the Halt mode to avoid corrupting the last transmission.

    you can get a working example of printf surcharging with Uart in the CubeF4 package which can be downloaded from this link or from this GitHub repo.

    BR

     

    Graduate II
    April 29, 2024

    Hello @STea 

    I am aware of the existence of the Hal library, but I wanted to set the registers myself to learn coding.
    I was able to send from Usart1 and Usart6 by following these steps, but I cannot send from Usart2.

    Is there a different setting for Usart2?

    Technical Moderator
    April 29, 2024

    You can inspire from HAL and compare the content of your registers to find the issue.

    Super User
    April 29, 2024

    @Sule_Akcay wrote:

     It gives a code error


    what do you mean by that?