STM32学习心得--串行通信相关

1.STM32中与穿行通信相关的寄存器

1.USART_SR 状态寄存器,主要用来放置某些标志位

2.USART_DR 数据寄存器,用于存放数据

3.USART_BRR 波特率寄存器,设置波特率

 

对于用库函数来编写串行通信相关的代码来说,寄存器并不是我们所重点关注的内容,虽然他很重要。如需更多了解,可以查阅“STM32中文参考手册”等

2.波特率的计算

其中,Fpclkx是给串口的时钟(PCLK1用于USART2、3、4、5,PCLK2用于USART1);

USARTDIV是一个无符号定点数。我们只要得到USARTDIV 的值,就可以得到串口波特率寄存器USART1->BRR的值,反过来,我们得到USART1->BRR的值,也可以推导出USARTDIV:的值。但我们更关心的是如何从USARTDIV的值得到USART_BRR的值,因为一般我们知道的是波特率,和 PCLKx的时钟,要求的就是USART_BRR的值。

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

 USARTDIV=72000000/(115200*16)=39.0625

 那么得到:

 DIV_Fraction=16*0.0625=1=0x01;

DIV_Mantissa=39=0X27;

 然后分别把整数和小数送入波特率设置寄存器

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

3.串口操作常用库函数

与之相关的库函数在“stm32f10x_uart.h”文件中有相关的函数声明。

对其中常用的库函数进行注释


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

void USART_StructInit();
void USART_ClockInit();
void USART_ClockStructInit();

void USART_Cmd();//使能串口
void USART_ITConfig();//使能相关中断

void USART_DMACmd();
void USART_SetAddress();
void USART_WakeUpConfig();
void USART_ReceiverWakeUpCmd();
void USART_LINBreakDetectLengthConfig();
void USART_LINCmd();


void USART_SendData();//发送数据到串口发送寄存器
uint16_t USART_ReceiveData();//接收数据,从DR读取接收到的数据


void USART_SendBreak();
void USART_SetGuardTime();
void USART_SetPrescaler();
void USART_SmartCardCmd();
void USART_SmartCardNACKCmd();
void USART_HalfDuplexCmd();
void USART_OverSampling8Cmd();
void USART_OneBitMethodCmd();
void USART_IrDAConfig();
void USART_IrDACmd();

FlagStatus USART_GetFlagStatus();//获取状态标志位
void USART_ClearFlag();//清除状态标志位
ITStatus USART_GetITStatus();//获取中断状态标志位
void USART_ClearITPendingBit();//清除中断状态标志位

下面着重分析串口初始化函数

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

 共有两个形参,第一个是串口标号,共有USART1、USART2、USART3、UART4、UART5这几个参数可供选择。

 第二个参数为串口初始化结构体指针,下面来分析结构体中各成员变量

typedef struct
{
  uint32_t USART_BaudRate;     //波特率,其计算方法前文已经给出      

  uint16_t USART_WordLength;   //字长 可以是8位或9位    

  uint16_t USART_StopBits;     //停止位      

  uint16_t USART_Parity;       //奇偶校验位      
 
  uint16_t USART_Mode;         //串口模式 ,发送or接收使能,或者两个都打开      

  uint16_t USART_HardwareFlowControl; //硬件流,此参数很少使用

} USART_InitTypeDef;

4.(*)串口配置的一般步骤


1.串口时钟使能, GPIO时钟使能:RCC_APB2PeriphClockCmd();

2.串口复位:USART_Delnit();//这一步不是必须的

3.GPIO端口模式设置:GPIO_lnit();模式设置可以参考STM32中文参考手册

4.串口参数初始化:USART_Init();

5.使能串口:USART_Cmd();

6.开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤)

1.NVIC_PriorityGroupConfig();//配置中断优先级分组,建议写在main函数开头,并且只写一次。

2.USART_ITConfig();

3.NVIC_Init();//在misc.h文件中

typedef struct
{
  uint8_t NVIC_IRQChannel;                    

  uint8_t NVIC_IRQChannelPreemptionPriority;  

  uint8_t NVIC_IRQChannelSubPriority;         

  FunctionalState NVIC_IRQChannelCmd;         
 
} NVIC_InitTypeDef;

NVIC_IRQChannel;  其参数在stm32f10x.h中以IRQn结尾的参数

NVIC_IRQChannelCmd;  ENABLE OR DISABLE

接下来两个是用来设置抢占优先级和子优先级,与其参数前面配置的分组有关

NVIC_IRQChannelPreemptionPriority;  

NVIC_IRQChannelSubPriority; 

7.编写中断处理函数: USARTx_IRQHandler();

在编写中断处理函数时,用ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);来判断是否是此串口下触发了中断

接着使用USART_ReceiveData()来接收数据。

再把其发送出去

8.串口数据收发:
void USART_SendData();//发送数据到串口, DR
uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据

9.串口传输状态获取:
FlagStatus USART_GetFlagStatus(USART TypeDef* USARTX,uint16_t USART _FLAG)

void USART_ClearITPendingBit(USART_TypeDef*USARTX,uint16_t USART_IT);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值