NXP JN5169 UART 波特率设置

  • 一、系统时钟介绍
  • 1、高速(32MHz)系统时钟
  • 1、32MHz 晶体振荡器
  • 2、高速RC振荡器
  • 2、低速(32kHz)系统时钟
  • 1、32 kHz RC 振荡器
  • 2、32 kHz 晶体振荡器
  • 3、32 kHz 外部时钟
  • 二、UART 时钟
  • 三、串口波特率设置
  • 1、使用 vAHI_UartSetBaudRate() 接口设置波特率
  • 2、使用 Divisor 和 ClocksPerBit 设置波特率

一、系统时钟介绍

两个系统时钟用于驱动 JN5169 的片上子系统。 唤醒定时器由低频时钟(通常为 32kHz )驱动。 所有其他子系统(收发器,处理器,存储器以及数字和模拟外围设备)均由高速时钟(名义上为 32MHz )或其分频出来的时钟驱动。
        高速时钟要么由精确的晶体控制振荡器(32 MHz)产生,要么由精度较差的高速RC振荡器(已校准27 MHz至32 MHz)产生。 低速时钟要么由精确的晶体控制振荡器(32 kHz至768 kHz)产生,要么由精度较低的RC振荡器(以32 kHz为中心)产生,或者可以从外部提供。

1、高速(32MHz)系统时钟

JN5169 外接 32MHz 晶振,经过时钟源选择,32MHz 二分频输出 16MHz 到外设,外设使用 16MHz 的时钟。

晶体振荡器通常启动缓慢。因此,为了在休眠周期或复位后提供快速启动,快速 RC 振荡器始终被用作高速系统时钟的初始源。振荡器启动非常快,将在 25MHz 至 32MHz(未校准)或 32MHz ± 5%(已校准)下运行。
        这意味着系统时钟将以不确定的频率运行(比正常频率稍慢或更快),但这并不妨碍 CPU 和内存子系统正常运行,因此可以执行程序代码。但是,无法使用无线电或 UART,因为即使在校准之后(由调用API函数的用户软件启动),在电压和温度范围内,时钟速率仍具有±5%的容差。
        可以使用其他数字外围设备(例如 SPI 总线主/从设备),但由于时钟频率不准确,如果使用定时器,则必须小心,因为不能确定系统时钟的频率。
        唤醒时使用快速 RC 振荡器意味着无需等待 32MHz 晶体振荡器稳定下来。 因此,应用代码将使用高速 RC 振荡器的时钟开始快速执行。

1、32MHz 晶体振荡器

JN5169 外部晶振电路如下图所示。 两个电容器C1和C2通常应为12 pF,并使用C0G电介质。 由于这些电容器的尺寸很小,因此必须使到外部组件的走线尽可能短。 片内跨导放大器可补偿温度变化,并通过内部电阻器 R1 自偏置。
        该振荡器具有一个功能,当振荡的振幅达到令人满意的水平以进行完全操作时,该功能会进行标记,并在将高速系统时钟的源更改为 32MHz 晶体振荡器之前进行检查。

2、高速RC振荡器

JN5169 除了 32MHz 晶体振荡器以外,还提供了一个片上高速 RC 振荡器,用于两个目的:

默认情况下,振荡器将以 27MHz 的频率运行,通常具有宽容差。 可以使用软件 API 函数进行校准,这将导致 32MHz 的标称频率在 3V 和 25℃ 时具有 ±1.6% 的容差。 但是,应注意,在电压和温度的整个工作范围内,这将增加至 5%。 在整个速度周期中以及在禁用振荡器时都会保留校准信息,因此通常只需调用一次校准功能。 该振荡器不需要任何外部组件。

2、低速(32kHz)系统时钟

32 kHz 系统时钟用于计时睡眠时间。 可以通过应用软件从以下三种来源之一选择时钟:

芯片复位或上电时,JN5169 默认使用内部 32 kHz RC 振荡器。 如果选择了另一个时钟源,则它将在所有 32 kHz 时序中保持使用状态,直到执行芯片复位为止。

1、32 kHz RC 振荡器

