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

常用的串口相关寄存器:

  • 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);

 }

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值