目录
-
USART框图
波特率模块负责产生一定频率的时钟信号,通过设置寄存器USARTDIV可以产生不同的波特率。
-
PWRDATA总线指的是APB1或者APB2总线
-
USART寄存器控制着此外设模块的运行
1.1. 配置编码(使用库函数)
下面是USART1初始化的编程案例
void USART1_Init(u32 bound)
{
//GPIO端口设置
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //打开时钟
/* 配置GPIO的模式和IO口 */
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//TX //串口输出PA9
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA,&GPIO_InitStructure); /* 初始化串口输入IO */
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//RX //串口输入PA10
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //模拟输入
GPIO_Init(GPIOA,&GPIO_InitStructure); /* 初始化GPIO */
//USART1 初始化设置
USART_InitStructure.USART_BaudRate = bound;//波特率设置
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
USART_Init(USART1, &USART_InitStructure); //初始化串口1
USART_Cmd(USART1, ENABLE); //使能串口1
USART_ClearFlag(USART1, USART_FLAG_TC);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启相关中断
//Usart1 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //串口1中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器、
}
从中,可以推测出STM32F103内部的模块间的连接方向如下:
STM32的手册摘抄GPIO port如下:
AFIO模块主要是一些配置复用输入输出的配置的寄存器模块,配置复用引脚时需要使能此模块的时钟,其中USART1的映射表如下:
通过上表中的关系,配置AFIO寄存器,使外设模块USART的信号线映射到复用功能输出和输入的GPIO port信号线上。
1.2 函数调用缩略图
2. 传输帧特征
-
起始位的特征:时钟引脚CK处于低电平,TX引脚处于低电平,持续1个SCLK时钟周期(由波特率决定)
-
数据位的特征:时钟信号的上升沿采样一个数据位。通过寄存器USART_CR1的M位域可以设置成8位或9位,如上图所示。
-
停止位的特征:时钟引脚CK处于低电平,TX引脚处于高电平,持续1~2个SCLK时钟周期(由波特率决定)
-
空闲帧的特征就是发送信号TX保持一个帧的高电平状态
-
断开帧的特征就是发送信号TX保持一个帧的低电平状态
3. 发送器
3.1.发送器使能
USART模块的使能是以USART_CR1寄存器上置位UE位来完成的。UE位置位后,连接USART模块的总线上的时钟就打开了,预示着总线上的数据向USART模块的收发缓冲区进行通讯了。
USART模块发送器的使能是以USART_CR1中的TE位被置位来触发的。
-
TE触发:触发之前需要软件向USART_DR写入数据F1,TE触发的瞬间,时钟跳动(波特率产生)就发动了,USART_SR寄存器的位TXE标志硬件1->0,并且发送引脚TX上产生了一个空闲帧。TXE标记硬件0->1(TXE标记为1,表示USART_DR里没有数据), 预示着USART_DR中的F1已经放入了发送移位寄存器中。(此帧:移位寄存器发送空闲帧,装载F1)
-
第1帧:软件向发送数据寄存器USART_DR中写入待发送数据F2(总线时钟,比较快,带来结果TXE标志硬件1->0,TXE标记为0表示USART_DR里有数据),数据帧F1发送完毕后,有数据F2下载更新到移位寄存器中,TXE标记硬件0->1,预示着USART_DR数据已经放入了发送移位寄存器中。(此帧:移位寄存器发送F1,装载F2)
-
第2帧:软件向发送数据寄存器USART_DR中写入待发送数据F3(总线时钟,比较快,带来结果TXE标志硬件1->0,TXE标记为0表示USART_DR里有数据),数据帧F2发送完毕后,有数据F3下载更新到移位寄存器中,TXE标记硬件0->1,预示着USART_DR数据F3已经放入了发送移位寄存器中。(此帧:移位寄存器发送F2,装载F3)
-
最后1帧:上一帧数据发送完毕,TXE标记硬件0->1后,最后一个USART_DR数据F3已经放入了发送移位寄存器中,软件不再向数据寄存器USART_DR中写入数据(TXE标记一直为1,即:USART_DR寄存器中没有数据),数据帧F3发送完毕后,不再有数据下载更新到移位寄存器中,此种情况带来一个结果就是,TC标记置位,时钟跳动结束,此次传输完毕。
3.2. 发送器的流程
-
通过在USART_CR1寄存器上置位UE位来激活USART
-
编程USART_CR1的M位来定义字长。
-
在USART_CR2中编程停止位的位数。
-
如果采用多缓冲器通信,配置USART_CR3中的DMA使能位(DMAT)。按多缓冲器通信中的描述配置DMA寄存器。
-
利用USART_BRR寄存器选择要求的波特率。
-
设置USART_CR1中的TE位,发送一个空闲帧作为第一次数据发送。
-
把要发送的数据写进USART_DR寄存器(此动作清除TXE位)。在只有一个缓冲器的情况下,对每个待发送的数据重复步骤7。
-
在USART_DR寄存器中写入最后一个数据字后,要等待TC=1,它表示最后一个数据帧的传输结束。当需要关闭USART或需要进入停机模式之前,需要确认传输结束,避免破坏最后一次传输
4.接收器
未完待续