内部 32kHz RC 振荡器不需要任何外部组件。 由于制造工艺的变化,振荡器的内部定时组件具有宽容差,因此振荡器的标称工作频率为 32 kHz -10% + 40%。
        为了使它可用作从睡眠中准确唤醒的定时源,可以应用从更准确的 16 MHz 时钟中导出的频率校准因子。 校准系数是通过软件得出的。
        在使用之前,软件必须检查 32kHz RC振荡器是否正在运行。 振荡器的默认电流消耗约为0.5μA。 可选地,可以将其减小至0.375μA。 但是,校准的精度和温度系数将因此变差。

2、32 kHz 晶体振荡器

为了获得更准确的睡眠时间,JN5169 可以外接 32.768 kHz 晶振。 晶振应连接在 32KXTALIN 和 32KXTALOUT(DIO9和DIO10)之间,并且两个相等的电容器接地,每个引脚一个。 由于电容器的尺寸小,重要的是要使到外部组件的走线尽可能短。振荡器单元非常灵活,可以与一系列常见的 32.768 kHz 晶体一起工作,负载电容为 6 pF 至 12.5 pF。

3、32 kHz 外部时钟

可以将 32KIN 输入(DIO9)上的外部提供的 32 kHz 参考时钟提供给 JN5169。 这样就可以从非常稳定的外部振荡器模块获得 32 kHz 系统时钟,与内部RC振荡器相比,可以提供更准确的睡眠周期时序。

二、UART 时钟

UART 时钟来源框图:

如上图,复位后,JN516x 器件从内部高速 RC 振荡器获取系统时钟。默认情况下,一旦晶体振荡器稳定下来(大概需要 1ms 的时间),就会自动切换到外部 32MHz 晶体振荡器。 复位后立即执行应用代码。一旦设备和系统时钟完全启动并运行,即可使用函数 vAHI_SelectClockSource() 更改系统时钟源。 当前源时钟的标识可以通过调用函数bAHI_GetClkSource() 获得。

如果要将外部晶体振荡器用作系统时钟的源,则一旦自动切换到晶体振荡器(bAHI_GetClkSource() == FALSE),就应调用函数 vAHI_OptimiseWaitStates()。 此功能根据系统时钟频率优化 JN516x 内部闪存和 EEPROM 的等待状态,以最大程度地缩短访问时间。

bool_t bAHI_GetClkSource(void)
功能:此功能获取JN516x器件上系统时钟的时钟源标识。如果高速RC振荡器是系统时钟源,则 bAHI_GetClkSource() 不表示振荡器的工作频率。
返回值:时钟源。TRUE - RC振荡器,FALSE - 晶体振荡器。

void vAHI_OptimiseWaitStates(void)
更改系统时钟源或 CPU 时钟频率以最大程度地缩短闪存访问时间后,此功能将重新计算内部闪存和 EEPROM 设备的等待状态设置。 在调用vAHI_SelectClockSource() 或bAHI_SetClockRate() 之后会自动调用该函数,但最好在以下两种情况下由应用程序调用:
1、在应用程序启动(冷启动或热重启)时,系统时钟由内部高速RC振荡器运行
2、从内部高速RC振荡器切换到外部32MHz晶振后

因此,系统时钟初始化函数如下:

/*等待系统时钟切换为外部32MHz晶振*/
while (bAHI_GetClkSource() == TRUE);
/*优化闪存等待状态*/
vAHI_OptimiseWaitStates();

三、串口波特率设置

UART 收发功能实现: NXP JN5169使用UART发送数据

UART 外设API函数:NXP JN5169 UART集成外设API函数

JN-UG-3087 JN516x Integrated Peripherals API User Guide 提供了两种方法设置波特率:

JN516x UART 可设置的波特率最高为 4 Mbits/s。

1、使用 vAHI_UartSetBaudRate() 接口设置波特率

vAHI_UartSetBaudRate() 接口提供了 6 个常用波特率的宏定义,需要哪个波特率直接传入相应的宏定义即可

vAHI_UartSetBaudRate(E_AHI_UART_1, E_AHI_UART_RATE_115200); //波特率 115200

2、使用 Divisor 和 ClocksPerBit 设置波特率

