uart 代表通用异步接收器/发送器,它是任何微控制器单元中有用的硬件功能。微控制器需要接收数据、处理数据并将其发送到其他设备。微控制器中有不同类型的通信协议可用,但是,uart 是 spi 和 i2c 等其他通信协议中最常用的一种。如果有人需要串行接收或发送数据,uart 始终是最简单和常见的选择。uart的优点是它只需要两条线在设备之间传输数据。继续我们的nuvoton 微控制器教程,在本文中,我们将学习如何使用 n76e003 微控制器执行串行通信。
uart通信基础
现在,既然我们知道了什么是 uart,那么了解 uart 的相关参数很重要。
两个 uart 设备以相同的频率接收和发送数据。当接收 uart 设备检测到一个起始位时,它开始以称为波特率的特定频率读取传入的位。波特率对于 uart 通信很重要,它用于测量数据传输的速度,以每秒位数 (bps) 为单位。这个波特率速度,对于发送和接收来说,必须是相同的波特率。在位时序偏离太远之前,发送和接收 uart 之间的波特率速度差异只能约为 10%。最流行的波特率速度是 4800、9600、115200 bps 等。
n76e003 有两个 uart—— uart0 和 uart1。在本教程中,我们将使用n76e003 微控制器单元上的 uart 外设。在不浪费太多时间的情况下,让我们评估一下这个应用程序需要什么样的硬件设置。
硬件要求和设置
该项目所需的主要组件是usb 到 uart 或 ttl 转换器模块,它将在 pc 或笔记本电脑与微控制器模块之间建立所需的接口。对于这个项目,我们将使用基于cp2102的 usb 转 uart 模块,如下所示。
更不用说,除了上述组件,我们还需要基于n76e003 微控制器的开发板以及nu-link 编程器。如果编程器不用作电源,则可能需要额外的 5v 电源单元。
nuvoton n76e003 uart通信电路图
正如我们在下面的开发板示意图中看到的,微控制器单元的第 2 和第 3 引脚分别用作 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,即端口 0.7。由于这是一个串口接收引脚,需要将端口 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 也是如此。本教程使用 10 位运算,定时器 3 溢出率除以 32 或 16。
现在,是时候获取信息并为 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 以确认数据传输成功。
为 uart 通信编程 nuvoton n76e003
编码部分很简单,本教程中使用的完整代码可以在本页底部找到。代码解释如下,使用主函数中的语句将uart0初始化为9600波特率-
初始uart0_timer3(9600);
上述函数在common.c文件中定义,它配置uart0,定时器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 兆赫*/ rl3 = lobyte(65536 - (1037500/u32baudrate)); /*16.6 mhz */ #endif set_tr3; //触发timer3 set_ti; //对于 printf 函数必须设置 ti = 1 }
如前所述,声明是一步一步完成的,寄存器也相应地配置。但是,在n76e003的bsp库中,有一个bug,就是代替p07_input_mode;有p07_quasi_mode。因此,uart 接收功能将不起作用。
波特率也根据波特率输入并使用数据表中给出的公式进行配置。现在,在 main 函数或while 循环中,使用了 printf 函数。要使用printf函数,ti 需要设置为 1。除此之外,在while 循环中,使用 switch case 并根据接收到的 uart 数据打印该值。
while(1) { printf(\r\n按 1 或按 2 或按 3 或按 4); 操作 = receive_data_from_uart0(); switch (oper) { case '1': printf(\r\n1 被按下); 休息; case '2': printf(\r\n2 被按下); 休息; case '3': printf(\r\n3 被按下); 休息; case '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...正在链接...程序大小:数据=54.2 xdata=0 代码=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 写入完成:已编程 2341 字节。flash 验证完成:已验证 2341 字节。闪存加载于 15:48:08 完成
开发板通过编程器和笔记本电脑使用 usb 转 uart 模块连接到电源。要显示或发送 uart 数据,需要串行监控软件。我在这个过程中使用了tera 术语。
如下图所示,我能够显示从我们的 nuvoton 控制器发送的字符串,并将其显示在串行监视器软件上。还能够从串行监视器读取值。
#include n76e003.h
#include sfr_macro.h
#include 函数定义.h
#include common.h
#include 延迟.h
/*================================================= ============================*/
无效主要(无效)
{
字符操作;
初始uart0_timer3(9600);
ti = 1; // 使用了 printft 函数。
printf(hello circuitdigest\r\n);
而(1)
{
printf(\r\n按 1 或按 2 或按 3 或按 4);
操作 = 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);
}
}
TE Connectivity推出第二代PARALIGHT QSFP+有源光缆组件
VFineMusic加入华为HMS出海生态联盟
共享充电宝涨价已成常态 靠涨租来盈利不靠谱
比特币价格大起大落,高杠杆投资风险再起
富士康郑州工厂或为iPhone 8供应屏幕面板
如何使用N76E003微控制器执行串行通信
SF16A18国产路由器芯片打破了国外无线路由芯片垄断局面
如何才能判断三极管的管型及管脚口诀详细分析
用于联网汽车的氢燃料电池与电池
揭秘长安马自达南京工厂
软通动力携子公司鸿湖万联圆满承办首届开放原子开发者大会OpenHarmony分论坛
智能云科iSESOL工业互联网平台为何选择落户江门?
科学家研究出一种可追踪锂电池微观工作过程的方法
轧机牌坊配合面腐蚀的修复方案
华为EMUI10.0将于8月9日发布
低压灯带线性恒流驱动芯片方案产品SM4A00成熟方案运用分析
小度驭龙 逐鹿AI铁王座
千款VR游戏大作随心畅享 HUAWEI VR Glass专属配件正式开售
2018年电线电缆行业市场概况与发展前景分析 全球平稳发展、中国潜力较大
一文知道Xilinx Serdes时钟纠正clock correction的步骤