Problem in transmitting character over UART using STM32L476RG EVB
I am trying to transmit character over USART2 using STM32L476RG EVB. I am getting "NUL" at the debug terminal instead of the transmitted data. please help. Here is the code and debug terminal:
Debug Terminal
#include <stdint.h>
#include"stm32l476xx.h"
#define GPIOAEN (1U << 0)
#define UART2EN (1U << 17)
#define CR1_TE (1U << 3)
#define CR1_UE (1U << 0)
#define ISR_TXE (1U << 7)
#define USART_TDR (1U << 4)
#define SYS_FREQ 80000000
#define APB1_CLK SYS_FREQ
static void uart_set_baudrate(USART_TypeDef *USART, uint32_t PeriphClk, uint32_t UART_BAUDRATE);
static uint16_t compute_uart_bd(uint32_t PeriphClk, uint32_t UART_BAUDRATE);
uint32_t UART_BAUDRATE = 115200;
void uart2_tx_init(void);
void uart2_write(int ch);
int main(void){
uart2_tx_init();
while(1){
uart2_write('Y');
}
}
void uart2_tx_init(void){
RCC -> AHB2ENR |= GPIOAEN;
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 -> AHB1ENR |= UART2EN;
uart_set_baudrate(USART2, APB1_CLK,UART_BAUDRATE);
USART2 -> CR1 = CR1_TE;
USART2 -> CR1 = CR1_UE;
}
void uart2_write(int ch){
while(!(USART2 -> ISR & ISR_TXE)){}
USART2 -> TDR = (ch & 0xFF);
}
static void uart_set_baudrate(USART_TypeDef *USARTx, uint32_t PeriphClk, uint32_t UART_BAUDRATE ){
USARTx -> BRR = compute_uart_bd(PeriphClk,UART_BAUDRATE);
}
static uint16_t compute_uart_bd(uint32_t PeriphClk,uint32_t UART_BAUDRATE){
return ((PeriphClk + (UART_BAUDRATE /2U))/ UART_BAUDRATE);
}
