前面学过有关于USART的基本的概念,接下来我们就根据前面的的基本配置来进行寄存器的配置,接下来我来带大家认识有关USART的寄存器。
案例分析
我们接下实现的功能就是向stm32发送数据,然后stm32原封不动的再把数据发送过来。电脑的话可以借助串口助手来实现数据的收发。
硬件电路的设计
目前来讲很多电脑都没有串口,所以我们要使用虚拟串口来进行数据的收发



利用轮询的方式来进行数据的收发
首先我们要选择什么端口才能进行数据的收发,引脚的定义手册来看

PA9和PA10分别是USART1的TX和RX,而USART1的时钟总线是挂载到哪个总线上的呢我们来具体看看

我们通过查找数据手册来看时钟USART1是挂载到APB2上的,我们前面说过APB2的 时钟频率是高达72M/HZ的因此在这里的USART1的传输速率是要比其它几个USART要快的,最高的速率可达到4.5M/S,因此在需要使用高数串口传输数据的时候推荐使用USART1。那我们在配置GPIO的时候我们要把它配置成什么类型呢,首先来看PA9是TX发送端口,是输出模式,因此我们想要达到最大的速率直接配置成复用推挽输出即可,而PA10是输入端口并且不需要受到外界的干扰我们直接配置成浮空输入即可。
USART的波特率寄存器

第一个首先是波特率寄存器,它是来控制数据传输的频率的,前面我们也讲过的,我们需要配置正确的波特率数据才能正确的进行收发,首先常见的波特率有9600,115200,4800,38400等等,
那我们具体应该如何配置呢,我们知道USART1的时钟是挂载到APB2总线上的,这条总线的时钟是72M/HZ,具体的计算方法是我们的时钟是72M/HZ然后要做一个16的分频,然后再除以我们需要的频率就得到了一个数值,我们这拿115200举例

经过上面的计算我们可以得到39.0625这个数,这个数就是我们目前要转换16进制的数,首先是整数部分39转换为16进制为0x27,小数部分为0x1,合起来就是0x271,因为BRR寄存器主要是由整数部分和小数部分组成,因此0X271就是115200所对应的寄存器中的值。
RCC->APB2ENR=RCC_APB2ENR_IOPAEN|RCC_APB2ENR_USART1EN;
GPIOA->CRH &=~(GPIO_CRH_CNF9|GPIO_CRH_MODE);
GPIOA->CRH &=~(GPIO_CRH_MODE10|GPIO_CRH_CNF10);
GPIOA->CRH|=GPIO_CRH_MODE9;
GPIOA->CRH|=GPIO_CRH_CNF9_1;
GPIOA->CRH|=GPIO_CRH_CNF10_0;
//初始化USART1
//配置波特率
USART1->BRR=0X271;
USART控制寄存器CR1
我们初始化了usart1后还需要对它的发送端和接收端进行使能。



这里我们重点看一下发送使能和接收使能。
//使能发送端和接收端
USART1->CR1|=USART_CR1_TE|USART_CR1_RE;
//使能USART1
USART1->CR1|=USART_CR1_UE;

除了使能位我们还需要重点看一下字长位(M)、校验位控制使能(PCE)、停止位(STOP),因为前面我们介绍串口通讯协议的时候提到,有效数据位、校验位、停止位都能手动进行配置,如字长可以7位、8位、9位都行、校验位可以选择开或者不开、停止位可以选择1个电平、2个电平或者1.5、0.5个电平。当然了,我们这里直接默认的8位数据、不开校验位、停止位用一个电平即可。所以我们根据寄存器描述其实可以知道就是全部置0就行。
//设置字长,停止位,校验位,全部置为0即可
USART1->CR1&=~(USART_CR1_M);
USART1->CR1&=~(USART_CR1_PCE);
USART1->CR1&=~(USART_CR2_STOP);
USART状态寄存器SR

在这个状态寄存器中有我们前面已经讲过的TXE、RXNE和IDLE这三个比较重要的位。
//发送一位数据
void USART_SENDBYTE(uint8_t data)
{
while((USART1->SR&USART_SR_TXE)==0)
;
USART1->DR=data;
}
//接收一位数据
uint8_t USART_RECEVEBYTE()
{
while((USART1->SR&USART_SR_RXNE)==0);
return USART1->DR;
}
USART数据寄存器DR
我们知道了如何发送数据和接收数据但数据存放在哪里就需要数据寄存器DR

到这的话我们有关USART的寄存器差不多都讲解完毕了。
如果内容上有什么不足的或者内容上有任何错误的欢迎广大网友指正,谢谢!!!!!!!!
2128

被折叠的 条评论
为什么被折叠?



