常用的串口相关寄存器介绍

常用的串口相关寄存器:

  • USART_SR状态寄存器:

    file

    FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);COPY
  • USART_DR数据寄存器:

    file

void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);
uint16_t USART_ReceiveData(USART_TypeDef* USARTx);COPY
  • USART_ BRR波特率寄存器:

    file

    void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);COPY

波特率计算:

file


下面我们来介绍如何通过USARTDIV得到串口USART_BRR寄存器的值。假设我们的串口Ⅰ要设置为115200的波特率,而PCLK2的时钟为72M。这样,我们根据上面的公式有:
USARTDIV=72000000/(115200*16)=39.0625
那么得到:

DIV_Fraction=16*0.0625=1=OXO1;//小数部分
DIV_Mantissa=39=0X27;//整数部分COPY

这样,我们就得到了USARTI->BRR的值为0X0271。只要设置串口1的BRR寄存器值为0X0271就可以得到115200的波特率。

串口操作相关库函数(省略入口参数):

void USART_Init();//串口初始化:波特率,数据字长,奇偶校验,硬件流控以及收发使能
void USART Cmd();//使能串口
void USARTITConfig();//使能相关中断

//发送接受——DR
void USART_ SendData();//发送数据到串口, DR
uint16_ t USART_ReceiveData();//接受数据,从DR读取接受到的数据

//获取状态标志位——SR
FlagStatus USARTGetFlagStatus();//获取状态标志位
void USART ClearFlag();//清除状态标志位
ITStatus USART GetlTStatus();//获取中断状态标志位
void USART ClearlTPendingBit();//清除中断状态标志位COPY

串口配置的一般步骤

1,串口时钟使能, GPIO时钟使能:RCC_APB2PeriphClockCmd0;
2,串口复位:USART Delnit();这一步不是必须的
3,GPIO端口模式设置:GPIO Init();模式设置为GPIO Mode AF_PP
4,串口参数初始化:USART Init();
5,开启中断并且初始化NVIC (如果需要开启中断才需要这个步骤)
NVIC Init();
USART ITConfig0);
6,使能串口:USART Cmd();
7,编写中断处理函数:USARTX IRQHandler();
8,串口数据收发:
void USART SendData();//发送数据到串口, DR
uint16 t USART ReceiveData();//接受数据,从DR读取接受到的数据
9,串口传输状态获取:
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx,uint16_tUSART FLAG);
void USART_ClearlTPendingBit(USART_TypeDef USARTx,uint16_t USART_IT);

相关代码讲解:

对应相关步骤,已注释。

void My_USART1_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStrue;
    USART_InitTypeDef USART_InitStrue;
    NVIC_InitTypeDef NVIC_InitStrue;
    //1使能时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
    //2初始化IO口
    GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;
    GPIO_InitStrue.GPIO_Pin=GPIO_Pin_9;
    GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
  GPIO_Init(GPIOA,&GPIO_InitStrue);

    GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;
    GPIO_InitStrue.GPIO_Pin=GPIO_Pin_10;
    GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
  GPIO_Init(GPIOA,&GPIO_InitStrue);
    //3初始化串口
    USART_InitStrue.USART_BaudRate=115200;
    USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
    USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;//输出模式
    USART_InitStrue.USART_Parity=USART_Parity_No;//奇偶校验
    USART_InitStrue.USART_StopBits=USART_StopBits_1;//起始位
    USART_InitStrue.USART_WordLength=USART_WordLength_8b;//停止位
    USART_Init(USART1,&USART_InitStrue);

    USART_Cmd(USART1,ENABLE);//使能串口1

    //5开启接收中断
    USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
    //配置中断
    NVIC_InitStrue.NVIC_IRQChannel=USART1_IRQn;//入口参数(通道)
    NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;//入口参数(使能)
    NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级
    NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;//响应优先级
    NVIC_Init(&NVIC_InitStrue);

}

//编写中断服务函数
void USART1_IRQHandler(void)
{
    u8 res;//定义变量

 //8串口数据收发,9串口传输状态获取
     if(USART_GetITStatus(USART1,USART_IT_RXNE))//判断是接收中断
 {
     res= USART_ReceiveData(USART1);//接收值给变量 
     USART_SendData(USART1,res);   //发送接收的数据
  }
}

 int main(void)
 {  
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    My_USART1_Init();
     while(1);

 }

### 串口移位寄存器的工作原理 #### 工作原理概述 串口通信中的移位寄存器主要用于数据的逐位传输。在实际应用中,移位寄存器可以看作是一个临时存储单元,在数据发送和接收过程中起到缓冲作用[^2]。当数据通过串行接口进行传输时,每一位数据会被逐步加载到移位寄存器中,并按照指定的方向(左移或右移)移动。 对于串口通信而言,移位寄存器的操作通常与硬件电路紧密配合。例如,在SPI协议下,主机和从机之间的数据交换可以通过两个移位寄存器相互连接的方式实现[^3]。这种设计使得数据能够在两方之间高效地流动,而无需复杂的控制逻辑。 --- #### 数据传输机制 1. **数据装载阶段** 发送端会先将待发送的数据字节加载至内部的移位寄存器中。这一过程通常是并行完成的,即一次性将整个字节写入寄存器[^4]。 2. **位移操作** 移位寄存器会在时钟信号的作用下执行逐位移出的动作。具体来说,每接收到一个时钟脉冲,当前最高有效位(MSB 或 LSB,取决于模式设置)就会被推送到输出引脚上,同时其余比特向低位方向移动一位[^5]。 3. **同步与时序管理** 停止位的存在不仅标志着单次帧传输的结束,还允许双方调整各自的时钟偏差,从而维持长期稳定的通信质量[^5]。如果未正确处理这些细节,则可能导致误码或者丢包现象发生。 4. **接收侧流程** 类似于发送部分,接收装置同样配备有一个对应的移位寄存器用来捕捉来自线路上传来的各单独比特流。随着新到达的信息不断填充进来,旧的内容则逐渐溢出直至最终形成完整的字符形式供后续软件层解析使用。 --- ### STM32 中的具体实现方法 以 STM32 微控制器为例,利用其内置外设 UART 可轻松构建起基于 RS-232 的经典异步串行链路环境[^1]。下面给出一段典型代码片段展示如何调用 HAL 库函数完成简单的字符串消息广播任务: ```c #include "stm32f4xx_hal.h" void SendStringOverUART(const char* str){ while(*str != '\0'){ HAL_UART_Transmit(&huart2,(uint8_t*)str,1,HAL_MAX_DELAY); str++; } } ``` 此例程展示了最基本的连续字符序列推送技巧——每次仅传送单一 ASCII 编码数值直到遇到终止符为止。当然实际项目开发当中往往还需要考虑诸如错误检测纠正算法集成等问题以便进一步提升整体可靠性水平。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值