#include "uart4.h"
#include "gpio.h"
//uart4初始化
void hal_uart4_init()
{
/***********RCC章节初始化************/
RCC_AHB4_ENSETR |= (0x1 << 1); //GPIOB使能
RCC_AHB4_ENSETR |= (0x1 << 6); //GPIOG使能
RCC_APB1_ENSETR |= (0x1 << 16);//UART4使能
/***********GPIO章节初始化************/
gpio_init_t initpb2 = {0}; //uart4_rx pb2
initpb2.moder = ALT;
initpb2.afrl = AF8;
hal_gpio_UART4_init(GPIOB,&initpb2,GPIO_PIN_2);
gpio_init_t initpg11 = {0}; //uart4_tx pg11
initpg11.moder = ALT;
initpg11.afrh = AF6;
hal_gpio_UART4_init(GPIOG,&initpg11,GPIO_PIN_11);
/***********UART4章节初始化************/
USART4->CR1 &= (~(0x1 << 29));
USART4->CR1 &= (~(0x1));//设置串口不使能
USART4->CR1 &= (~(0x1 << 28));//设置数据位宽度 8位
USART4->CR1 &= (~(0x1 << 12));
USART4->CR1 &= (~(0x1 << 15));//设置串口16倍采样率
USART4->CR1 &= (~(0x1 << 10));//设置串口无奇偶校验位
USART4->CR1 &= (~(0x1 << 3));//设置串口发送数据寄存器使能
USART4->CR1 |= (0x1 << 3);
USART4->CR1 &= (~(0x1 << 2));//设置串口接收数据寄存器使能
USART4->CR1 |= (0x1 << 2);
USART4->CR1 |= (0x1);//设置串口使能
USART4->CR2 &= (~(0x3 << 12));//设置串口1位停止位
USART4->PRESC &= (~(0xf)); //不分频
USART4->BRR &= (~(0xff));//波特率115200 0x22b
USART4->BRR = 0x22b;
}
//发送一个字符
void put_char(const char str)
{
while(!(USART4->ISR & (0x1 << 7)));
USART4->TDR = str;
if(str == '\n')
put_char('\r');
}
//发送一个字符串
void put_string(const char* str)
{
while (*str != '\0')
put_char(*str++);
put_char('\n');
put_char('\r');
}
//接收一个字符
char get_char()
{
char c;
while (!(USART4->ISR & (0x1 << 5)));
c = (char)USART4->RDR;
return c;
}
char buf[50];
char* get_string()
{
unsigned int i = 0;
for(i=0;i<49;i++)
{
buf[i] = get_char();
put_char(buf[i]);
if(buf[i] == '\r')
break;
}
buf[i] = '\0';
put_char('\n');
return buf;
}
运行结果