unsigned char get_a_byte()
{
unsigned char c;
while(!(USART4->ISR & (0X1 << 5))); // 判断RXFIFO中数据是否被接收
c = USART4->RDR; // 接收数据
return c;
}
void send_a_byte(const char data)
{
while(!(USART4->ISR & (0X1 << 7))); // 判断TXFIFO是否为满
USART4->TDR = data; // 发送数据
if (data == '\n')
putc('\r');
while(!(USART4->ISR & (0X1 << 6))); // 判断是否发送完成
}
void send_string(const char *pstr)
{
while(*pstr != '\0')
putc(*pstr++);
}
void uart_init()
{
GPIOG->MODER &= ~(0x3 << 22);
GPIOG->MODER |= 0x2 << 22; //PG11 设置为复用功能
GPIOG->AFRH &= ~(0xf << 12);
GPIOG->AFRH |= 0x6 << 12; //复用功能选择用于UART4_TX
GPIOB->MODER &= ~(0x3 << 4);
GPIOB->MODER |= 0x2 << 4; //PB2 设置为复用功能
GPIOB->AFRL &= ~(0xf << 8);
GPIOB->AFRL |= 0x8 << 8; //复用功能选择用于UART4_RX
USART4->CR1 &= (~(0x1 << 28) | ~(0x1 << 12)); //设置1 Start bit,8 Data bits,
USART4->CR1 &= (~(0x1 << 15)); // 采样率为16位
//这里使用内部默认时钟 频率为64MHZ
USART4->PRESC &= ~0xf; //预分频寄存器 不分频
USART4->BRR |= 0x22b; //64000000/115200 = 0x22b //波特率为115200
// Example 1
// To obtain 9600 baud with usart_ker_ck_pres= 8 MHz:
// • In case of oversampling by 16:
// USARTDIV = 8 000 000/9600
// BRR = USARTDIV = 833d = 0341h
USART4->CR2 &= ~(0x3 << 12); //设置 1 stop bit
USART4->CR1 |= (0x1 << 0); //USART使能
USART4->CR1 |= (0x3 << 2); // TXD与RXD使能,可以接收与发送数据
}
可以对照着资料去翻寄存器学习