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 唤醒定时器相关推荐

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

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

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

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

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

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

  4. NXP JN5169 波特率配置方案

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

  5. NXP JN5169 UART 波特率设置

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

  6. NXP JN5169 使用脉冲计数器

    NXP JN5169 使用脉冲计数器 一.脉冲计数器介绍 二.代码实现 1.中断模式 2.轮询模式 一.脉冲计数器介绍 JN5169 提供两个 16 位脉冲计数器,它们可以在所有操作模式(包括睡眠)期 ...

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

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

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

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

  9. NXP JN5169 读写片外 FLASH

    NXP JN5169 读写片外 FLASH 一.原理图 二.读写兼容的片外 FLASH 设备 三.读写不兼容的片外 FLASH 设备 一.原理图 二.读写兼容的片外 FLASH 设备 JN5169 片 ...

  10. NXP JN5169使用EEPROM/片上FLASH/随机数/内部NVM

    NXP JN5169使用EEPROM/片上FLASH/随机数/内部NVM JN5169 内存映射 一.EEPROM 1.EEPROM特性 2.实现代码 3.串口格式化输出 4.效果图 二.片上FLAS ...

最新文章

  1. 栈、堆、方法区之间的关系
  2. vue实例、指令、生命周期
  3. 计算机系统结构树形流程图,计算机系统结构 第七章自考练习题答案
  4. 求最大公约数最小公倍数
  5. Dinic算法(研究总结,网络流)
  6. POJ1107 ZOJ1042 UVALive2291 W's Cipher【密码+模拟】
  7. 选中一行的快捷键_常用文字编辑快捷键,学会之后,天天可以提前下班
  8. 初识验收测试管理工具FitNesse
  9. 什么是java OOM Out Of Memory 内存溢出?如何分析及解决oom问题?
  10. 交易系统开发(六)——HFT高频交易
  11. 信息展示类图表设计指南:10个必须遵循的步骤
  12. html表头固定原理,html Table 表头固定的实现
  13. 【稀饭】react native 实战系列教程之影片数据获取并解析
  14. 去掉office标题前的黑点
  15. labelme批量json转png数据集教程
  16. 微信小程序实践——实验3视频播放小程序
  17. 洛谷 P3373 【模板】线段树 2
  18. 研究显示情商高的人比智商高的可怕多了
  19. 2023年网络安全比赛--网络安全应急响应中职组(超详细)
  20. 1102 : 火车票退票费计算(函数专题)

热门文章

  1. ssm框架整合以及登录案例
  2. 案例分析 | 贝壳找房:自我颠覆的整合式创新引领产业数字化
  3. (翻译):如何部署Contrail网关以及它是如何与Contrail协同工作的
  4. 微信公众号网页登录开发测试步骤详解
  5. 99乘法表c语言竖坐标,99乘法表c语言(c语言九九乘法表原理)
  6. xgene:WGS,突变与癌,RNA-seq,WES
  7. android qq 邮箱格式,qq邮箱怎么填写格式 qq邮箱格式写法介绍
  8. 如何给澳洲路局写信refound罚金,遇到交通罚款怎么办
  9. springboot实现微信退款
  10. C++ 输入输出加速挂(ACM竞赛常用)