NXP JN5169 使用脉冲计数器

  • 一、脉冲计数器介绍
  • 二、代码实现
    • 1、中断模式
    • 2、轮询模式

一、脉冲计数器介绍

JN5169 提供两个 16 位脉冲计数器,它们可以在所有操作模式(包括睡眠)期间递增。第一个脉冲计数器 PC0 从 DIO1 或 DIO4 上接收的脉冲开始递增。另一个脉冲计数器 PC1 根据配置从 DIO5 或 DIO8 运行。这是在软件控制下启用的。可以使用 32 kHz 时钟对脉冲进行去抖动,以防止在缓慢或嘈杂的边沿上错误计数。增量从相应 DIO 输入上的可配置上升沿或下降沿产生。

每个脉冲计数器有一个相关的用户定义的参考值。当计数器达到其预先配置的参考值时,可能会产生中断(和唤醒事件,如果处于睡眠状态)。这两个计数器可以有选择地级联在一起,以提供单个 32 位计数器,该计数器链接到四个 DIO 中的任何一个。计数器不会在 65535 达到饱和,但自然会翻转为 0。此外,在没有软件交互的情况下,当达到参考值时,脉冲计数将继续进行,这样即使在中断服务之前或在唤醒过程中有很长的延迟,脉冲也不会丢失。

该系统可在无反跳的情况下处理高达 100 kHz 的信号,或在无反跳的情况下工作于 5.3 kHz 至 1.7 kHz 的信号。使用去抖动功能时,必须激活 32 kHz 时钟,因此,为了使睡眠电流最小,不应该使用去抖动模式。

输入脉冲可使用 32 kHz 时钟去抖,以防止在低速边沿或噪声边沿上进行错误计数。在识别输入信号的变化前,去抖特性需要多次相同的连续输入采样(2、4 或 8)。根据去抖设置,脉冲计数器可按下列频率与输入信号操作:

  • 如果去抖禁能,则频率为 100KHz
  • 如果出现 2 次连续采样时去抖使能,则频率为 3.7KHz
  • 如果出现 4 次连续采样时去抖使能,则频率为 2.2KHz
  • 如果出现 8 次连续采样时去抖使能,则频率为 1.2KHz

二、代码实现

1、中断模式

