NXP JN5169 使用脉冲计数器
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 使用脉冲计数器相关推荐
- NXP JN5169使用滴答定时器进行精准延时
NXP JN5169使用滴答定时器进行精准延时(us.ms) 一.滴答定时器介绍 二.滴答定时器系统图 1.系统图介绍 2.单次触发模式 3.可重启模式 4.连续运行模式 三.系统时钟 1.系统时钟域 ...
- NXP JN5169 读写片外 FLASH
NXP JN5169 读写片外 FLASH 一.原理图 二.读写兼容的片外 FLASH 设备 三.读写不兼容的片外 FLASH 设备 一.原理图 二.读写兼容的片外 FLASH 设备 JN5169 片 ...
- NXP JN5169使用定时器进行PWM输出和定时功能
NXP JN5169使用定时器进行PWM输出和定时功能 一.定时器介绍 1.定时器介绍 2.定时器可操作的模式 3.定时器DIO 4.定时器和PWM模式 5.定时器中断 二.实现代码 1.PWM输出 ...
- NXP JN5169 波特率配置方案
NXP JN5169 UART 波特率设置 一.系统时钟介绍 1.高速(32MHz)系统时钟 1.32MHz 晶体振荡器 2.高速RC振荡器 2.低速(32kHz)系统时钟 1.32 kHz RC 振 ...
- NXP JN5169 使用看门狗定时器
NXP JN5169 使用看门狗定时器 一.看门狗定时器介绍 二.示例代码 一.看门狗定时器介绍 JN5169 提供了看门狗定时器以防止软件锁定.它通过计算高速 RC 系统时钟(该振荡器运行在 27M ...
- NXP JN5169 UART 波特率设置
NXP JN5169 UART 波特率设置 一.系统时钟介绍 1.高速(32MHz)系统时钟 1.32MHz 晶体振荡器 2.高速RC振荡器 2.低速(32kHz)系统时钟 1.32 kHz RC 振 ...
- NXP JN5169使用EEPROM/片上FLASH/随机数/内部NVM
NXP JN5169使用EEPROM/片上FLASH/随机数/内部NVM JN5169 内存映射 一.EEPROM 1.EEPROM特性 2.实现代码 3.串口格式化输出 4.效果图 二.片上FLAS ...
- NXP JN5169 使用红外发送 / 接收
NXP JN5169 使用红外发送 / 接收 一.红外发送 1.红外发射二极管原理图 2.JN5169 发射端代码 3.STC15W408AS 接收端代码 二.红外接收 一.红外发送 1.红外发射二极 ...
- NXP JN5169 UART波特率问题
被NXP JN5169的UART收数据大批量错误坑了一把,最后发现是NXP的速率计算因子误差太大导致. 写了个程序,把所有常见的波特率匹配了一把,匹配的结果(相对误差在千分之七以下)即波特率的计算因子 ...
最新文章
- 目前154万AI开发者
- illegalargumentexception是什么异常_线程出现异常!应该如何处理?
- 手机qpython3安装库_iPhone手机设置铃声简易教程(iOS12-iOS14)
- HDU_2577 How to Type(DP)
- 收集Java 性能优化的44个建议
- 开源项目中经常出现的七种错误
- MFC_CFileDialog_选择单一文件
- linux c当程序接受来自按键q或q后退出程序_Linux 命令行 整理(四)
- Eclipse在选项卡上展示某个具体的视图
- MySQL:浅析 Impossible WHERE noticed after reading const tables
- 微服务架构实战(四):服务发现的可行方案以及实践案例
- ios visio流程图_微软visio绘图查看器ios版下载|Microsoft Visio Viewer iphone/ipad版下载 v1.17 - 跑跑车苹果网...
- DP动态规划--m处理器问题- m processors(FZU - 1442)
- 各大网络安全厂商及安全产品
- 金蝶星空支持mysql吗_金蝶云星空K3 CLOUD SQL 数据库优化
- 洛谷 P4147 玉蟾宫【悬线法/单调栈】
- QT 软键盘实现
- 【餐厅点餐平台|一】项目描述+需求分析
- 基于C++的AGV机器人无线控制
- 显示前半内容后半内容用省略号_德语 OCR