串口(usart)(串行通信接口)把I/O口接收到的数据通过串口(usart)寄存器放到内存上
USART(通用同步/异步收发器)和UART(通用异步收发器)的区别主要在于USART具有同步和异步两种数据传输模式,而UART仅支持异步数据传输。以下是两者其他方面的区别
串口初始化
/*
Function name:Usart1_Config
Description:串口1初始化
param:brr-->波特率
retval:None
Remarks:
PA9:复用推挽输出
PA10:复用
*/
void Usart1_Config(u32 brr)
{
RCC->AHB1ENR|=(1<<0);//PA时钟
RCC->APB2ENR|=(1<<4);//USART1时钟
USART1的接收端和发送端在PA9和PA10的I/O口上
外设复位寄存器在APB2RSTR上,端口在第四位
//IO PA9
GPIOA->MODER &=~(3<<18);//清零
GPIOA->MODER |=(2<<18);//复用
GPIOA->OTYPER&=~(1<<9);//推挽
GPIOA->AFR[1]|=(7<<4);//选择USART1复用功能
//PA10
GPIOA->MODER &=~(3<<20);//清零
GPIOA->MODER|=(2<<20);//复用
GPIOA->AFR[1]|=(7<<8);//选择USART1复用功能
//USART1 USARTDIV是一个无符号定点数(div),
float div;
u32 div_f,div_m;//div_f是USARTDIV的小数部分,div_m是USARTDIV的整数部分
div=84000000.0/16/brr;
div_m=(u32)div;
div_f=(div-div_m)*16+0.5;
USART1->BRR=div_m<<4|div_f;
PA0~PA7是低位寄存器用数组表示GPIOA->AFR[0]
PA8~PA15是高位寄存器用数组表示GPIOA->AFR[1]
USART1在AF7值为0111,
div_f是USARTDIV的小数部分,div_m是USARTDIV的整数部分
USART1->CR1 |=(3<<2);//发送器/接收器 使能
USART1->CR1 &=~(1<<10);//禁止奇偶校验
USART1->CR1 &=~(1<<12);//字长 8位数据位
USART1->CR1 &=~(1<<15);//16倍过采样
USART1->CR2 &=~(3<<12);//1位停止位
USART1->CR1 |=(1<<13);//使能USART1
}
完整代码
/*
Function name:Usart1_Config
Description:串口1初始化
param:brr-->波特率
retval:None
Remarks:
PA9:复用推挽输出
PA10:复用
*/
void Usart1_Config(u32 brr)
{
RCC->AHB1ENR|=(1<<0);//PA时钟
RCC->APB2ENR|=(1<<4);//USART1时钟
//IO PA9
GPIOA->MODER &=~(3<<18);//清零
GPIOA->MODER |=(2<<18);//复用
GPIOA->OTYPER&=~(1<<9);//推挽
GPIOA->AFR[1]|=(7<<4);//选择USART1复用功能
//PA10
GPIOA->MODER &=~(3<<20);//清零
GPIOA->MODER|=(2<<20);//复用
GPIOA->AFR[1]|=(7<<8);//选择USART1复用功能
//USART1 USARTDIV是一个无符号定点数(div),
float div;
u32 div_f,div_m;//div_f是USARTDIV的小数部分,div_m是USARTDIV的整数部分
div=84000000.0/16/brr;
div_m=(u32)div;
div_f=(div-div_m)*16+0.5;
USART1->BRR=div_m<<4|div_f;
USART1->CR1 |=(3<<2);//发送器/接收器 使能
USART1->CR1 &=~(1<<10);//禁止奇偶校验
USART1->CR1 &=~(1<<12);//字长 8位数据位
USART1->CR1 &=~(1<<15);//16倍过采样
USART1->CR2 &=~(3<<12);//1位停止位
USART1->CR1 |=(1<<13);//使能USART1
}