JN-UG-3087 JN516x Integrated Peripherals API User Guide 提供了两个 API 设置波特率。

vAHI_UartSetBaudDivisor(),该函数设置一个整数除数,以从指定 UART 的 1MHz 频率得出波特率。 该功能允许设置通过函数 vAHI_UartSetBaudRate() 无法获得的波特率。

vAHI_UartSetClocksPerBit(),该功能将指定 UART 使用的波特率设置为从16MHz外设时钟得出的值。 其中在此函数中设置了 Cpb,在 vAHI_UartSetBaudDivisor() 中设置了 Divisor。 因此,在调用 vAHI_UartSetClocksPerBit() 之前,必须先调用函数 vAHI_UartSetBaudDivisor() 来设置 Divisor。

波特率计算公式(单位 Mbits/s):

这里提供一个计算 Divisor 和 Cpb 参数的 C 语言代码,还可以计算出当前参数设置的波特率的误差。

#include <stdio.h>
#include <math.h>#define ERROR            0.007   //宏定义波特率最大误差
#define DIVISOR_SIZE    1000    //宏定义除数范围 1 - 1000
#define CPB_SIZE        15      //时钟位范围0 - 15,不可更改,不推荐值0-2 int main(void) {unsigned short len, Divisor;   //除数unsigned char  i, Cpb;      //ClocksPerBit,时钟位double baud_rate;      //波特率//常用波特率unsigned long normal_rate[16] = {1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 56000,57600, 76800, 115200, 128000, 500000, 1000000, 4000000};double deviation;       //波特率误差len = 0;                                                                //有效的波特率设置个数 for(i = 0; i < 16; i++) {                                                //16个常用波特率 for(Divisor = 1; Divisor <= DIVISOR_SIZE; Divisor++) {                //除数取值范围 for(Cpb = 3; Cpb <= CPB_SIZE; Cpb++) {                          //时钟位取值范围,不推荐值0-2 baud_rate = (16.0 / (Divisor * (Cpb + 1.0))) * 1000000.0;    //当前除数和时钟位算出来的波特率 deviation = abs(baud_rate - normal_rate[i]) / baud_rate; //与目标波特率的误差 if(deviation <= ERROR) {                                    //误差小于最大误差len++;printf("Divisor = %4d\tCpb = %2d\tbaud_rate = %7.4f bits/s\ttarget baud_rate = %7d\tdeviation = %1.5f\n", Divisor, Cpb, baud_rate, normal_rate[i], deviation);}}}}printf("\nlen = %5d\n", len);return 0;
}

当最大误差为 0.007,Divisor 范围为 1-1000 时,控制台输出:

设置 115200 波特率,当 Divisor = 23,Cpb = 5 时,波特率为 115942.0290,与目标波特率 115200 误差为 0.0064

vAHI_UartSetBaudDivisor(E_AHI_UART_1, 23);//波特率 115200,误差0.0064
vAHI_UartSetClocksPerBit(E_AHI_UART_1, 5);

当最大误差为 0.01,Divisor 范围为 1-10000 时,控制台输出如下图,从这里可以知道,当 Divisor = 23,Cpb = 5 时设置 115200 波特率,最少误差为 0.0064

当最大误差为 0.001,Divisor 范围为 1-10000 时,控制台输出如下图,从这里可以知道,当 Divisor = 119,Cpb = 13 或者当 Divisor = 238,Cpb = 6 时设置 9600 波特率,最少误差为 0.00031

