I wrote a nice simple piece of code that will configure USART2 on PD5(tx) and PD6(rx). Works like a charm Smile For me so far at least. APBClock is 1/8 my clock… if this doesn’t work its usually a incorrect clock setting.

#define myClock 168000000
#define myBaud 115200

void ConfigUSART2(uint32_t BAUD, uint32_t fosc)
{
uint32_t tmpreg = 0x00, apbclock = 0x00;
uint32_t integerdivider = 0x00;
uint32_t fractionaldivider = 0x00;

apbclock = fosc/8;

RCC->APB1ENR = (1 << 17); //Enable USART2 Clock

GPIOD->MODER |= (2 << 10); //Setup TX pin for Alternate Function
GPIOD->MODER |= (2 << 12); //Setup RX pin for Alternate Function

GPIOD->AFR[0] |= (7 << 20); //Setup TX as the Alternate Function
GPIOD->AFR[0] |= (7 << 24); //Setup RX as the Alternate Function

USART2->CR1 |= (1 << 13); //Enable USART

integerdivider = ((25 * apbclock) / (2 * (BAUD)));
tmpreg = (integerdivider / 100) << 4;
fractionaldivider = integerdivider - (100 * (tmpreg >> 4));

tmpreg |= ((((fractionaldivider * 8) + 50) / 100)) & ((uint8_t)0x07);

USART2->BRR = (uint16_t)tmpreg;
USART2->CR1 |= (3 << 2); //Enable Tx & Rx
}

By admin

Leave a Reply

Your email address will not be published. Required fields are marked *