常用的串口相关寄存器:
-
USART_SR状态寄存器:
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);
COPY -
USART_DR数据寄存器:
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);
uint16_t USART_ReceiveData(USART_TypeDef* USARTx);
COPY
- USART_ BRR波特率寄存器:
void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);
COPY
波特率计算:
下面我们来介绍如何通过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);
}