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