- UART通信基础
- 硬件要求和设置
- Nuvoton N76E003 UART通信的电路图
- Nuvoton N76E003微控制器上的UART引脚
- Nuvoton N76E003微控制器中的UART寄存器
- N76E003中的UART操作模式
- 编程Nuvoton N76E003进行UART通信
UART代表通用异步接收器/发送器,它是任何微控制器单元中有用的硬件功能。微控制器需要接收数据,处理数据并将其发送到其他设备。微控制器中提供了不同类型的通信协议,但是UART是其他通信协议(如SPI和I2C)中使用最多的一种。如果有人需要串行接收或发送数据,则UART始终是最简单和通用的选择。UART的优势在于它仅需要两条线就可以在设备之间传输数据。继续本文的Nuvoton微控制器教程,我们将学习如何使用N76E003微控制器执行串行通信。
UART通信基础
现在,我们知道什么是UART,了解UART的相关参数很重要。
两个UART器件以相同的频率接收和发送数据。当接收UART设备检测到起始位时,它将开始以称为波特率的特定频率读取输入位。波特率对于UART通信很重要,它用于测量数据传输速度,以每秒比特数(bps)为单位。对于发送和接收,此波特率速度必须处于相同的波特率。在位的时序变得太远之前,发送和接收UART之间的波特率速度差只能达到10%左右。最受欢迎的波特率速度是4800、9600、115200 bps等。以前,我们还在以下列出的许多其他微控制器中使用了UART通信。
- ATmega8和Arduino Uno之间的UART通信
- 两个ATmega8微控制器之间的UART通信
- 使用PIC单片机进行UART通信
- STM8S微控制器上的UART通信
N76E003具有两个UART- UART0和UART1。在本教程中,我们将在N76E003微控制器单元上使用UART外设。在不浪费时间的情况下,让我们评估一下此应用程序需要哪种硬件设置。
硬件要求和设置
该项目所需的主要组件是USB转UART或TTL转换器模块,它将成为PC或笔记本电脑与微控制器模块之间所需的接口。对于本项目,我们将使用基于CP2102的USB转UART模块,如下所示。
更不用说,除了上述组件之外,我们还需要基于N76E003微控制器的开发板以及Nu-Link编程器。如果不将编程器用作电源,则可能需要一个额外的5V电源单元。
Nuvoton N76E003 UART通信的电路图
正如我们在下面的开发板原理图中所看到的,微控制器单元的第二和第三引脚分别用作UART0 Tx和Rx。最左侧显示了编程接口连接。
Nuvoton N76E003微控制器上的UART引脚
N76E003具有20个引脚,其中4个引脚可用于UART通信。下图显示了在红色方框(Rx)和蓝色方框(Tx)中突出显示的UART引脚。
对于UART0,引脚2和3用于UART通信,对于UART1,引脚8和18用于通信。
Nuvoton N76E003微控制器中的UART寄存器
N76E003具有两个具有自动地址识别和成帧错误检测功能的增强型全双工UART -UART0和UART1。这两个UART使用归类为两个不同UART的寄存器控制。N76E003中有两对RX和TX引脚可用于UART操作。因此,第一步是选择所需的UART端口进行操作。
在本教程中,我们将使用UART0,因此仅显示UART0的配置。UART1将具有相同的配置,但寄存器将不同。
选择一个UART(在这种情况下为UART0)后,需要将用于RX和TX通信的I / O引脚配置为输入和输出。UART0的RX引脚是微控制器的端口3的引脚3。由于这是一个串行端口接收引脚,因此需要将端口0.7设置为输入。另一方面,作为微控制器第二引脚的端口0.6是发送引脚或输出引脚。需要将其设置为准双向模式。可以使用PxM1和PxM2寄存器进行选择。这两个寄存器用于设置I / O模式,其中x代表端口号(例如,端口P1.0的寄存器将为P1M1和P1M2,对于P3.0的端口将为P3M1和P3M2,依此类推。)在下图中可以看到-
N76E003中的UART操作模式
然后,下一步是确定UART操作的模式。两个UART可以在4种模式下运行。这些模式是-
如我们所见,SM0和SM1(SCON寄存器的第7位和第6位)选择UART操作模式。模式0是同步操作,其他三种模式是异步操作。但是,每种串行端口模式的波特率发生器和帧位都不同。可以根据应用要求选择任何一种模式,UART1也是如此。在本教程中,将使用定时器3溢出率除以32或16的10位操作。
现在,该获取信息并为UART0配置SCON寄存器(对于UART1为SCON_1)了。
第6位和第7位将设置UART模式,如前所述。位5用于设置多处理器通信模式以启用选项。但是,该过程取决于选择哪种UART模式。除此之外,REN位将被设置为1以使能接收,而TI标志将被设置为1以使用 printf 功能代替自定义UART0发送功能。
下一个重要的寄存器是电源控制寄存器(PCON)(UART1的定时器3位7和6)。如果您不熟悉计时器,请查看Nuvoton N76E003计时器教程,以了解如何在N76E003微控制器上使用计时器。
SMOD位对于在UART0模式1中选择双倍波特率很重要。现在,由于我们使用的是定时器3,因此需要配置定时器3控制寄存器T3CON。但是,第7位和第6位保留用于UART1的双倍数据速率设置。
定时器3的预分频值-
第5位BRCK将把定时器3设置为UART1的波特率时钟源。现在,N76E003的数据表已给出公式,用于计算所需的波特率以及定时器3(16位)高和低寄存器的采样设置值。
16 Mhz时钟源的采样值-
因此,需要使用上述公式在定时器3寄存器中配置波特率。对于我们的情况,它将是公式4。之后,通过将TR3寄存器设置为1来启动计时器3,将完成UART0初始化计时器3。要接收和发送UART0数据以使用以下寄存器,
所述SBUF寄存器自动被配置用于接收和发送。要从UART接收数据,请等待RI标志置1并读取SBUF寄存器,然后将数据发送至UART0,再将数据发送至SBUF并等待TI标志获得1以确认数据成功传输。
编程Nuvoton N76E003进行UART通信
编码部分很简单,可以在本页底部找到本教程中使用的完整代码。代码说明如下,使用主函数中的语句以9600波特率初始化UART0-
InitialUART0_Timer3(9600);
上面的函数在 common.c 文件中定义,并且正在将UART3配置为以定时器3作为波特率源,在模式1下,波特率为9600。函数定义如下:
void InitialUART0_Timer3(UINT32 u32Baudrate)//将timer3用作波特率发生器 { P06_Quasi_Mode; //将UART引脚设置 为准 模式以发送 P07_Input_Mode; //将UART引脚设置为接收 SCON = 0x50的 输入模式 ; // UART0 Mode1,REN = 1,TI = 1 set_SMOD; // UART0双倍速率使能 T3CON&= 0xF8; // T3PS2 = 0,T3PS1 = 0,T3PS0 = 0(Prescale = 1) set_BRCK; // UART0波特率时钟源= Timer3 #ifdef FOSC_160000 RH3 = HIBYTE(65536-(1000000 / u32Baudrate)-1); / * 16 MHz * / RL3 = LOBYTE(65536-(1000000 / u32Baudrate)-1); / * 16 MHz * / #endif #ifdef FOSC_166000 RH3 = HIBYTE(65536-(1037500 / u32Baudrate)); /*16.6 MHz * / RL3 = LOBYTE(65536-(1037500 / u32Baudrate)); /*16.6 MHz * / #endif set_TR3; //触发Timer3 set_TI; //对于printf函数,必须设置TI = 1 }
如前所述一步一步地完成声明,并相应地配置寄存器。但是,在N76E003的BSP库中,存在一个错误,而不是 P07_Input_Mode。 有 P07_Quasi_Mode 。因此,UART接收功能将不起作用。
波特率还根据输入的波特率并使用数据表中给出的公式进行配置。现在,在main函数或 while循环中 ,使用printf函数。要使用 printf 功能,需要将TI设置为1。除此之外,在 while循环中 ,使用开关盒,并根据接收到的UART数据打印该值。
while(1) { printf(“ \ r \ n按1或按2或按3或按4”); oper = Receive_Data_From_UART0(); 开关(操作器){ 情况'1': printf(“ \ r \ n1被按下”); 打破; 情况'2': printf(“ \ r \ n2被按下”); 打破; 情况'3': printf(“ \ r \ n3被按下”); 打破; 情况'4': printf(“ \ r \ n4被按下”); 打破; 默认值: printf(“ \ r \ n按下错误的键”); } Timer0_Delay1ms(300); } }
好吧,对于UART0,接收 Receive_Data_From_UART0(); 使用功能。它也在 common.c 库中定义。
UINT8 Receive_Data_From_UART0(void) { UINT8 c; 而(!RI); c = SBUF; RI = 0; 返回(c); }
它将等待RI标志获得1,并使用变量c返回接收数据。
闪烁代码和输出
代码返回0警告和0错误,并使用Keil的默认闪烁方法闪烁。如果不确定如何编译和上传代码,请查看nuvoton入门文章。以下几行确认我们的代码已成功上传。
重建开始:项目:printf_UART0 重建目标'GPIO' 编译PUTCHAR.C… 编译Print_UART0.C… 编译Delay.c… 编译Common.c… 组装STARTUP.A51… 链接… 程序大小:data = 54.2 xdata = 0 code = 2341 从“。\ Output \ Printf_UART1”… “。\ Output \ Printf_UART1” 创建十六进制文件 -0错误,0警告。 构建时间已过:00:00:02 加载“ G:\\ n76E003 \\ software \\ N76E003_BSP_Keil_C51_V1.0.6 \\ Sample_Code \\ UART0_Printf \\ Output \\ Printf_UART1” Flash Erase Done。 闪存写完成:已编程2341字节。 已完成Flash验证:已验证2341个字节。 Flash加载在15:48:08完成
开发板通过编程器和笔记本电脑使用USB至UART模块连接到电源中。要显示或发送UART数据,需要使用串行监控器软件。我在这个过程中使用了Tera术语。
如您在下图中所看到的,我能够显示从nuvoton控制器发送的字符串并将其显示在串行监视器软件上。还能够从串行监视器读取值。
您可以查看下面链接的视频,以获取本教程的完整演示。希望您喜欢这篇文章并学到一些有用的东西。如果您有任何疑问,可以将其留在下面的评论部分,或使用我们的论坛来发布其他技术问题。