STM32之USART学习

烈酒焚心 提交于 2020-01-12 22:58:49

一、 串口的基本知识

串口的基本知识,可以参考如下文章:
a.串口基础知识文章1
b.串口基础知识文章2

二、STM32配置USART

下面是配置USART过程的思维导图,如下:
在这里插入图片描述
下面是各个过程的具体实现过程,并带有注释。
(1)USART对应GPIO配置
具体代码如下:

GPIO_InitTypeDef  GPIO_InitStructure;//定义GPIO结构体

/*开启时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

//UART发送端PA9引脚初始化
GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_9;						
GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;//设置为复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);

//UART接收端PA10引脚初始化
GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_10;						
GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;//设置为模拟输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);

需要注意的是:串口发送引脚需要配置成“复用推挽输出”;串口发送引脚需要配置成“模拟输入”;
(2)USART设置(包含串口中断设置)
具体代码如下:

	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef  NVIC_InitStructure;
	
	/*开启时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

	//UART初始化设置
	USART_InitStructure.USART_BaudRate 			  = bound;							//波特率设置,参数传递
	USART_InitStructure.USART_Mode 				  = USART_WordLength_8b;			//设置帧长度为8位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;	//一般选择无硬件流控制
	USART_InitStructure.USART_Parity 			  = USART_Parity_No;				//无奇偶校验
	USART_InitStructure.USART_StopBits 			  = USART_StopBits_1;				//一位停止位
	USART_InitStructure.USART_Mode 				  = USART_Mode_Tx | USART_Mode_Rx;	//收发使能
	USART_Init(USART1,&USART_InitStructure);

	//使能串口
	USART_Cmd(USART1,ENABLE);
	
	//清除串口中断标志
	USART_ClearFlag(USART1,USART_FLAG_TC);
	
	//使能串口中断
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
	
	//NVIC配置,凡是使用中断皆配置
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;		  //选择中断源,在“stm32f10x.h”文件中查找
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //抢占优先级为2
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;		  //响应优先级为0
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);	

需要注意的是:
a.NVIC中断控制器的设置
凡是使用中断,都需要配置NVIC,包括中断分组、抢占/响应优先级等,其中的“中断源名称”在“stm32f10x.h”文件中查找。
b.在使能串口中断时,一定要将串口中断标志清除。
(3)串口中断服务函数
具体的代码如下:功能是接送串口发送来的数据

void USART1_IRQHandler(void)
{
	u8 r;
	
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断
	{
		USART_ClearITPendingBit(USART1,USART_IT_RXNE);
		r =USART_ReceiveData(USART1);//(USART1->DR);	//读取接收到的数据
		
	} 
}

需要注意的点:
a.串口中断服务函数的名称在哪?
在STM32的启动文件里,带汇编的那块
b.获取的串口的标志如何找?
可以参考STM32固件库手册,或参考下面这篇文章:
STM32的USART发送数据时如何使用TXE和TC标志
主要是知道各个标志代表的含义是?是在什么时候置1/0?标志需要什么时候清除?例如:USART_IT_RXNE标志,是指串口接受满了,发生中断,此时标志置1,因此可以用来判断串口是否已经接受完成数据。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!