1.基础知识
并行通信可以比作多车道,串行通信可以理解为单通道。
2.应用举例
++(1.)常用寄存器
USART_SR状态寄存器
USART_DR数据寄存器
USART_BRR波特率寄存器
++(2.)串口相关库函数
void USART_Init(); //串口初始化:波特率,数据字长,奇偶校验,硬件流控以及收发使能
void USART_Cmd();//使能串口
void USART_ITConfig();//使能相关中断
void USART_SendData();//发送数据到串口,DR
uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据
FlagStatus USART_GetFlagStatus();//获取状态标志位
void USART_ClearFlag();//清除状态标志位
ITStatus USART_GetITStatus();//获取中断状态标志位
void USART_ClearITPendingBit();//清除中断状态标志位
++(3.)一般步骤
++(4.)实例程序
#include "stm32f10x.h"
void Uart_init(void)//配置串口通信
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
//1.gpio的时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
//2.gpio端口模式设置,设置为全双工串口通信状态
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//发送推挽
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);//PA9
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//接收浮空
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);//PA10
//3.串口参数初始化
USART_InitStructure.USART_BaudRate=115200;//设置波特率
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;//设置收发
USART_InitStructure.USART_Parity=USART_Parity_No;//不进行奇偶校验
USART_InitStructure.USART_StopBits=USART_StopBits_1;//设置停止位1位
USART_InitStructure.USART_WordLength=USART_WordLength_8b;//设置有效数据八位
USART_Init(USART1,&USART_InitStructure);//初始化串口
//4.配置中断
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//开启接收中断
//设置中断参数
NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;//串口1中断
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//给串口1中断使能
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//设置抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//设置响应优先级
NVIC_Init(&NVIC_InitStructure);
//5.串口使能
USART_Cmd(USART1,ENABLE);
}
//6.中断处理函数
void USART1_IRQHandler(void)
{
u8 res;
if(USART_GetITStatus(USART1,USART_IT_RXNE))//RXNE:读数据寄存器非空。0代表没有收到数据,1代表已经收到数据并且可以读出
{
res= USART_ReceiveData(USART1); //从USART_DR寄存器读出数据
USART_SendData(USART1,res);//发送数据
}
}
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//只要涉及中断就要提前分组,并且只分一次
Uart_init();
while(1);//让程序停在这里,不然main瞬间就会执行完
}
注意
发送端(PA9)为复用推挽输出,接收端(PA10)为浮空输入模式。(详见中文参考手册外设的GPIO配置章节)。如果是正点原子的用户,实验的时候把模板里的usart.c移除掉,否则会报重复定义
39.0625的十六进制表示为27.1,操作BRR寄存器的第十六位配置结果就为0x0271.