串口相关寄存器:
USART_SR 状态寄存器(里面的一些标志位类似51的TI,RI)
USART_DR 数据寄存器(类似SBUF)
USART_BRR 波特率寄存器(波特率寄存器,15:4位定义了USARTDIV的整数部分,3:0位定义了USARTDIV的小数部分)
波特率=fpclock(1,2)/(16*USARTDIV)
USART_CR1 设置一些发送或接收使能,以及一些中断使能
编写串口程序的步骤:
1.串口时钟使能,GPIO时钟使能,
使能串口对应的APB总线,以及GPIO对应的AHB总线
2.串口资源映射
3.设置GPIO端口模式 //GPIO_InitStruct
4.串口初始化, //USART_InitStruct
5.使能串口 //USART_Cmd其实就是配置CR1寄存器
6.配置中断 //设置串口的中断方式
7.设置中断优先级, //NVIC_InitStruct
在设置抢占优先级和子优先级之前需要先在主函数比较靠前的地方设置分组
8.写串口中断服务函数
9.串口传输状态获取USART_Flags 以及解挂(清除标志位)
void MY_USART_INIT()
{
GPIO_InitTypeDef GPIO_InitStruct;
USART_InitTypeDef USART_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
//1.使能GPIOA和USART1
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd (RCC_APB2Periph_USART1,ENABLE);
//2.串口资源映射
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9复用为USART1
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10复用为USART1
//3.GPIO端口模式设置,模式设置为复用
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStruct.GPIO_Speed = GPIO_High_Speed;
GPIO_Init (GPIOA,&GPIO_InitStruct);
//4.串口参数初始化
USART_InitStruct.USART_BaudRate = 115200;
USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_InitStruct.USART_Parity = USART_Parity_No;
USART_InitStruct.USART_StopBits = USART_StopBits_1;
USART_InitStruct.USART_WordLength = USART_WordLength_8b;
USART_Init(USART1,&USART_InitStruct);
//5.使能串口
USART_Cmd(USART1, ENABLE);
//6.配置中断
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//设置接收缓冲器非空中断
//7.中断优先级的设置,设置之前要先在主函数比较靠前的位置设置分组
NVIC_InitStruct.NVIC_IRQChannel= USART1_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1; //子优先级
NVIC_Init(&NVIC_InitStruct);
}
//中断服务函数,没有入口参数,没有返回
void USART1_IRQHandler(void)
{
u16 REC = 0;
if(USART_GetITStatus(USART1, USART_IT_RXNE)==1) //证明一下是缓冲器非空产生
{
REC = USART_ReceiveData(USART1);
USART_SendData(USART1,REC);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==0);//等待发送完成
}
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
}