STM32F4——串口(USART)通信总结

一、概述:

USART即通用同步异步收发器,用于灵活的与外部设备全双工数据交换,它支持多种通信传输方式,可以通过小数波特率发生器提供多种波特率。

二、串口IO:

对于STM32F407有6个串口,对于每个串口对应的IO可以从芯片原理图中对应找到,对于其串口1,对应的IO为PA9/PB6端口对应串口1的发送端,PA10/PB7端口对应串口1的接收端。

三、通信参数:

对于数据的传输需要设定好相关的数据传输协议,因此必要的参数设定是有必要的,其中包括:起始位、数据位(8位或9位)、奇偶校验位(开启与否)、停止位(1、1.5、2位)、波特率设定。

四、相关寄存器:

其中相关寄存器有:状态寄存器、数据寄存器、波特率寄存器、控制寄存器1、控制寄存器2、控制寄存器3、保护时间和预分频寄存器;下边简单分析一下前三个寄存器。

1、状态寄存器:

目前认识的位有:TXE:发送寄存器为空;TC:发送完成;RXNE:读取数据寄存器不为空;ORE:上溢错误;FE:帧错误;PE:奇偶校验错误。

2、数据寄存器:该寄存器只有低8位有效,而且具有读写操作,有关该寄存器中的数据时要发送的数据还是接受到的数据取决于执行的操作是“读取”还是“写入”。

3、波特率寄存器:

波特率寄存器用来通过设定相关数值通过时钟产生相应的波特率。对于串口1的数值设定和产生波特率的关系如下:

其中在寄存器中会设定相应的值,DIV_Mantissa[11,0]用来设定分频系数的整数部分,DIV_Fraction[3,0]用来设定分频系数的小数部分。

五、相关代码分析:

下面依照串口的配置过程,来分析相关代码:

1、相关时钟使能:

	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOA时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1时钟

2、引脚复用映射:

	//串口1对应引脚复用映射
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9复用为USART1
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10复用为USART1

3、GPIO端口模式设定:

	//USART1端口配置
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9与GPIOA10
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	//速度50MHz
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
	GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA9,PA10

4、串口参数设定:

        //USART1 初始化设置
	USART_InitStructure.USART_BaudRate = bound;//波特率设置
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式
    USART_Init(USART1, &USART_InitStructure); //初始化串口1

5、配置相关中断:

#if EN_USART1_RX
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启相关中断

	//Usart1 NVIC 配置
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断通道
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;		//子优先级3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器、
#endif

6、使能串口(及注意相关标志位):

        USART_Cmd(USART1, ENABLE);  //使能串口1
	USART_ClearFlag(USART1, USART_FLAG_TC);

7、中断服务函数(根据需要自行处理):

	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
	{
		Res =USART_ReceiveData(USART1);//(USART1->DR);	//读取接收到的数据

		if((USART_RX_STA&0x8000)==0)//接收未完成
		{
			if(USART_RX_STA&0x4000)//接收到了0x0d
			{
				if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
				else USART_RX_STA|=0x8000;	//接收完成了
			}
			else //还没收到0X0D
			{
				if(Res==0x0d)USART_RX_STA|=0x4000;
				else
				{
					USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
					USART_RX_STA++;
					if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收
				}
			}
		}
  }

8、剩下就是根据串口的相关传输状态来进行数据的发送和接收,可依据自己的需要进行设计和分析。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-05 12:33:15

STM32F4——串口(USART)通信总结的相关文章

mini2440裸机试炼之——DMA直接存取 实现Uart(串口)通信

这个只能作为自己初步了解MDA的开门篇 实现功能: 将字符串数据通过DMA0通道传递给UTXH0,然后在终端 显示.数据传输完后,DMA0产生中断,beep声, LED亮. DMA基本知识 计算机系统中各种常用的数据输入/输出方法有查询方式(包括无条件及条件传送方式)和中断方式,这些方式适用于CPU与慢速及中速外设之间的数据交换.但当高速外设要与系统内存或者要在系统内存的不同区域之间进行大量数据的快速传送时,就在一定程度上限制了数据传送的速率.直接存储器存取(DMA)就是为解决这个问题提出的,采

stm32之USART通信

