版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章UART通信引言本章学习目标了解UART通信的概念。理解UART的通信协议。UART模块。2掌握开发板UART编程与调试方法。6.1UART通信简介6.1.1概述4
通用异步收发器UART(UniversalAsynchronousReceiver/Transmitter),是一种广泛应用于嵌入式领域的串行、异步、全双工的通信协议,其工作原理是逐位传输数据的每个二进制位,将所需传输的数据一位接一位地传输,在UART通讯协议中信号线上的状态位高电平代表‘1’,低电平代表‘0’。其特点是通信线路简单,只要一对传输线就可以实现双向通信,大大降低了成本。通用异步收发器UART是一个异步串行的通信接口,UART主要用于和外部芯片的UART进行对接,实现两芯片间的通信。芯片提供3个UART单元,支持2线模式。UART通信如图6.1所示。图6.1UART通信示意图6.1.1概述5
串行通信是指利用一根传输线逐位依次传输数据,也可以用两根信号线组成全双工通信,如:RS232。特点是通信线路简单,使用简单的电缆即可实现通信,成本降低,适合远距离通信的应用,但传输速度慢。
异步通信以一个字符为传输单位。通信中两个字符之间的时间间隔不固定,但同一字符中两个相邻位之间的时间间隔是固定的。一般来说,两个UART设备之间的通信不需要时钟线。此时,需要在两个UART设备上指定相同的传输速率,以及空闲位、起始位、奇偶校验位和结束位,即遵循相同的协议。
数据传输速率以波特率表示,即每秒传输的位数。例如,如果数据传输速率为120个字符/秒,每个字符为10位(1个起始位、7个数据位、1个校验位、1个停止位),则其传输的波特率为10×120=1200个字符/秒=1200波特率。6.1.2功能描述6UART具有以下功能特点:
支持64×8bit的发送FIFO和64×12bit的接收FIFO(FirstInFirstOut)。支持数据位和停止位的位宽可编程:
(1)数据位可通过编程设定为5/6/7/8bit。
(2)停止位可通过编程设定为1/2bit。
支持奇、偶校验方式或无校验。
支持传输速率可编程、支持整数小数分频。支持接收FIFO中断、发送FIFO中断、接收超时中断、错误中断。支持初始中断状态查询和屏蔽后中断状态查询。支持通过编程禁止UART模块或UART发送/接收功能以降低功耗。UART0不支持硬件流控;UART1、UART2支持硬件流控。6.1.3接口信号7UART接口信号描述如表6.1所示。
信号名宽度(bit)方向功能描述RXD1I输入数据。TXD1O输出数据。CTS1I清除发送信号,用于硬件流控,低有效。RTS1O请求发送信号,用于硬件流控,低有效。表6.1UART接口信号描述6.2UART通信协议6.2UART通信协议9当两个设备需要通过UART协议进行通讯时,它们需要同时约定好以下内容:
(1)每一位信号的时间长度T(波特率=1/T)。
(2)帧结构中每一项的具体位数。
(3)是否有校验位,以及校验位的机制(奇/偶等)。数据通信格式如图6.2所示。图6.2数据通讯格式图6.2UART通信协议10波特率是UART协议,或者说所有异步串行协议,非常重要的一个概念,即单位时间内(1秒)可表示的bit位个数,或者也可以表述为bit位宽的倒数。例如一个波特率为115200的UART波形表示1秒可容纳115200个bit位,也就是说每一位bit数据占大约8.68uS的时长。波特率的定义如图6.3所示。图6.3波特率定义起始位:每次通信开始时,发送方发送一个逻辑“0”信号(VOL),表示传输字符的开始。由于总线空闲时为高电平,因此在开始通信时先发送一个与空闲状态明显不同的信号,即VOL。数据位:起始位之后是我们要传输的数据。数据位可以是5、6、7、8、9位等组成一个字符(通常是8位)。如ASCII码(7位)、扩展BCD码(8位)。首先发送最低位,最后发送最高位。用低电平
表示“0”,高电平表示“1”,完成数据位的传输。6.2UART通信协议11图6.3波特率定义奇偶校验位:将该位添加到数据位后,“1”位的个数应为偶数(偶校验)或奇数(奇校验),以验证数据传输的正确性。校验位实际上就是调整数,串口校验分为几种方式:奇校验:如果数据位中“1”的个数为偶数,则奇偶校验位为“1”,如果“1”的个数为奇数,则奇偶校验位为“0”。偶校验:如果数据中“1”的个数为偶数,则奇偶校验位为“0”,如果数据中“1”的个数为奇数,则奇偶校验位为“1”。标记奇偶校验:校验位始终为1(不常用)。奇偶校验:奇偶校验位始终为0(不常用)。停止位:它是字符数据的结束标记。它可以是1位、1.5位或2位VOH。由于数据在传输线上是定时的,并且每个设备都有自己的时钟,所以在通信时两个设备之间很可能会出现小的不同步。因此停止位不仅表示传输的结束,而且还为计算机提供了纠正时钟的机会。停止位越多,数据传输越稳定,但数据传输速度越慢。6.3UART模块6.3.1概述6.3.2功能描述13
通用异步收发器UART是一个异步串行的通信接口,UART主要用于和外部芯片的UART进行对接,实现两芯片间的通信。芯片提供3个UART单元,支持2线模式。概述功能描述—UART具有以下功能特点支持64×8bit的发送FIFO和64×12bit的接收FIFO(FirstInFirstOut)。支持数据位和停止位的位宽可编程:
①数据位可通过编程设定为5/6/7/8bit。
②停止位可通过编程设定为1/2bit。支持奇、偶校验方式或无校验。支持传输速率可编程、支持整数小数分频。支持接收FIFO中断、发送FIFO中断、接收超时中断、错误中断。支持初始中断状态查询和屏蔽后中断状态查询。支持通过编程禁止UART模块或UART发送/接收功能以降低功耗。UART0不支持硬件流控;UART1、UART2支持硬件流控。6.3.3工作方式141.接口信号UART接口信号描述如表6.2所示信号名宽度(bit)方向功能描述RXD1I输入数据。TXD1O输出数据。CTS1I清除发送信号,用于硬件流控,低电平有效。RTS1O清求发送信号,用于硬件流控,低电平有效。表6.2UART接口信号描述6.3.3工作方式152.初始化配置
UART初始化配置流程如下:
读UART_FR[busy],等待UART状态为空闲,对UART模块进行软复位。写UART_CR[uarten]为0,禁止UART。写UART_LCR_H为0,清空UART的配置。根据波特率配置UART_IBRD和UART_FBRD,设置波特率分频值。根据需求配置UART_LCR_H,设置奇偶校验位、数据长度、FIFO使能、停止位个数。写UART_IFLS,设置发送FIFO水线、接收FIFO水线、流控水线。如果需要进行DMA搬移,写UART_DMACR[txdmae]或[rxdmae]为1,使能UART的DMA。如果需要使能UART的硬件流控功能,写UART_CR[cts_en]、[rts_en]为1,启动硬件流控功能。写UART_CR[rxe]为1,配置UART接收使能;或写UART_CR[txe]为1,配置UART。发送使能;写UART_CR[uarten]为1,配置UART使能。在初始化寄存器之后便可以开始数据的传输。6.3.4寄存器概览16UART寄存器概览如表6.3所示。(UART0基址是0x4000_8000、UART1基址是0x4000_9000、UART2基址是0x4000_A000)。
偏移地址名称描述0x000UART_DRUART数据寄存器0x004UART_RSR接收状态/错误清除寄存器0x018UART_FRUART标志寄存器0x024UART_IBRD整数波特率寄存器0x028UART_FBRD小数波特率寄存器0x02CUART_LCR_H传输模式控制寄存器0x030UART_CRUART控制寄存器0x034UART_IFLS中断FIFO阈值选择寄存器0x038UART_IMSC中断屏蔽寄存器0x03CUART_RIS原始中断状态寄存器0x040UART_MIS屏蔽后中断状态寄存器0x044UART_ICR中断清除寄存器0x048UART_DMACRDMA控制寄存器表6.3UART寄存器概览6.3.5寄存器描述171.UART_DRUART_DR为UART数据寄存器。存放接收数据和发送数据,同时可以从该寄存器中读出接收状态。偏移地址为:0x000,总复位值为0x0000。其描述如表6.4所示。BitsAccess名称描述复位[15:12]-reserved保留。0×0[1]ROoe溢出错误状态位。0:无溢出错误;1:有溢出错误(即接收FIFO满且接收了一个数据)。0×0[10]RObeBreak错误状态位。0:无Break错误;1:有Break错误。Bresk的条件:接收数据的输入保持低电平的时间比一个全字传输(包括:start、data、parity、stopbit)还要长。0×0[9]ROpe校验错误状态位。0:无校验错误;1:有校验错误。0x0[8]ROfe帧错误状态位。0:无帧错误;1:有帧错误。0x0[7:0]RWdata接收数据和发送数据。0x00表6.4UART_DR描述6.3.5寄存器描述182.UART_RSRUART_RSR为接收状态/错误清除寄存器。读时作为接收状态寄存器;写时作为错误清除寄存器。偏移地址为:0x004,总复位值为0x00。其描述如表6.5所示。表6.5UART_RSR描述BitsAccess名称描述复位[7:4]-reserved保留。0×0[3]RWoe溢出错误状态和清除位。0:无溢出错误;1:有溢出错误当FIFO满时,FIFO中的内容保持有效(因为不会有下一个数据写到FIFO中,只是移位寄存器会溢出)。CPU必须立刻读数据以腾空FIFO。0×0[2]RWbeBreak错误状态和清除位。0:无Break错误;1:有Break错误。Bresk的条件:接收数据的输入保持低电平的时间比一个全字传输(包括:start、data、parity、stopbit)还要长。0×0[1]RWpe校验错误状态和清除位。0:无校验错误;1:接收数据和校验错误。0x0[0]RWfe帧错误状态和清除位。0:无帧错误;1:接收到的数据的停止位错误(有效的停止位为高电平)。0x06.3.5寄存器描述193.UART_FRUART_FR为UART标志寄存器。偏移地址为:0x018,总复位值为0x0197。其描述如表6.6所示。表6.6UART_FR描述BitsAccess名称描述复位[15:8]-reserved保留。0×0[7]ROtxfe发送FIFO空状态位。当UART_LCR_H[fen]为0时:0:发送HoldingRegister非空;1:发送HoldingRegister空。当UART_LCR_H[fen]为1时:0:发送FIFO为非空;1:发送FIFO为空。0×0[6]ROrxff接收FIFO满状态位。当UART_LCR_H[fen]为0时:0:接收HoldingRegister非满;1:接收HoldingRegister满。当UART_LCR_H[fen]为1时:0:接收FIFO为非满;1:接收FIFO为满。0×0[5]ROtxff发送FIFO满状态位。当UART_LCR_H[fen]为0时:0:发送HoldingRegister非满;1:发送HoldingRegister满。当UART_LCR_H[fen]为1时:0:发送FIFO为非满;1:发送FIFO为满。0x0[4]ROrxfe接收FIFO空状态位。当UART_LCR_H[fen]为0时:0:接收HoldingRegister非空;1:接收HoldingRegister空。当UART_LCR_H[fen]为1时:0:接收FIFO为非空;1:接收FIFO为空。0x0[3]RObusyUART忙闲状态位。0:空闲或完成发送数据;1:正忙于发送数据。该bit一旦置位,该状态一直保持到整个字节(包括所有的停止位)完全从移位寄存器中发送出去。发送FIFO非空,该bit置1。
[2:0]-reserved保留。6.3.5寄存器描述204.UART_IBRDUART_IBRD为整数波特率寄存器。偏移地址为:0x024,总复位值为0x0000。其描述如表6.7所示。表6.7UART_IBRD描述BitsAccess名称描述复位[15:0]RWbauddivint整数波特率分频值。注意:复位时全部清零。0×00006.3.5寄存器描述215.UART_FBRDUART_FBRD为小数波特率寄存器。UART_IBRD和UART_FBRD的值必须等到当前数据发送和接收完成才更新。最小的分频值为1,最大的分频值为65535(2^16-1)。UART_IBRD=0是无效的,此时UART_FBRD将被忽略;如果UART_IBRD=65535(0xFFFF),则UART_FBRD必须为0,否则会导致发送和接收的失败。
波特率分频值计算方法:计算理论分频系数n,UART的波特率=内部总线频率/(16×分频系数);分频值的整数部分UART_IBRD的配置值为integer(n);分频值得小数部分UART_FBRD的值为integer((n-integer(n))×64+0.5),integer()为向下取整函数。其描述如表6.8所示,偏移地址为:0x028,总复位值为0x00。BitsAccess名称描述复位[7:6]-reserved保留。0x0[5:0]RWbanddivfrac小数波特率分频值。注意:复位时全部清零。0×00表6.8
UART_FBRD描述6.3.5寄存器描述226.UART_LCR_HUART_LCR_H为传输模式控制寄存器。偏移地址为:0x02C,总复位值为0x0000。其描述如表6.9所示。BitsAccess名称描述复位[15:8]-reserved保留。0×00[7]RWsps校验位设置位。0:StickParity禁止;1:当[pen]、[eps]被置1时,奇偶校验位发送和校验按0校验;当[pen]被置1且[eps]为0时,奇偶校验位发送和校验按1校验。0x0[6:5]RWwlen指示发送和接收一帧数据的数据位数。00:5bit;01:6bit;10:7bit;11:8bit。0x0[4]RWfen发送和接收
FIFO使能控制。0:禁止;1:使能。0x0[3]RWstp2发送帧尾
2bit停止位判断。0:无2bit停止位;1:有2bit停止位。注意:接收逻辑在接收时不检查
2bit的停止位。0x0[2]RWeps发送和接收过程中的奇偶校验选择。0:生成或检查奇校验;1:生成或检查偶校验。注意:当[pen]为0时,该位不起作用。0x0[1]RWpen校验选择位。0:不作校验;1:发送方向产生校验,接收方向进行校验检查。0x0[0]RWbrk发送
Break选择位。0:无效;1:在完成当前数据的发送后,UTXD连续输出低电平。注意:须正确执行
Break命令,软件将该bit置1的时间必须超过2个完整帧;在正常使用中,该bit必须清零。0x0表6.9
UART_LCR_H描述6.3.5寄存器描述237.UART_CRUART_CR为UART控制寄存器。偏移地址为:0x030,总复位值为0x0000。其描述如表6.10所示。表6.10UART_CR描述BitsAccess名称描述复位[15]RWclsenCTS硬件流控使能。0:禁止;1:使能(仅当nUARTCTS信号有效时才发送数据)。0×00[14]RWrtsenRTS硬件流控使能。0:禁止;1:使能(仅当接收FIFO有空间时才请求接收数据)。0x0[13:12]-reserved保留。0x0[11]RWrts请求发送设置位。该
bit为UARTModem状态输出信号nUARTRTS的取反。0:输出信号不变;1:输出信号为0。0x0[10]RWdtr数据发送准备设置位。该
bit为UARTModem状态输出信号nUARTDTR的取反。0:输出信号不变;1:输出信号为0。0x0[9]RWrxeUART接收使能。0:禁止;1:使能。注意:在接收的过程中如果
UART被禁止,则当前数据的接收会在正常停止之前结束。0x0[8]RWtxeUART发送使能。0:禁止;1:使能。注意:在发送的过程中如果
UART被禁止,则当前数据的发送会在正常停止之前结束。0x0[7]RWlbe环回使能。0:禁止;1:UARTTXD输出环回到UARTRXD。0x0[6:1]-reserved保留。
[0]RWuartenUART使能。0:禁止;1:使能。注意:如果在发送和接收过程中将
UART禁止,则会在正常停止之前结束当前数据的传送。6.3.5寄存器描述248.UART_IFLSUART_IFLS为中断FIFO阈值选择寄存器。用于设置FIFO的中断(UART_TXINTR或UART_RXINTR)触发线。偏移地址为:0x034,总复位值为0x0092。其描述如表6.11所示。表6.11UART_IFLS描述BitsAccess名称描述复位[15:9]-reserved保留。0×00[8:6]RWrtsflsel硬件流控
rts_n的触发条件选择(触发点如下)。000:接收FIFO≥1/8full;001:接收FIFO≥1/4full;010:接收FIFO≥1/2full;011:接收FIFO≥3/4full;100:接收FIFO≥7/8full;101~111:保留。0x2[5:3]RWrxiflsel接收中断
FIFO的阈值选择(接收中断的触发点如下)。000:接收FIFO≥1/8full;001:接收FIFO≥1/4full;010:接收FIFO≥1/2full;011:接收FIFO≥3/4full;100:接收FIFO≥7/8full;101~111:保留。0x2[2:0]RWtxiflsel发送中断
FIFO的阈值选择(发送中断的触发点如下)。000:发送FIFO≤1/8full;001:发送FIFO≤1/4full;011:发送FIFO≤3/4full;010:发送FIFO≤1/2full;100:发送FIFO≤7/8full;101~111:保留。0x26.3.5寄存器描述259.UART_IMSCUART_IMSC为中断屏蔽寄存器。偏移地址为:0x038,总复位值为0x0000。其描述如表6.12所示。表6.12UART_IFLS描述BitsAccess名称描述复位[15:11]-reserved保留。0×00[10]RWoeim溢出错误中断的屏蔽状态。0:屏蔽;1:不屏蔽。0x0[9]RWbeimBreak错误中断的屏蔽状态。0:屏蔽;1:不屏蔽。0x0[8]RWpeim校验中断的屏蔽状态。0:屏蔽;1:不屏蔽。0x0[7]RWfeim帧错误中断的屏蔽状态。0:屏蔽;1:不屏蔽。0x0[6]RWrtim接收超时中断的屏蔽状态。0:屏蔽;1:不屏蔽。0x0[5]RWtxim发送中断的屏蔽状态。0:屏蔽;1:不屏蔽。0x0[4]RWrxim接收中断的屏蔽状态。0:屏蔽;1:不屏蔽。0x0[3:0]-reserved保留。0x06.3.5寄存器描述2610.UART_RISUART_RIS为原始中断状态寄存器。偏移地址为:0x03C,总复位值为0x000F。其描述如表6.13所示。表6.13UART_RIS描述BitsAccess名称描述复位[15:11]-reserved保留。0×00[10]ROoeris原始的溢出错误中断状态。0:未产生中断;1:已产生中断。0x0[9]ROberis原始的
Break错误中断状态。0:未产生中断;1:已产生中断。0x0[8]ROperis原始的校验中断状态。0:未产生中断;1:已产生中断。0x0[7]ROferis原始的错误中断状态。0:未产生中断;1:已产生中断。0x0[6]ROrtris原始的接收超时中断状态。0:未产生中断;1:已产生中断。0x0[5]ROtxris原始的发送中断状态。0:未产生中断;1:已产生中断。0x0[4]ROrxris原始的接收中断状态。0:未产生中断;1:已产生中断。0x0[3:0]-reserved保留。0xF6.3.5寄存器描述2711.UART_MISUART_MIS为屏蔽后中断状态寄存器。偏移地址为:0x040,总复位值为0x0000。其描述如表6.14所示。表6.14UART_MIS描述BitsAccess名称描述复位[15:11]-reserved保留。0×00[10]ROoemis屏蔽后的溢出错误中断状态。0:未产生中断;1:已产生中断。0x0[9]RObemis屏蔽后的
Break错误中断状态。0:未产生中断;1:已产生中断。0x0[8]ROpemis屏蔽后的校验中断状态。0:未产生中断;1:已产生中断。0x0[7]ROfemis屏蔽后的错误中断状态。0:未产生中断;1:已产生中断。0x0[6]ROrtmis屏蔽后的接收超时中断状态。0:未产生中断;1:已产生中断。0x0[5]ROtxmis屏蔽后的发送中断状态。0:未产生中断;1:已产生中断。0x0[4]ROrxmis屏蔽后的接收中断状态。0:未产生中断;1:已产生中断。0x0[3:0]-reserved保留。0xF6.3.5寄存器描述2812.UART_ICRUART_ICR为中断清除寄存器。偏移地址为:0x044,总复位值为0x0000。其描述如表6.15所示。表6.15UART_ICR描述BitsAccess名称描述复位[15:11]-reserved保留。0×00[10]WOoeic清除溢出错误中断。0:无效;1:清除中断。0x0[9]WObeic清除
Break错误中断。0:无效;1:清除中断。0x0[8]WOpeic清除校验中断。0:无效;1:清除中断。0x0[7]WOfeic清除错误中断。0:无效;1:清除中断。0x0[6]WOrtic清除接收超时中断。0:无效;1:清除中断。0x0[5]WOtxic清除发送中断。0:无效;1:清除中断。0x0[4]WOrxic清除接收中断。0:无效;1:清除中断。0x0[3:0]-reserved保留。0x06.3.5寄存器描述2913.UART_DMACRUART_DMACR为DMA控制寄存器。用于配置发送FIFO和接收FIFO的DMA使能。偏移地址为:0x048,总复位值为0x0000。其描述如表6.16所示。表6.16UART_DMACR描述BitsAccess名称描述复位[15:3]-reserved保留。0×0000[2]RWdmaonerrUART错误中断(UARTEINTR)有效时,接收通道DMA使能控制。0:请求输出(UARTRXDMASREQ或UARRTXDMABREQ)有效;1:请求输出(UARTRXDMASREQ或UARRTXDMABREQ)无效。0x0[1]RWtxdmae发送
FIFO的DMA使能控制。0:禁止;1:使能。0x0[0]RWrxdmae接收
FIFO的DMA使能控制。0:禁止;1:使能。0x06.4UART编程与应用6.4UART编程与应用31UART串口为端口3,位于开发板右侧,如图6.4所示为UART串口位置,图6.5为UART电路原理图。图6.4UART串口位置图6.5UART电路原理图6.4UART编程与应用32在使用UART进行通信时,首先要调用UartOpen获取UART设备句柄,该函数会返回指定端口号的UART设备句柄:structDevHandle*UartOpen(uint32_tport);在通信之前,需要设置UART的波特率,设置波特率的函数如下所示:int32_tUartSetBaud(structDevHandle*handle,uint32_tbaudRate);设置UART的波特率后,可以通过获取波特率接口来查看UART当前的波特率,获取波特率的函数如下所示:int32_tUartGetBaud(structDevHandle*handle,uint32_t*baudRate);在通信之前,需要设置UART的设备属性,设置设备属性的函数如下图所示:int32_tUartSetAttribute(structDevHandle*handle,structUartAttribute*attribute);设置UART的设备属性后,可以通过获取设备属性接口来查看UART当前的设备属性,获取设备属性的函数如下图所示:int32_tUartGetAttribute(structDevHandle*handle,structUartAttribute*attribute);6.4UART编程与应用33在通信之前,需要设置UART的传输模式,设置传输模式的函数如下图所示:int32_tUartSetTransMode(structDevHandle*handle,enumUartTransModemode);向UART设备写入指定长度的数据,对应的接口函数如下所示:int32_tUartWrite(structDevHandle*handle,uint8_t*data,uint32_tsize);从UART设备中读取指定长度的数据,对应的接口函数如下所示:int32_tUartRead(structDevHandle*handle,uint8_t*data,uint32_tsize);UART通信完成之后,需要销毁UART设备句柄,函数如下所示:voidUartClose(structDevHandle*handle);该函数会释放申请的资源。如图6.6为UART使用流程图。图6.6UART使用流程图6.4UART编程与应用34如下所示为UART通信的使用示例,使用了OpenHarmony操作系统的API。#include<stdio.h>#include<unistd.h>#include<string.h>#include"iot_gpio_ex.h"#include"ohos_init.h"#include"cmsis_os2.h"#include"iot_gpio.h"#include"iot_uart.h"#include"hi_uart.h"#include"iot_watchdog.h"#include"iot_errno.h"#defineUART_BUFF_SIZE100#defineU_SLEEP_TIME1000006.4UART编程与应用35voidUart1GpioInit(void){IoTGpioInit(IOT_IO_NAME_GPIO_0);//设置GPIO0的管脚复用关系为UART1_TXSetthepinreuserelationshipofGPIO0toUART1_TXIoSetFunc(IOT_IO_NAME_GPIO_0,IOT_IO_FUNC_GPIO_0_UART1_TXD);IoTGpioInit(IOT_IO_NAME_GPIO_1);//设置GPIO1的管脚复用关系为UART1_RXSetthepinreuserelationshipofGPIO1toUART1_RXIoSetFunc(IOT_IO_NAME_GPIO_1,IOT_IO_FUNC_GPIO_1_UART1_RXD);}voidUart1Config(void){uint32_tret;/*初始化UART配置,波特率9600,数据bit为8,停止位1,奇偶校验为NONE*//*InitializeUARTconfiguration,baudrateis9600,databitis8,stopbitis1,parityisNONE*/
6.4UART编程与应用36IotUartAttributeuart_attr={.baudRate=9600,.dataBits=8,.stopBits=1,.parity=0,};ret=IoTUartInit(HI_UART_IDX_1,&uart_attr);if(ret!=IOT_SUCCESS){printf("InitUart1FaliedErrorNo:%d\n",ret);return;}}staticvoidUartTask(void){constchar*data="HelloOpenHarmony!!!\n";uint32_tcount=0;uint32_tlen=0;unsignedcharuartReadBuff[UART_BUFF_SIZE]={0};
6.4UART编程与应用37//对UART1的一些初始化SomeinitializationofUART1Uart1GpioInit();//对UART1参数的一些配置SomeconfigurationsofUART1parametersUart1Config();while(1){//通过UART1发送数据SenddatathroughUART1IoTUartWrite(HI_UART_IDX_1,(unsignedchar*)data,strlen(data));//通过UART1接收数据ReceivedatathroughUART1len=IoTUartRead(HI_UART_IDX_1,uartReadBuff,UART_BUFF_SIZE);if(len>0){//把接收到的数据打印出来Printthereceiveddataprintf("UartReadDatais:[%d]%s\r\n",count,uartReadBuff);}usleep(U_SLEEP_TIME);count++;}}6.4UART编程与应用38voidUartExampleEntry(void){osThreadAttr_tattr;IoTWatchDogDisable();="UartTask";attr.attr_bits=0U;attr.cb_mem=NULL;attr.cb_size=0U;attr.stack_mem=NULL;attr.stack_size=5*1024;//任务栈大小*1024stacksize5*1024attr.priority=osPriorityNormal;if(osThreadNew((osThreadFunc_t)UartTask,NULL,&attr)==NULL){printf("[UartTask]FailedtocreateUartTask!\n");}}APP_FEATURE_INIT(UartExampleEntry);6.4UART编程与应用39下面是代码的主要功能和一些关键点的解释:头文件包含:代码首先包含了一些必要的头文件,包括标准输入输出库stdio.h,用于进程间通信的unistd.h,以及OpenHarmony操作系统的GPIO、UART、看门狗等硬件接口和系统初始化的头文件。宏定义:定义了两个宏UART_BUFF_SIZE和U_SLEEP_TIME,分别用于设置UART接收缓冲区的大小和线程休眠时间。GPIO初始化函数:Uart1GpioInit函数初始化了用于UART1通信的GPIO管脚,并设置了它们的复用功能。UART配置函数:Uart1Config函数配置了UART1的参数,包括波特率、数据位、停止位和奇偶校验位。UART任务函数:UartTask是一个无限循环的任务,它通过UART1发送和接收数据。发送的数据是字符串"HelloOpenHarmony!!!\n",接收到的数据会被打印出来。线程创建:UartExampleEntry函数用于创建一个线程来运行UartTask函数。线程的属性被设置,包括名称、栈大小和优先级。应用程序特性初始化:使用APP_FEATURE_INIT宏来初始化应用程序的特性。代码中使用了IoTUartWrite和IotUartRead函数来发送和接收数据,这两个函数是OpenHarmony操作系统提供的标准API。此外,usleep函数用来使线程休眠,以避免CPU过度占用。6.4UART编程与应用40#include<stdio.h>包含标准输入输出库的头文件,它提供了输入输出函数,如printf。#include<unistd.h>包含Unix标准函数库的头文件,提供了一些基本的系统调用,如usleep。#include<string.h>包含字符串操作函数的头文件,如strlen。#include"iot_gpio_ex.h";包含GPIO扩展功能的头文件,用于操作通用输入输出(GPIO)。#include"ohos_init.h"包含OpenHarmony操作系统初始化功能的头文件。#include"cmsis_os2.h"包含CMSIS-RTOSAPI的头文件,用于操作系统服务。6.4UART编程与应用41包含GPIO功能的头文件。#include"iot_uart.h"包含UART(通用异步接收/发送器)功能的头文件。#include"hi_uart.h"包含特定于HiSilicon平台的UART功能的头文件。#include"iot_watchdog.h"包含看门狗定时器功能的头文件。#include"iot_errno.h"包含错误号定义的头文件。#defineUART_BUFF_SIZE100定义一个宏UART_BUFF_SIZE,设置UART接收缓冲区的大小为100字节。#include"iot_gpio.h"6.4UART编程与应用42包含GPIO功能的头文件。#include"iot_uart.h"包含UART(通用异步接收/发送器)功能的头文件。#include"hi_uart.h"包含特定于HiSilicon平台的UART功能的头文件。#include"iot_watchdog.h"包含看门狗定时器功能的头文件。#include"iot_errno.h"包含错误号定义的头文件。#defineUART_BUFF_SIZE100定义一个宏UART_BUFF_SIZE,设置UART接收缓冲区的大小为100字节。#include"iot_gpio.h"6.4UART编程与应用43定义一个宏U_SLEEP_TIME,设置线程休眠时间为100000微秒(即100毫秒)。voidUart1GpioInit(void)定义一个函数Uart1GpioInit,用于初始化UART1的GPIO管脚。IoTGpioInit(IOT_IO_NAME_GPIO_0);初始化GPIO0管脚。。IoSetFunc(IOT_IO_NAME_GPIO_0,IOT_IO_FUNC_GPIO_0_UART1_TXD);设置GPIO0管脚的功能为UART1的发送(TX)。IoTGpioInit(IOT_IO_NAME_GPIO_1);初始化GPIO1管脚。IoSetFunc(IOT_IO_NAME_GPIO_1,IOT_IO_FUNC_GPIO_1_UART1_RXD);设置GPIO1管脚的功能为UART1的接收(RX)。#defineU_SLEEP_TIME1000006.4UART编程与应用44定义一个函数Uart1Config,用于配置UART1的参数。IotUartAttributeuart_attr={...};定义一个IotUartAttribute结构体,用于存储UART的配置属性。IoTUartInit(HI_UART_IDX_1,&uart_attr);使用IoTUartInit函数初始化UART1,传入UART索引和配置属性。staticvoidUartTask(void)定义一个静态函数UartTask,这是一个线程函数,用于处理UART通信。constchar*data="HelloOpenHarmony!!!\n";定义一个字符串data,用于通过UART发送。uint32_tcount=0;定义一个计数器count,用于记录发送数据的次数。voidUart1Config(void)6.4UART编程与应用45定义一个缓冲区uartReadBuff,用于存储从UART接收的数据。IoTUartWrite(HI_UART_IDX_1,(unsignedchar*)data,strlen(data));通过UART1发送数据。IoTUartRead(HI_UART_IDX_1,uartReadBuff,UART_BUFF_SIZE);从UART1接收数据。printf("UartReadDatais:[%d]%s\r\n",count,uartReadBuff);打印接收到的数据。usleep(U_SLEEP_TIME);使线程休眠一段时间。voidUartExampleEntry(void)定义一个函数UartExampleEntry,用于初始化和启动UART通信任务。unsignedcharuartReadBuff[UART_BUFF_SIZE]={0};6.4UART编程与应用46定义一个线程属性结构体attr。IoTWatchDogDisable();禁用看门狗定时器。if(osThreadNew((osThreadFunc_t)UartTask,NULL,&attr)==NULL){...}创建并启动一个新线程,运行UartTask函数。PP_FEATURE_INIT(UartExampleEntry);使用宏APP_FEATURE_INIT来初始化应用程序的特性,调用UartExampleEntry函数。#include"iot_errno.h"#include"iot_gpio_ex.h"#include"hi_gpio.h"#include"hi_io.h"#include"hi_task.h"#include"hi_types_base.h"osThreadAttr_tattr;6.4UART编程与应用47unsignedintIoSetPull(unsignedintid,IotIoPullval){if(id>=HI_GPIO_IDX_MAX){returnIOT_FAILURE;}returnhi_io_set_pull((hi_io_name)id,(hi_io_pull)val);}unsignedintIoSetFunc(unsignedintid,unsignedcharval){if(id>=HI_GPIO_IDX_MAX){returnIOT_FAILURE;}returnhi_io_set_func((hi_io_name)id,val);}6.4UART编程与应用48unsignedintTaskMsleep(unsignedintms){if(ms<=0){returnIOT_FAILURE;}returnhi_sleep((hi_u32)ms);}这段代码定义了三个
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 飞机操纵系统安装调试工岗前岗位知识考核试卷含答案
- 服务机器人应用技术员风险评估强化考核试卷含答案
- 2026年其他卫星传输服务行业供需格局研究报告及未来五至十年自主创新与安全可控
- 2026年民爆行业洞察报告及未来五至十年发展趋势报告
- 2025-2026山东初中七年级地理下学期测试卷
- 2026年国企应聘考试题目及答案
- 华东师大版初中七年级语文下学期期末测试卷2025-2026年
- 2026年七年级上册第6章 平面图形的初步认识 第10套 拓展拔高
- 2026年项目规划试题及答案
- 2026年土木工程水利工程水利工程管理试题及答案
- 2026年食品安全管理员考试题库含标准答案
- 2026年校招:广西北部湾国际港务集团试题及答案
- 中国2型糖尿病防治指南(2025版)
- 第五单元 专题学习活动 我们的数字时代2026-2027学年统编版九年级语文上册
- 医院病房陪护人员管理手册
- 2026年甘肃省兰州新区商贸物流投资集团数投公司大数据专业技术人员招聘10人笔试参考题库及答案详解
- 2026年矿产资源行政管理岗事业单位招聘考试笔试试题(含答案)
- GB/T 3512-2026硫化橡胶或热塑性橡胶热空气加速老化和耐热试验
- 2026年新版《医疗器械经营质量管理规范》培训考核试题(附答案)
- 2026年许昌职业技术学院单招职业适应性测试题库带答案详解
- 2026年建筑施工企业机械类专职安全生产管理人员C1证考试题库
评论
0/150
提交评论