NXP JN5169 唤醒定时器
NXP JN5169 唤醒定时器
- 一、唤醒定时器介绍
- 二、实现代码
- 1、中断模式 1
- 2、中断模式 2
- 3、轮询模式
一、唤醒定时器介绍
有关 32kHz 时钟见:低速(32kHz)系统时钟
JN5169 上有两个 41 位唤醒定时器,由 32 kHz 时钟(该时钟可源自内部或外部)驱动。它们可能会在设备其余大部分设备掉电时的睡眠周期内运行,以计时睡眠周期或应用程序可能需要的其他长时间周期。唤醒定时器不在深度睡眠期间运行,可以选择通过软件控制在睡眠模式下禁用。当唤醒定时器到期时,它通常会产生一个中断。如果设备处于睡眠状态,则该中断可以用作结束睡眠时间的事件。功能包括:
- 41位递减计数器
- (可选)在睡眠期间运行
- 由 32 kHz 系统时钟提供时钟; 32 kHz RC 振荡器,32 kHz 晶振或 32 kHz 时钟输入
唤醒定时器包括一个从所选 32 kHz 时钟开始计时的 41 位递减计数器。当计数器达到零时,会产生中断或唤醒事件。达到零时,计数器将继续递减计数直到停止,这允许测量响应中断的等待时间。如果需要中断或唤醒事件,则应在装入该期间的计数值之前使能定时器中断。一旦加载了计数器值并启动了计数器,便开始递减计数。计数器可以通过软件控制随时停止——计数器将保持其停止时所包含的值,并且不会产生中断。可以读取计时器的状态以指示计时器是否正在运行或已到期;当定时器中断被屏蔽时,这很有用。此操作将重置所有过期的状态标志。
唤醒定时器时钟:
二、实现代码
1、中断模式 1
#include <AppHardwareApi.h>
#include <AppQueueApi.h>#define UART E_AHI_UART_0PRIVATE void vPutChar(unsigned char c);
PRIVATE void vPutStrs(unsigned char *str);
PRIVATE void vUartInit(void);
PRIVATE void vWakeTimerInit(void);PRIVATE uint32 u32WakeTimerClockCycle; //定时 T 秒所需的 32kHz 时钟周期数#define DURATION_SECONDS 2 //WakeTimer 定时时间(以秒计算),这里示例2秒PUBLIC void AppColdStart (void)
{/*等待系统时钟切换为外部32MHz晶振*/while (bAHI_GetClkSource() == TRUE);/*优化闪存等待状态*/vAHI_OptimiseWaitStates();vAHI_WatchdogStop();(void)u32AHI_Init();u32WakeTimerClockCycle = 0;vUartInit();vWakeTimerInit();while (1) {vAHI_CpuDoze(); /* Doze */}
}PUBLIC void AppWarmStart (void)
{AppColdStart();
}PRIVATE void vCbWakeTimer (uint32 u32Device, uint32 u32ItemBitmap)
{if(E_AHI_DEVICE_SYSCTRL == u32Device){ //系统中断switch(u32ItemBitmap){case E_AHI_SYSCTRL_WK1_MASK: //WakeTimer1vPutStrs((uint8*)"E_AHI_SYSCTRL_WK1_MASK\n");break;case E_AHI_SYSCTRL_WK0_MASK: //WakeTimer0vPutStrs((uint8*)"E_AHI_SYSCTRL_WK0_MASK\n");break;default:break;}}/*** WakeTimer 计数在到达 0 时,定时器触发,翻转到 0x1FFFFFFFFFF,并继续递减。* 如果使能,在到达0 时产生唤醒定时器中断。* 每次触发中断之后需要重新设置 32KHz 时钟周期数,不然默认会翻转到 0x1FFFFFFFFFF,并继续递减。*/vAHI_WakeTimerStartLarge(E_AHI_WAKE_TIMER_0, u32WakeTimerClockCycle);
}PRIVATE void vWakeTimerInit(void)
{/*** 如果 32KHz 时钟的时钟源是(默认)内部 32KHz RC 振荡器,* 那么唤醒定时器的运行速度可能快 18%或 慢 18%* 为了得到更精确的定时,建议先校准时钟,并相应调整指定的计数值* 通过时钟校准计算所需的唤醒定时器持续时间的 32KHz 时钟周期数 N* 唤醒定时器 32 个时钟周期等于 1ms* n = u32AHI_WakeTimerCalibrate()* 定时时间 T (单位秒)* 时钟周期数 N = (10000.0 / n) * 32000 * T*/vAHI_WakeTimerStop(E_AHI_WAKE_TIMER_0); //使用 u32AHI_WakeTimerCalibrate() 之前需要停止相应的唤醒定时器u32WakeTimerClockCycle = (uint32)DURATION_SECONDS * 32000 * (10000.0 / u32AHI_WakeTimerCalibrate());vAHI_WakeTimerEnable(E_AHI_WAKE_TIMER_0, TRUE); //唤醒定时器启动时启用中断vAHI_WakeTimerStartLarge(E_AHI_WAKE_TIMER_0, u32WakeTimerClockCycle); //启动唤醒定时器vAHI_SysCtrlRegisterCallback(vCbWakeTimer); //注册中断回调函数
}/*发送单个字符*/
PRIVATE void vPutChar(unsigned char c)
{while (!(u8AHI_UartReadLineStatus(UART) & E_AHI_UART_LS_THRE)); /*发送FIFO为空*/vAHI_UartWriteData(UART, c); /*写入要发送的字符*//*发送移位寄存器为空或者发送FIFO为空,即等待发送完毕E_AHI_UART_LS_THRE | E_AHI_UART_LS_TEMT = 0x20 | 0x40 = 0x60*/while ((u8AHI_UartReadLineStatus(UART) & (E_AHI_UART_LS_THRE | E_AHI_UART_LS_TEMT))!= (E_AHI_UART_LS_THRE | E_AHI_UART_LS_TEMT));
}
/*发送字符串*/
PRIVATE void vPutStrs(unsigned char *str)
{while(*str){vPutChar(*str++);}
}/*初始化串口*/
PRIVATE void vUartInit(void)
{#if (UART == E_AHI_UART_0)vAHI_UartSetRTSCTS(UART, FALSE); /* UART0 2线模式。Disable use of CTS/RTS */
#endifvAHI_UartEnable(UART);//复位指定UART的发送和接收FIFO,并将FIFO触发级别设置为单字节触发vAHI_UartReset(UART,TRUE, /* 复位收发FIFO*/TRUE);vAHI_UartSetBaudRate(UART, E_AHI_UART_RATE_115200); /* 设置波特率*/
}
效果演示:
2、中断模式 2
与模式 1 相比,少了中断回调函数。
#include <AppHardwareApi.h>
#include <AppQueueApi.h>#define UART E_AHI_UART_0PRIVATE void vPutChar(unsigned char c);
PRIVATE void vPutStrs(unsigned char *str);
PRIVATE void vUartInit(void);
PRIVATE void vWakeTimerInit(void);PRIVATE uint32 u32WakeTimerClockCycle; //定时 T 秒所需的 32KHz 时钟周期数#define DURATION_SECONDS 2 //WakeTimer 定时时间(以秒计算),这里示例2秒PUBLIC void AppColdStart (void)
{/*等待系统时钟切换为外部32MHz晶振*/while (bAHI_GetClkSource() == TRUE);/*优化闪存等待状态*/vAHI_OptimiseWaitStates();vAHI_WatchdogStop();(void)u32AHI_Init();u32WakeTimerClockCycle = 0;vUartInit();vWakeTimerInit();while (1) {vAHI_CpuDoze(); /* Doze *///唤醒定时器中断发生后唤醒设备,重新装载计数时钟周期数,然后进入 Doze 模式/*** WakeTimer 计数在到达 0 时,定时器触发,翻转到 0x1FFFFFFFFFF,并继续递减。* 如果使能,在到达0 时产生唤醒定时器中断。* 每次触发中断之后需要重新设置 32KHz 时钟周期数,不然默认会翻转到 0x1FFFFFFFFFF,并继续递减。*/vAHI_WakeTimerStartLarge(E_AHI_WAKE_TIMER_0, u32WakeTimerClockCycle);vPutStrs((uint8*)"Interrupt Mode 2:E_AHI_SYSCTRL_WK0_MASK\n");}
}PUBLIC void AppWarmStart (void)
{AppColdStart();
}PRIVATE void vWakeTimerInit(void)
{/*** 如果 32KHz 时钟的时钟源是(默认)内部 32KHz RC 振荡器,* 那么唤醒定时器的运行速度可能快 18%或 慢 18%* 为了得到更精确的定时,建议先校准时钟,并相应调整指定的计数值* 通过时钟校准计算所需的唤醒定时器持续时间的 32KHz 时钟周期数 N* 唤醒定时器 32 个时钟周期等于 1ms* n = u32AHI_WakeTimerCalibrate()* 定时时间 T (单位秒)* 时钟周期数 N = (10000.0 / n) * 32000 * T*/vAHI_WakeTimerStop(E_AHI_WAKE_TIMER_0); //使用 u32AHI_WakeTimerCalibrate() 之前需要停止相应的唤醒定时器u32WakeTimerClockCycle = (uint32)DURATION_SECONDS * 32000 * (10000.0 / u32AHI_WakeTimerCalibrate());vAHI_WakeTimerEnable(E_AHI_WAKE_TIMER_0, TRUE); //唤醒定时器启动时启用中断vAHI_WakeTimerStartLarge(E_AHI_WAKE_TIMER_0, u32WakeTimerClockCycle); //启动唤醒定时器
}/*发送单个字符*/
PRIVATE void vPutChar(unsigned char c)
{while (!(u8AHI_UartReadLineStatus(UART) & E_AHI_UART_LS_THRE)); /*发送FIFO为空*/vAHI_UartWriteData(UART, c); /*写入要发送的字符*//*发送移位寄存器为空或者发送FIFO为空,即等待发送完毕E_AHI_UART_LS_THRE | E_AHI_UART_LS_TEMT = 0x20 | 0x40 = 0x60*/while ((u8AHI_UartReadLineStatus(UART) & (E_AHI_UART_LS_THRE | E_AHI_UART_LS_TEMT))!= (E_AHI_UART_LS_THRE | E_AHI_UART_LS_TEMT));
}
/*发送字符串*/
PRIVATE void vPutStrs(unsigned char *str)
{while(*str){vPutChar(*str++);}
}/*初始化串口*/
PRIVATE void vUartInit(void)
{#if (UART == E_AHI_UART_0)vAHI_UartSetRTSCTS(UART, FALSE); /* UART0 2线模式。Disable use of CTS/RTS */
#endifvAHI_UartEnable(UART);//复位指定UART的发送和接收FIFO,并将FIFO触发级别设置为单字节触发vAHI_UartReset(UART,TRUE, /* 复位收发FIFO*/TRUE);vAHI_UartSetBaudRate(UART, E_AHI_UART_RATE_115200); /* 设置波特率*/
}
效果演示:
3、轮询模式
注意!轮询模式下设备不能进入 休眠(doze)模式 ,因为关闭了唤醒定时器中断,无法唤醒进入休眠模式的设备!
#include <AppHardwareApi.h>
#include <AppQueueApi.h>#define UART E_AHI_UART_0PRIVATE void vPutChar(unsigned char c);
PRIVATE void vPutStrs(unsigned char *str);
PRIVATE void vUartInit(void);
PRIVATE void vWakeTimerInit(void);PRIVATE uint32 u32WakeTimerClockCycle; //定时 T 秒所需的 32KHz 时钟周期数#define DURATION_SECONDS 2 //WakeTimer 定时时间(以秒计算),这里示例2秒PUBLIC void AppColdStart (void)
{/*等待系统时钟切换为外部32MHz晶振*/while (bAHI_GetClkSource() == TRUE);/*优化闪存等待状态*/vAHI_OptimiseWaitStates();vAHI_WatchdogStop();(void)u32AHI_Init();u32WakeTimerClockCycle = 0;vUartInit();vWakeTimerInit();while (1) {while(u64AHI_WakeTimerReadLarge(E_AHI_WAKE_TIMER_0) == 0){vPutStrs((uint8*)"E_AHI_SYSCTRL_WK0_MASK\n");/*** WakeTimer 计数在到达 0 时,定时器触发,翻转到 0x1FFFFFFFFFF,并继续递减。* 如果使能,在到达0 时产生唤醒定时器中断。* 每次触发中断之后需要重新设置 32KHz 时钟周期数,不然默认会翻转到 0x1FFFFFFFFFF,并继续递减。*/vAHI_WakeTimerStartLarge(E_AHI_WAKE_TIMER_0, u32WakeTimerClockCycle);}}
}PUBLIC void AppWarmStart (void)
{AppColdStart();
}PRIVATE void vWakeTimerInit(void)
{/*** 如果 32KHz 时钟的时钟源是(默认)内部 32KHz RC 振荡器,* 那么唤醒定时器的运行速度可能快 18%或 慢 18%* 为了得到更精确的定时,建议先校准时钟,并相应调整指定的计数值* 通过时钟校准计算所需的唤醒定时器持续时间的 32KHz 时钟周期数 N* 唤醒定时器 32 个时钟周期等于 1ms* n = u32AHI_WakeTimerCalibrate()* 定时时间 T (单位秒)* 时钟周期数 N = (10000.0 / n) * 32000 * T*/vAHI_WakeTimerStop(E_AHI_WAKE_TIMER_0); //使用 u32AHI_WakeTimerCalibrate() 之前需要停止相应的唤醒定时器u32WakeTimerClockCycle = (uint32)DURATION_SECONDS * 32000 * (10000.0 / u32AHI_WakeTimerCalibrate());vAHI_WakeTimerEnable(E_AHI_WAKE_TIMER_0, FALSE); //唤醒定时器启动时关闭中断vAHI_WakeTimerStartLarge(E_AHI_WAKE_TIMER_0, u32WakeTimerClockCycle); //启动唤醒定时器
}/*发送单个字符*/
PRIVATE void vPutChar(unsigned char c)
{while (!(u8AHI_UartReadLineStatus(UART) & E_AHI_UART_LS_THRE)); /*发送FIFO为空*/vAHI_UartWriteData(UART, c); /*写入要发送的字符*//*发送移位寄存器为空或者发送FIFO为空,即等待发送完毕E_AHI_UART_LS_THRE | E_AHI_UART_LS_TEMT = 0x20 | 0x40 = 0x60*/while ((u8AHI_UartReadLineStatus(UART) & (E_AHI_UART_LS_THRE | E_AHI_UART_LS_TEMT))!= (E_AHI_UART_LS_THRE | E_AHI_UART_LS_TEMT));
}
/*发送字符串*/
PRIVATE void vPutStrs(unsigned char *str)
{while(*str){vPutChar(*str++);}
}/*初始化串口*/
PRIVATE void vUartInit(void)
{#if (UART == E_AHI_UART_0)vAHI_UartSetRTSCTS(UART, FALSE); /* UART0 2线模式。Disable use of CTS/RTS */
#endifvAHI_UartEnable(UART);//复位指定UART的发送和接收FIFO,并将FIFO触发级别设置为单字节触发vAHI_UartReset(UART,TRUE, /* 复位收发FIFO*/TRUE);vAHI_UartSetBaudRate(UART, E_AHI_UART_RATE_115200); /* 设置波特率*/
}
效果演示:
NXP JN5169 唤醒定时器相关推荐
- NXP JN5169使用定时器进行PWM输出和定时功能
NXP JN5169使用定时器进行PWM输出和定时功能 一.定时器介绍 1.定时器介绍 2.定时器可操作的模式 3.定时器DIO 4.定时器和PWM模式 5.定时器中断 二.实现代码 1.PWM输出 ...
- NXP JN5169 使用看门狗定时器
NXP JN5169 使用看门狗定时器 一.看门狗定时器介绍 二.示例代码 一.看门狗定时器介绍 JN5169 提供了看门狗定时器以防止软件锁定.它通过计算高速 RC 系统时钟(该振荡器运行在 27M ...
- NXP JN5169使用滴答定时器进行精准延时
NXP JN5169使用滴答定时器进行精准延时(us.ms) 一.滴答定时器介绍 二.滴答定时器系统图 1.系统图介绍 2.单次触发模式 3.可重启模式 4.连续运行模式 三.系统时钟 1.系统时钟域 ...
- NXP JN5169 波特率配置方案
NXP JN5169 UART 波特率设置 一.系统时钟介绍 1.高速(32MHz)系统时钟 1.32MHz 晶体振荡器 2.高速RC振荡器 2.低速(32kHz)系统时钟 1.32 kHz RC 振 ...
- NXP JN5169 UART 波特率设置
NXP JN5169 UART 波特率设置 一.系统时钟介绍 1.高速(32MHz)系统时钟 1.32MHz 晶体振荡器 2.高速RC振荡器 2.低速(32kHz)系统时钟 1.32 kHz RC 振 ...
- NXP JN5169 使用脉冲计数器
NXP JN5169 使用脉冲计数器 一.脉冲计数器介绍 二.代码实现 1.中断模式 2.轮询模式 一.脉冲计数器介绍 JN5169 提供两个 16 位脉冲计数器,它们可以在所有操作模式(包括睡眠)期 ...
- NXP JN5169 使用红外发送 / 接收
NXP JN5169 使用红外发送 / 接收 一.红外发送 1.红外发射二极管原理图 2.JN5169 发射端代码 3.STC15W408AS 接收端代码 二.红外接收 一.红外发送 1.红外发射二极 ...
- NXP JN5169 JN-AN-1189-ZigBee-HA-Demo 使用UART0打印调试信息,UART1和其他设备收发数据
NXP JN5169 JN-AN-1189-ZigBee-HA-Demo 使用UART0打印调试信息,UART1和其他设备收发数据 一.JN-AN-1189 介绍 二.导入工程 三.修改工程 1.典型 ...
- NXP JN5169 读写片外 FLASH
NXP JN5169 读写片外 FLASH 一.原理图 二.读写兼容的片外 FLASH 设备 三.读写不兼容的片外 FLASH 设备 一.原理图 二.读写兼容的片外 FLASH 设备 JN5169 片 ...
- NXP JN5169使用EEPROM/片上FLASH/随机数/内部NVM
NXP JN5169使用EEPROM/片上FLASH/随机数/内部NVM JN5169 内存映射 一.EEPROM 1.EEPROM特性 2.实现代码 3.串口格式化输出 4.效果图 二.片上FLAS ...
最新文章
- 栈、堆、方法区之间的关系
- vue实例、指令、生命周期
- 计算机系统结构树形流程图,计算机系统结构 第七章自考练习题答案
- 求最大公约数最小公倍数
- Dinic算法(研究总结,网络流)
- POJ1107 ZOJ1042 UVALive2291 W's Cipher【密码+模拟】
- 选中一行的快捷键_常用文字编辑快捷键,学会之后,天天可以提前下班
- 初识验收测试管理工具FitNesse
- 什么是java OOM Out Of Memory 内存溢出?如何分析及解决oom问题?
- 交易系统开发(六)——HFT高频交易
- 信息展示类图表设计指南:10个必须遵循的步骤
- html表头固定原理,html Table 表头固定的实现
- 【稀饭】react native 实战系列教程之影片数据获取并解析
- 去掉office标题前的黑点
- labelme批量json转png数据集教程
- 微信小程序实践——实验3视频播放小程序
- 洛谷 P3373 【模板】线段树 2
- 研究显示情商高的人比智商高的可怕多了
- 2023年网络安全比赛--网络安全应急响应中职组(超详细)
- 1102 : 火车票退票费计算(函数专题)
热门文章
- ssm框架整合以及登录案例
- 案例分析 | 贝壳找房:自我颠覆的整合式创新引领产业数字化
- (翻译):如何部署Contrail网关以及它是如何与Contrail协同工作的
- 微信公众号网页登录开发测试步骤详解
- 99乘法表c语言竖坐标,99乘法表c语言(c语言九九乘法表原理)
- xgene:WGS,突变与癌,RNA-seq,WES
- android qq 邮箱格式,qq邮箱怎么填写格式 qq邮箱格式写法介绍
- 如何给澳洲路局写信refound罚金,遇到交通罚款怎么办
- springboot实现微信退款
- C++ 输入输出加速挂(ACM竞赛常用)