3-STM32F1串口通信-查询方式

STM32F1串口通信-查询方式

STM32F1的串口有好几组,STM32的串口还有分数波特率发生器、支持同步单线通信和半双工单线通讯、支持 LIN、 支持调制解调器操作、 智能卡协议和 IrDA SIR ENDEC 规范、具有 DMA等。 
虽然有这么多功能,但是这里为了总结串口的原理,采用最简单的查询的方式和电脑进行通信。
其实原子哥的《STM32F1开发指南-库函数版本》已经解释的非常详细了,这里只是按照我自己的风格叙述一遍而已。
使用串口的步骤
1,打开IO时钟
2,配置串口IO口模式,具体方式查看《STM32中文参考手册》8.1.11章节,接收引脚和发送引脚模式不一样的,所以要分别配置。
5,打开串口时钟
6,配置前最好复位下串口,这是个好习惯
7,配置串口,就是配置完串口初始化函数里面的选项就好了
8,使能串口
9,配置完成,下面可以正式使用了

本实验的功能;接收从电脑发送来的数据,然后发送回去
数据接收和发送的步骤;
1,不停地查询接收数据的状态标志位
2,当查询到有数据来时就接收数据放在变量中
3,发送接收到的数据,
4,等待数据发送完成,查询数据发送完成状态标志位
5,继续等待接收数据

注意;本实验只是示例,每次接收的数据长度是有限制的,本实验只是总结下串口的原理,估计项目中不会有人这样使用串口。
代码如下;

#include "sys.h"
#include "delay.h"
/************************************************************
功能;接收从电脑发送来的信息,并发送回电脑
串口接在PA9,PA10

串口配置步骤
为了更好的说明串口的本质,这里采用查询的方式,并没有使用中断
1,打开串口IO时钟
2,选择串口接收 引脚
3,选择接收引脚模式,这个模式要看《中文手册》8.1.11章节
4,配置IO翻转速度
5,配置串口发送引脚,方法同串口接收引脚,但是IO模式不一样
6,打开uart1时钟
7,选择串口波特率
8,选择是否需要硬件流控制
9,打开接收和发送模式
10,选择是否启用奇偶校验
11,选择停止位个数
12,选择数据长度
13,配置完成后一定要记得使能串口
14,不断查询接收状态位,然后该干嘛就干嘛去,发送数据的时候记得等待数据发送完成

****************************************************************/

void init__uart1()
{
	GPIO_InitTypeDef GPIO_InitStruct;
	USART_InitTypeDef USART_InitStruct;
	
	//	串口IO配置,PA9,PA10
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//IO时钟打开
	
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;//IO方式具体看《中文手册》8.1.11章节
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);

	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;//IO方式具体看《中文手册》8.1.11章节
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	
	//配置串口1
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//打开串口时钟
	
	USART_DeInit(USART1);//在配置串口前复位下是个好习惯
	USART_InitStruct.USART_BaudRate=115200;	//波特率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;					//停止位1位
	USART_InitStruct.USART_WordLength=USART_WordLength_8b;		//数据长度8位
	USART_Init(USART1,&USART_InitStruct);
	USART_Cmd(USART1,ENABLE);	//配置完成后一定要记得使能串口
}

 int main(void)
 {	
	char re_data=0;//为了接收字符,还是定义为字符类型吧
	 
	delay_init();	//延时函数初始化
	init__uart1();//串口1初始化
	while(1)
	{
		if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==1) //查询接收数据状态标志位
		{
			re_data=USART_ReceiveData(USART1);	//接收数据
			USART_SendData(USART1,re_data);			//发送数据
			while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET); //等待数据发送完毕
		}
	}
 }
 
 
 

你可能感兴趣的:(STM32F1)