STM32的USART学习笔记

目录

USART框图

1.1. 配置编码(使用库函数)

1.2 函数调用缩略图

2. 传输帧特征

3. 发送器配置步骤


  1. USART框图

波特率模块负责产生一定频率的时钟信号,通过设置寄存器USARTDIV可以产生不同的波特率。

  1. PWRDATA总线指的是APB1或者APB2总线

  2. 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. 发送器的流程

  1. 通过在USART_CR1寄存器上置位UE位来激活USART

  2. 编程USART_CR1的M位来定义字长。

  3. 在USART_CR2中编程停止位的位数。

  4. 如果采用多缓冲器通信,配置USART_CR3中的DMA使能位(DMAT)。按多缓冲器通信中的描述配置DMA寄存器。

  5. 利用USART_BRR寄存器选择要求的波特率。

  6. 设置USART_CR1中的TE位,发送一个空闲帧作为第一次数据发送。

  7. 把要发送的数据写进USART_DR寄存器(此动作清除TXE位)。在只有一个缓冲器的情况下,对每个待发送的数据重复步骤7。

  8. 在USART_DR寄存器中写入最后一个数据字后,要等待TC=1,它表示最后一个数据帧的传输结束。当需要关闭USART或需要进入停机模式之前,需要确认传输结束,避免破坏最后一次传输

4.接收器

未完待续

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青草地溪水旁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值