UART Transmit, bare metal (no HAL OR LL). I just want to transfer 1 charater(later i would do a string) I am reading the character through hercules. Baud rate is 115200. (16Mhz / 115200 = 0x8B) here's the code. where am i going wrong?
#include<stdint.h>
#include "usart.h"
void
clock_init(void);
void
clock_init(void)
{
RCC->CR &= ~(RCC_CR_HSIDIV);
RCC->CR |= RCC_CR_HSION;
}
int
main()
{
clock_init();
usart_init();
while(1)
{
}
}
#include <stdint.h>
#include "stm32g0xx.h" // Device header
#include "usart.h"
void
isr(void);
uint8_t *ptr = "H";
uint8_t s = 2;
void
usart_init()
{
RCC->APBENR1 |= RCC_APBENR1_USART2EN;
GPIOA->AFR[0] |= GPIO_AFRL_AFSEL2_0;
GPIOA->MODER &= ~GPIO_MODER_MODE2;
GPIOA->MODER |= GPIO_MODER_MODE2_1;
GPIOA->AFR[0] |= GPIO_AFRL_AFSEL3_0;
GPIOA->MODER &= ~GPIO_MODER_MODE3;
GPIOA->MODER |= GPIO_MODER_MODE3_1;
NVIC_SetPriority(USART2_IRQn, 0);
NVIC_EnableIRQ(USART2_IRQn);
RCC->APBENR2 |= RCC_APBENR2_SYSCFGEN;
RCC->APBENR1 |= RCC_APBENR1_PWREN;
USART2->CR1 |= USART_CR1_TXEIE_TXFNFIE;
USART2->CR1 |= USART_CR1_TE;
USART2->BRR = 0x8B;
USART2->CR2 &= ~(USART_CR2_LINEN | USART_CR2_CLKEN);
USART2->CR3 &= ~(USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN);
USART2->CR1 |= USART_CR1_UE;
}
void
USART2_IRQHandler(void)
{
isr();
}
void
isr(void)
{
if (s == 0)
{
USART2->CR1 &= ~(USART_CR1_TXEIE_TXFNFIE);
}
else
{
USART2->TDR = (uint8_t)((*ptr) & (uint8_t)0xFF);
ptr++;
s--;
}
}