NXP JN5169 波特率配置方案相关推荐

  1. NXP JN5169 UART 波特率设置

    NXP JN5169 UART 波特率设置 一.系统时钟介绍 1.高速(32MHz)系统时钟 1.32MHz 晶体振荡器 2.高速RC振荡器 2.低速(32kHz)系统时钟 1.32 kHz RC 振 ...

  2. NXP JN5169 UART波特率问题

    被NXP JN5169的UART收数据大批量错误坑了一把,最后发现是NXP的速率计算因子误差太大导致. 写了个程序,把所有常见的波特率匹配了一把,匹配的结果(相对误差在千分之七以下)即波特率的计算因子 ...

  3. NXP JN5169使用定时器进行PWM输出和定时功能

    NXP JN5169使用定时器进行PWM输出和定时功能 一.定时器介绍 1.定时器介绍 2.定时器可操作的模式 3.定时器DIO 4.定时器和PWM模式 5.定时器中断 二.实现代码 1.PWM输出 ...

  4. NXP JN5169 JN-AN-1189-ZigBee-HA-Demo 使用UART0打印调试信息,UART1和其他设备收发数据

    NXP JN5169 JN-AN-1189-ZigBee-HA-Demo 使用UART0打印调试信息,UART1和其他设备收发数据 一.JN-AN-1189 介绍 二.导入工程 三.修改工程 1.典型 ...

  5. NXP JN5169 使用看门狗定时器

    NXP JN5169 使用看门狗定时器 一.看门狗定时器介绍 二.示例代码 一.看门狗定时器介绍 JN5169 提供了看门狗定时器以防止软件锁定.它通过计算高速 RC 系统时钟(该振荡器运行在 27M ...

  6. NXP JN5169 使用红外发送 / 接收

    NXP JN5169 使用红外发送 / 接收 一.红外发送 1.红外发射二极管原理图 2.JN5169 发射端代码 3.STC15W408AS 接收端代码 二.红外接收 一.红外发送 1.红外发射二极 ...

  7. NXP MPC574x LinFlexd配置和DMA配置

    概述 Lin总线在汽车电子中使用非常广泛,下面简单介绍一下NXP MPC574X系列PowerPC的Lin总线配置.由于Lin总线的通信速率比较低,所以一般在实际开发中会使用DMA外设进行数据的搬运, ...

  8. Cisco路由器的安全配置方案

    Cisco路由器的安全配置方案 标签: cisco 配置 安全 路由器 方案 Cisco路由器的安全配置方案 Author: BluShin Auditor: Amy E-mail:Yangtongu ...

  9. NXP JN5169使用滴答定时器进行精准延时

    NXP JN5169使用滴答定时器进行精准延时(us.ms) 一.滴答定时器介绍 二.滴答定时器系统图 1.系统图介绍 2.单次触发模式 3.可重启模式 4.连续运行模式 三.系统时钟 1.系统时钟域 ...

最新文章

  1. 这一次,彻底弄懂 JavaScript 执行机制
  2. 用 GDI 操作 EMF 文件[8]: 绘制图元文件时改变画笔与画刷
  3. Auto-Publishing and Monitoring APIs With Spring Boot--转
  4. Linux之bash shell基本命令
  5. Array.from()
  6. python web cgi
  7. 送书!1991-2018,区块链的那点事,都在这里了!
  8. 06-spring学习-自动装配
  9. linux开机自启动python脚本_Linux下Python脚本自启动和定时启动的详细步骤
  10. Stanford公开课《编译原理》学习笔记(2)递归下降法
  11. Series.str.split([pat, n, expand])
  12. vue-router 源码:实现一个简单的 vue-router
  13. 文件解压缩,删除文件,创建文件,读取xml文件为json字符串,得到相对路径下的图片名称...
  14. .net 2.0安装包打不开_腾讯悄悄发布 Linux QQ,版本 2.0 Beta
  15. 三个百分数相乘计算机,我的公考笔记:资料分析的三个速算技巧
  16. 怎么去掉360导航页
  17. java循环结构sum关于质数,质数
  18. NOTE_网络存储-2 by 张冬
  19. 如何固化zynq程序
  20. 第一章: 微型计算机组成结构

热门文章

  1. 台式计算机文件打不开怎么回事,电脑打不开文件是怎么回事 电脑打不开文件是什么原因...
  2. 计算机无法打开压缩包,电脑打不开zip文件怎么打开
  3. 淘淘商城——展示购物车商品列表
  4. goland集成golint
  5. Pytorch实现Bert/RoBerta微调(以MELD数据集为例)
  6. Http协议之Referer
  7. 字母异位词分组-LeetCode49
  8. Qt学习之安装过程中各种问题的解决
  9. 解决colab上传大文件速度慢
  10. python 编程入门学习基础