#include "usart4.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_uart.h"
//UART4串口初始化
void hal_uart_init(void)
{
//RCC相关寄存器初始化
RCC->MP_AHB4ENSETR |= (0x1 << 1);
RCC->MP_AHB4ENSETR |= (0x1 << 6);
RCC->MP_APB1ENSETR |= (0X1 << 16);
//GPIO相关寄存器初始化
GPIOB->MODER &= ~(0x3 << 4);
GPIOB->MODER |= (0x2 << 4);
GPIOG->MODER &= ~(0x3 << 22);
GPIOG->MODER |= (0x2 << 22);
GPIOB->AFRL &= ~(0xf << 8);
GPIOB->AFRL |= (0x8 << 8);
GPIOG->AFRH &= ~(0xf << 12);
GPIOG->AFRH |= (0x6 << 12);
//USART4相关寄存器初始化
USART4->CR1 &= ~(0x1 << 12);
USART4->CR1 &= ~(0x1 << 28);
USART4->CR1 &= ~(0X1 << 10);
USART4->CR1 &= ~(0x1 << 15);
USART4->CR1 |= (0x3 << 2);
USART4->CR2 &= ~(0x3 << 12);
USART4->CR1 |= 0x1;
USART4->BRR = 0x22b;
USART4->PRESC &= ~0xf;
}
//发送一个字符
void hal_put_char(const char str)
{
//判断发送数据寄存器是否有数据
while(!(USART4->ISR & (0x1 << 7)));
USART4->TDR = str;
//判断发送数据寄存器是否发送完成
while(!(USART4->ISR & (0X1 << 6)));
}
//发送一个字符串
void hal_put_string(const char* string)
{
//判断字符串结束标志
while(*string)
{
hal_put_char(*string++);
}
hal_put_char('\n');
hal_put_char('\r');
}
//接收一个字符
char get_char(void)
{
char ch;
//判断接收数据寄存器是否接收到数据
while(!(USART4->ISR & (0x1 << 5)));
ch = USART4->RDR;
return ch;
}
char buf[32] = "";
//接收一个字符串
char* get_string(void)
{
//键盘的回车键按下,对应的字符'\r'
int i = 0;
for(i=0;i<32;i++)
{
buf[i] = get_char();
hal_put_char(buf[i]);
if(buf[i] == '\r')
break;
}
buf[i] = '\0';
hal_put_char('\n');
return buf;
}