任何USART通信,需要用到2个对外连接的引脚:RxD,TxD: RxD是输入引脚,用于串行数据接收: TxD是输出引脚,用于串行数据发送: SCLK引脚:发生器时钟输出(同步模式下,异步模式下不需要) 在IrDA模式(红外模式)下需要下列引脚: IrDA_RDI: 红外模式下的数据输入: IrDA_TDO:红外模式下的数据输出: 调制解调模式下需要: nCTS:清除发送: nRTS:发送请求: 数据的接收/发送过程示意图: 异步串行通信协议需要定义以下5个内容: 1.起始位 2.数据位(8/9

串口(USART)框图的讲解

STM32 的 USART 简介 通用同步异步收发器(Universal Synchronous Asynchronous Receiver and Transmitter)是一个串行通信设备,可以灵活地与外部设备进行全双工数据交换.有别于 USART 还有一个 UART(Universal Asynchronous Receiver and Transmitter),它是在 USART 基础上裁剪掉了同步通信功能,只有异步通信.简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用

STM32F4之USART【库函数操作】

STM32F407xx内嵌四个通用同步/异步接收器??(USART1,USART2,USART3 和USART6)和两个通用异步收发器(UART4和UART5).这6个接口提供异步通信的IrDASIR ENDEC支持,多机通信模式,单线半双工通信模式LIN主/从功能. USART1和USART6接口能够速度高达10.5 Mbit / s的通信其他可用的接口通信高达5.25bit/s.USART1,USART2,USART3和USART6还提供硬件管理的CTS,RTS信号,智能卡的模式(ISO78

STM32F4 串口实验中收不到超级终端发送的数据,调试工具却能够

我用串口精灵发送数据没有问题.可是接收数据没反应. 串口接受的时候必需要用中断的.你发送仅仅靠单一的标志位是能够推断的,可是接受的时候,你是一直停留在while里面,我们推断接受是否完毕.通过检測是否收到0x0D.0x0A的连续来检測是否结束.当检測到这个结束序列后,就会置位USART_RX_STA的最高位来标记已经会搜到一次数据.之后等待外部函数清空才干够第二次接受. 改动:超级终端发送设置,以换行作为发送末尾.OK while(1) { if(USART_RX_STA&0x8000) { l

C# 简单串口链接通信 详细介绍

因为是测试 所以只用了一台点电脑. 工具:一根串口线 方法:链接电脑的串口,把串口线中的 2 和 3 号指针短路. 原因:2号指针表示发送数据.3号指针表示接受数据. C# 软件界面 运行流程: 1,点击 开启COM1 按钮   打开串口 2,在 textbox2 中输入要发送的内容 3,点击 发送 按钮把内容发送出去 4,点击 接收 按钮接收发送过来的数据 5,接收过来的数据会显示在 textbox3 中 软件源代码: # 项目工程的名称是:WindowsApplication2 1 usin

STM32F4串口打印 while函数出错

总结:写while函数等类型的循环要添加"{ }",不然不知道会出什么错误. 原函数: void division_func(void) { char *p=NULL; int i =0; //如USART1接收到的字符串:2013-12-14 //以'-'分割字符串,现在分割出的第一个字符串为:2013 p = strtok((char *)g_usart1_recv_buf,"-"); printf("分割:%d  %s\r\n", i++,

STM32F4学习笔记7——USART Part2

硬件流控制 使用 nCTS 输入和 nRTS 输出可以控制 2 个器件间的串行数据流.如图显示了在这种模式 下如何连接 2 个器件: 分别向 USART_CR3 寄存器中的 RTSE 位和 CTSE 位写入 1,可以分别使能 RTS 和 CTS 流 控制. RTS 流控制 如果使能 RTS 流控制 (RTSE=1),只要 USART 接收器准备好接收新数据,便会将 nRTS 变 为有效(连接到低电平).当接收寄存器已满时,会将 nRTS 变为无效,表明发送过程会在 当前帧结束后停止.下图图显示了

c#串口通信讲解(一)(winform、wpf)

串口操作需要注意的几点如下: 1.如果是USB转串口:则需要安装USB转串口驱动,附件有此驱动. 2.串口打开状态最好不要直接插拔串口,可能会导致中控板或者串口线烧坏. 3.使用串口调试工具CEIWEI,下一章节会贴上使用教程 简单的串口收发通信,有以下步骤: 1.打开制定的串口.绑定串口接收事件 2.初始化串口指令 3.发送串口指令 -------打开串口代码-------- /// <summary> /// 打开串口 /// </summary> /// <param