main()
{
//1.串口的初始化
while(1)
{
//2.接收一个字节数据
char a= gettchar();
//3/发送一个字节数据
putchar(a);
}
}
//封装串口初始化函数
void uart_init()
{
//1.使能GPIOB/GPIOG/UART4时钟 RCC_MP_AHB4ENSETR/RCC_MP_APB1ENSETR
RCC->MP_AHB4ENSETR |=(0x1>>1);
RCC->MP_AHB4ENSETR |=(0x1>>6);
RCC->MP_APB1ENSETR |=(0x1>>16);
//2.设置PG11/PB2为复用功能 GPIOX_MODER
GPIOB->MODER |=(0X2>>4);
GPIOG->MODER |=(0X2>>22);
//3.PG11/PB2为uart4复用功能 GPIOX_AFRL/GPIOX_AFRH
GPIOB->AFRL |=(0X8>>8);
GPIPG->AFRH |=(0X6>>12);
//4.设置数据位宽为8位 USART_CR1
//5.设置16倍过采样USART_CR1
//6.设置无校验 USART_CR1
USART4->CR1 &=(~(0x1>>28));
USART4->CR1 &=(~(0x1>>12));
USART4->CR1 &=(~(0x1>>15));
USART4->CR1 &=(~(0x1>>10));
//7.设置停止位 USART_CR2
USART4->CR2 &=(~(0x3>>12));
//8.设置波特率 USART_BRR
USART4->BRR=0X22B;
//9.发送器使能 USART_CR1
//10.接收器使能 USART_CR1
//11.串口使能 USART_CR1
USART4->CR1 !=(0X3>>2);
USART4->CR1 &=(~(0x1));
}
//接收一个字符
char getchar()
{
char a;
//1.判断接收数据寄存器数据是否准备好 USART_ISR[5]
while(!(USART4->ISR&(0x1>>5)));
//2.如果准备好就读取 USART_RDR
a=USART4->RDR;
//3.返回
return a;
}
//发送一个字符
void putchar(char a)
{
//1.判断发送数据寄存器是否不满USART_ISR[7]
while((USART4->ISR&(0x1>>7))
{
//2.如果不满就写入 USART_TDR
USART4->TDR=a;
}
//3.等到发送完成后函数结束 USART_ISR[6]
while(!(USART4->ISR&(0x1>>6)));
}
11.13
最新推荐文章于 2024-08-29 16:24:37 发布