#define TIMER3               E_AHI_TIMER_3
#define TIMER_PRESCALE      3                                   //定时器预分值,TIMER_FREQUENCY = 16 / (2 ^ TIMER_PRESCALE)
#define TIMER_FREQUENCY     (16.0 / (pow(2, TIMER_PRESCALE)))     //定时器时钟 2MHz
#define TIMER_TIMING        1000                                //定时器定时时间 time = 1000us ,时间单位us
#define TIMER_COUNT         (TIMER_FREQUENCY * TIMER_TIMING)      //定时器一个有效的脉冲周期的时钟周期数, 即定时器初值
#define LOW_PULSE           50                                  //低电平占比(0 - 100),为一个有效的脉冲周期内低电平所占的时钟周期数
#define LOW_PULSE_VALUE     (TIMER_COUNT * (LOW_PULSE / 100.0)) //低电平时钟数值#define PWM_FREQUENCY      (1 / (TIMER_TIMING / 1000000.0))        //PWM频率,单位Hz//定时器 3 输出一个 1kHz 的 pwm(DIO13)
PRIVATE void vTimer3Init(void)
{//定时器3输出PWMvAHI_TimerEnable(TIMER3,            //定时器3TIMER_PRESCALE,   //8分频,定时器时钟为2MHzFALSE,               //关闭上升输出(从低到高)中断FALSE,                //关闭定时器周期结束时(从高到低)中断TRUE);                //启用DIO上定时器信号的输出vAHI_TimerStartRepeat(TIMER3,       //定时器3LOW_PULSE_VALUE,          //一个有效的脉冲周期的低电平时钟周期数。中断可以在这个跳变时产生TIMER_COUNT                //一个有效的脉冲周期的时钟周期总数。中断可以在这个跳变时产生);
}PRIVATE void vPulseCounterIntCallback(uint32 u32DeviceId,uint32 u32ItemBitmap)
{if(E_AHI_DEVICE_SYSCTRL == u32DeviceId){ //系统控制器中断//脉冲计数器0中断if(E_AHI_SYSCTRL_PC0_MASK == u32ItemBitmap){vPrintf("脉冲计数器 0 中断!\n");//每次达到参考值之后都要重新设置参考值bAHI_Clear16BitPulseCounter(E_AHI_PC_0);//清除计数器值bAHI_SetPulseCounterRef(E_AHI_PC_0, 1000);}}
}//脉冲计数器0,DIO1输入
PUBLIC void vPulseCounter0Init(void)
{bool status;//vAHI_PulseCounterSetLocation(E_AHI_PC_0, TRUE);//切换DIO1到DIO4//配置脉冲计数器0status = bAHI_PulseCounterConfigure(E_AHI_PC_0,   //脉冲计数器01,          //下降沿计数1,           //两次消抖E_AHI_PC_COMBINE_OFF,     //禁用32位计数器组合TRUE);          //开启中断//注册中断回调函数vAHI_SysCtrlRegisterCallback(vPulseCounterIntCallback);if(status){vPrintf("脉冲计数器 0 配置成功!\n");}else{vPrintf("脉冲计数器 0 配置失败!\n");}//设置脉冲计数器参考值,当计数器超过参考值时(即计数达到(参考值+ 1))时,将产生中断。//定时器 3 周期为 1ms,参考值设置为1000,即1秒bAHI_SetPulseCounterRef(E_AHI_PC_0, 1000);//启动脉冲计数器bAHI_Clear16BitPulseCounter(E_AHI_PC_0);//清除计数器值status = bAHI_StartPulseCounter(E_AHI_PC_0);if(status){vPrintf("脉冲计数器 0 启动成功!\n");}else{vPrintf("脉冲计数器 0 启动失败!\n");}
}PUBLIC void AppColdStart (void)
{vAHI_WatchdogStop();(void)u32AHI_Init();vUartInit();vTimer3Init();vAHI_DelayXms(2000);vPulseCounter0Init();while (1) {}
}PUBLIC void AppWarmStart (void)
{AppColdStart();
}

连接 DIO13 和 DIO1

效果图:

2、轮询模式

#define TIMER3               E_AHI_TIMER_3
#define TIMER_PRESCALE      3                                   //定时器预分值,TIMER_FREQUENCY = 16 / (2 ^ TIMER_PRESCALE)
#define TIMER_FREQUENCY     (16.0 / (pow(2, TIMER_PRESCALE)))     //定时器时钟 2MHz
#define TIMER_TIMING        1000                                //定时器定时时间 time = 1000us ,时间单位us
#define TIMER_COUNT         (TIMER_FREQUENCY * TIMER_TIMING)      //定时器一个有效的脉冲周期的时钟周期数, 即定时器初值
#define LOW_PULSE           50                                  //低电平占比(0 - 100),为一个有效的脉冲周期内低电平所占的时钟周期数
#define LOW_PULSE_VALUE     (TIMER_COUNT * (LOW_PULSE / 100.0)) //低电平时钟数值#define PWM_FREQUENCY      (1 / (TIMER_TIMING / 1000000.0))        //PWM频率,单位Hz//定时器 3 输出一个 1kHz 的 pwm(DIO13)
PRIVATE void vTimer3Init(void)
{//定时器3输出PWMvAHI_TimerEnable(TIMER3,            //定时器3TIMER_PRESCALE,   //8分频,定时器时钟为2MHzFALSE,               //关闭上升输出(从低到高)中断FALSE,                //关闭定时器周期结束时(从高到低)中断TRUE);                //启用DIO上定时器信号的输出vAHI_TimerStartRepeat(TIMER3,       //定时器3LOW_PULSE_VALUE,          //一个有效的脉冲周期的低电平时钟周期数。中断可以在这个跳变时产生TIMER_COUNT                //一个有效的脉冲周期的时钟周期总数。中断可以在这个跳变时产生);
}//脉冲计数器0,DIO1输入
PUBLIC void vPulseCounter0Init(void)
{bool status;//vAHI_PulseCounterSetLocation(E_AHI_PC_0, TRUE);//配置脉冲计数器0status = bAHI_PulseCounterConfigure(E_AHI_PC_0,    //脉冲计数器01,          //下降沿计数1,           //两次消抖E_AHI_PC_COMBINE_OFF,     //禁用32位计数器组合FALSE);         //关闭中断if(status){vPrintf("脉冲计数器 0 配置成功!\n");}else{vPrintf("脉冲计数器 0 配置失败!\n");}//设置脉冲计数器参考值,当计数器超过参考值时(即计数达到(参考值+ 1))时,将产生中断。//定时器3周期为1ms,参考值设置为1000,即1秒bAHI_SetPulseCounterRef(E_AHI_PC_0, 1000);//启动脉冲计数器bAHI_Clear16BitPulseCounter(E_AHI_PC_0);//清除计数器值status = bAHI_StartPulseCounter(E_AHI_PC_0);if(status){vPrintf("脉冲计数器 0 启动成功!\n");}else{vPrintf("脉冲计数器 0 启动失败!\n");}
}PUBLIC void AppColdStart (void)
{uint16 count;vAHI_WatchdogStop();(void)u32AHI_Init();vUartInit();vTimer3Init();vAHI_DelayXms(2000);vPulseCounter0Init();while (1) {bAHI_Read16BitCounter(E_AHI_PC_0, &count);if(count == 1000){//每次到达参考值都要重新设置参考值bAHI_Clear16BitPulseCounter(E_AHI_PC_0);bAHI_SetPulseCounterRef(E_AHI_PC_0, 1000);vPrintf("脉冲计数器到达参考值!\n");}}
}PUBLIC void AppWarmStart (void)
{AppColdStart();
}

连接 DIO13 和 DIO1

效果图:

NXP JN5169 使用脉冲计数器相关推荐

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

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

  2. NXP JN5169 读写片外 FLASH

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

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

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

  4. NXP JN5169 波特率配置方案

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

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

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

  6. NXP JN5169 UART 波特率设置

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

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

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

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

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

  9. NXP JN5169 UART波特率问题

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

最新文章

  1. 目前154万AI开发者
  2. illegalargumentexception是什么异常_线程出现异常!应该如何处理?
  3. 手机qpython3安装库_iPhone手机设置铃声简易教程(iOS12-iOS14)
  4. HDU_2577 How to Type(DP)
  5. 收集Java 性能优化的44个建议
  6. 开源项目中经常出现的七种错误
  7. MFC_CFileDialog_选择单一文件
  8. linux c当程序接受来自按键q或q后退出程序_Linux 命令行 整理(四)
  9. Eclipse在选项卡上展示某个具体的视图
  10. MySQL:浅析 Impossible WHERE noticed after reading const tables
  11. 微服务架构实战(四):服务发现的可行方案以及实践案例
  12. ios visio流程图_微软visio绘图查看器ios版下载|Microsoft Visio Viewer iphone/ipad版下载 v1.17 - 跑跑车苹果网...
  13. DP动态规划--m处理器问题- m processors(FZU - 1442)
  14. 各大网络安全厂商及安全产品
  15. 金蝶星空支持mysql吗_金蝶云星空K3 CLOUD SQL 数据库优化
  16. 洛谷 P4147 玉蟾宫【悬线法/单调栈】
  17. QT 软键盘实现
  18. 【餐厅点餐平台|一】项目描述+需求分析
  19. 基于C++的AGV机器人无线控制
  20. 显示前半内容后半内容用省略号_德语 OCR

热门文章

  1. WinEdt10.3学习笔记Day2
  2. dva框架二级路由刷新出现空白页
  3. 云在天之南——我的七天七夜(感动普达措)
  4. 人工智能技术自发展伊始就与人有着千丝万缕的联系
  5. springboot整合minio搭建对象储存及短链服务
  6. JAVAWeb的学习笔记
  7. 高效沟通先从倾听开始|做一个会倾听的人
  8. stylus修改主题 以及系统目录更改
  9. 经典算法之不定方程问题
  10. matlab相关性分析及检验,科学网—EOF分析及Mann-Kendall检验相关的Matlab函数 - 刘永和的博文...