NXP JN5169滴答定时器中断回调函数
NXP JN5169滴答定时器中断回调函数
- 一、滴答定时器介绍
- 二、中断处理
- 1、中断回调函数
- 2、 回调函数原型和参数
- 3、 回调行为
- 4、外设中断枚举(u32DeviceId)
- 5、外围中断源(u32ItemBitmap)
- 三、实现代码
- 1、宏定义
- 2、全局变量
- 3、滴答定时器初始化函数
- 4、中断回调函数
- 5、完整代码
一、滴答定时器介绍
JN5169使用滴答定时器进行精准延时
二、中断处理
1、中断回调函数
片上外设的中断由一组特定于外设的回调函数处理。 可以使用Integrated Peripherals API的适当回调注册功能来引入这些用户定义的功能。 例如,可以编写自己的UART0中断处理程序,然后注册使用vAHI_Uart0RegisterCallback()函数的回调函数。
下表提供了外设中断源的完整列表和相应的回调注册功能。
*包括DIO,比较器,唤醒定时器,脉冲计数器,随机数和掉电中断。
**用于SI主设备和SI从设备中断。
注:
① 回调函数在中断上下文中执行。 因此,必须确保函数及时返回主程序。
② 可以使用函数vAHI_InterruptSetPriority()设置来自各种中断源的中断的优先级。
③ 注册的回调函数仅在RAM保持供电的睡眠模式下保留。 如果在睡眠期间关闭RAM的电源并需要中断,则在唤醒时调用u32AHI_Init()之前必须重新注册所有回调函数。
2、 回调函数原型和参数
所有外围设备的用户定义回调函数必须按照以下原型设计:
void vHwDeviceIntCallback(uint32 u32DeviceId, uint32 u32ItemBitmap);
形参:u32DeviceId
标识产生中断的外设。 上面的表中列出了可能的来源。API中提供了这些来源的枚举,外设中断枚举(u32DeviceId)对此进行了详细说明。
形参:u32ItemBitmap
u32ItemBitmap是一个位图,用于标识通过上述u32DeviceId标识的外围模块内的中断的具体原因。 API中提供了掩码,允许检查特定的中断原因。 UART中断是一个例外,因为在这种情况下,枚举值是通过此参数而不是位图传递的。 掩码和枚举在外围中断源(u32ItemBitmap)详细介绍。
3、 回调行为
在调用其中一个回调函数之前,API会清除中断源,这样就不会存在相同中断的危险,从而不会导致处理器进入永久尝试处理同一中断的状态(由于回调函数编写不当)。 这也意味着可以使用NULL回调函数。
UART是该规则的例外。 当产生可用的接收数据或超时指示中断时,仅当从UART接收缓冲区读取数据后,UART才会清除该中断。 因此,至关重要的是,如果要启用UART中断,则回调函数通过在返回之前从UART读取数据来处理可用数据接收和超时指示中断。
如果正在使用Application Queue API,则该API将处理上述与UART中断有关的问题,因此应用程序无需对其进行处理。
处理唤醒中断本篇博客不涉及,不做展开介绍。
4、外设中断枚举(u32DeviceId)
5、外围中断源(u32ItemBitmap)
三、实现代码
使用BeyondStudio for NXP编写,SDK为JN-SW-4170,不带栈协议,仅外设功能实现。
1、宏定义
/* Value enumerations: Tick Timer */
#define E_AHI_TICK_TIMER_DISABLE (0x00) /* Disable tick timer */
#define E_AHI_TICK_TIMER_RESTART (0x01) /* Restart timer when match occurs */
#define E_AHI_TICK_TIMER_STOP (0x02) /* Stop timer when match occurs */
#define E_AHI_TICK_TIMER_CONT (0x03) /* Timer does not stop when match occurs */#define TRUE (1) /* page 207 K+R 2nd Edition */
#define FALSE (0)#define DELAY_TICK_TIME 16000000 /* 1s */
#define TICK_COUNT 16000 /* 1ms */#define LED2 (1 << 0)
#define LED3 (1 << 1)
#define LED4 (1 << 2)
#define LED5 (1 << 3)
#define LED6 (1 << 4)
#define LED8 (1 << 5)
#define LED_DIO ((1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) | (1 << 4) | (1 << 5))#define LED_ON(Led) vAHI_DioSetOutput(0, Led)
#define LED_OFF(Led) vAHI_DioSetOutput(Led, 0)
2、全局变量
PRIVATE uint8 u8Tick; /*滴答定时器中断次数*/
PRIVATE uint32 u32Second; /*秒数*/
3、滴答定时器初始化函数
PRIVATE void vTickTimerInit (void)
{vAHI_TickTimerConfigure(E_AHI_TICK_TIMER_DISABLE);/* 关闭滴答定时器*/vAHI_TickTimerWrite(0); /* 设置起始值*/vAHI_TickTimerInterval(TICK_COUNT * 10); /* 设置参照值 10ms*/vAHI_TickTimerConfigure(E_AHI_TICK_TIMER_RESTART); /* 重新开始计数*/vAHI_TickTimerRegisterCallback(vCbTickTimer); /* 注册中断回调*/vAHI_TickTimerIntEnable(TRUE); /* 启动*/
}
4、中断回调函数
PRIVATE void vCbTickTimer(uint32 u32Device, uint32 u32ItemBitmap)
{PRIVATE bool_t bLedStatus;if (++u8Tick > 99) { /*满一秒*/u8Tick = 0; /*重置计数次数*/++u32Second; /*秒++*/(bLedStatus = !bLedStatus) ? LED_ON(LED_DIO) : LED_OFF(LED_DIO);/* 每秒翻转一次输出*/}
}
5、完整代码
PRIVATE uint8 u8Tick; /*滴答定时器中断次数*/
PRIVATE uint32 u32Second; /*秒数*//*初始化IO*/
PRIVATE void vLedsInit (void)
{vAHI_DioSetDirection(0, LED_DIO);vAHI_DioSetPullup(LED_DIO, 0);
}
/*滴答定时器初始化*/
PRIVATE void vTickTimerInit (void)
{vAHI_TickTimerConfigure(E_AHI_TICK_TIMER_DISABLE); /* 关闭滴答定时器 */vAHI_TickTimerWrite(0); /* 设置起始值 */vAHI_TickTimerInterval(TICK_COUNT); /* 设置参照值 */vAHI_TickTimerConfigure(E_AHI_TICK_TIMER_RESTART); /* 重新开始计数 */vAHI_TickTimerRegisterCallback(vCbTickTimer); /* 注册中断回调 */vAHI_TickTimerIntEnable(TRUE); /* 启动 */
}
/*中断回调函数*/
PRIVATE void vCbTickTimer (uint32 u32Device, uint32 u32ItemBitmap)
{PRIVATE bool_t bLedStatus;if (++u8Tick > 99) {u8Tick = 0;++u32Second;(bLedStatus = !bLedStatus) ? LED_ON(LED_DIO) : LED_OFF(LED_DIO);/* 每秒翻转一次输出 */}
}
/*主函数*/
PUBLIC void AppColdStart (void)
{u8Tick = 0;u32Second = 0;vAHI_WatchdogStop();(void)u32AHI_Init();vLedsInit();vTickTimerInit();while (1) {vAHI_CpuDoze(); /* Doze*/}
}
/*热启动*/
PUBLIC void AppWarmStart (void)
{AppColdStart();
}
NXP JN5169滴答定时器中断回调函数相关推荐
- can通信中断和系统滴答定时器中断冲突的问题
我实现了两个SMT32之间的can通信,但是再加入新的系统滴答定时器后就崩溃了.现在的情况是这样的,下载了滴答定时器程序的那块板子可以像另一块板子发送数据,这没有问题.但是含有滴答定时器中断的板子在接 ...
- cube 设置滴答定时器_stm32cubemx生成的代码总是进入滴答定时器中断
最近stm32cubemx生成的代码总是进入滴答定时器中断,调了好长时间才发现,原来有好几个地方都在设置滴答定时器,最后我把 uint32_t HAL_SYSTICK_Config(uint32_t ...
- 【STM32】STM32之系统滴答定时器
本篇博文最后修改时间:2016年12月29日,01:06. 一.简介 本文介绍如何使用STM32的系统滴答定时器,以延时1S.10S为例. 二.实验平台 库版本:STM32F10x_StdPeriph ...
- SysTick系统滴答定时器(STM32F4xx系列)
定时器概念 1.1 定时器的含义 1.2片上外设的定时器 1.3定时/延时原理 系统滴答定时器 2.1 为什么需要系统滴答定时器 2.2 系统滴答定时器概述 2.3 系统滴答定时器框架 2.4 系统滴 ...
- 标准库滴答定时器的用法
#include " systick_driver.h"/*滴答定时器一毫米的延时*/ void SystickInit(void) {unsigned int ticks = 0 ...
- NXP JN5169使用滴答定时器进行精准延时
NXP JN5169使用滴答定时器进行精准延时(us.ms) 一.滴答定时器介绍 二.滴答定时器系统图 1.系统图介绍 2.单次触发模式 3.可重启模式 4.连续运行模式 三.系统时钟 1.系统时钟域 ...
- STM32系统滴答定时器(systick)应用
一:系统滴答定时器(systick) 1.systick介绍 Systick就是一个定时器而已,只是它放在了NVIC中,主要的目的是为了给操作系统提供一个硬件上的中断(号称滴答中断).滴答中断?这里来 ...
- stm32系统滴答定时器使用
STM32菜鸟成长记录---系统滴答定时器(systick)应用 标签: delay任务测试reference编译器工作 2012-08-19 22:55 47395人阅读 评论(4) 收藏 举 ...
- 定时器开始时延时了十几秒_第六章--系统滴答定时器
第六章--系统滴答定时器 简介:系统滴答定时器是内核(这里指M4)定时器使用的是内核时钟源168MZ或可以选择外部时钟源21MZ 应用场合: 为UCOS系统提供时钟节拍 作为简单的定时器延时使用 // ...
- 系统滴答定时器(systick)应用
1.systick介绍 Systick就是一个定时器而已,只是它放在了NVIC中,主要的目的是为了给操作系统提供一个硬件上的中断(号称滴答中断).滴答中断?这里来简单地解释一下.操作系统进行运转的时候 ...
最新文章
- XGBoost缺失值引发的问题及其深度分析 | CSDN博文精选
- getFields()和getDeclaredFields的区别
- OpenLayer + Ags 综合应用(一)--OpenLayer 地图展现
- python二十:内置函数
- 关于Integer类中parseInt()和valueOf()方法的区别以及int和String类性的转换.以及String类valueOf()方法...
- 远程拷贝、查看端口、vim常见快捷键、查找替换命令、grep命令、查看存储空间的命令、chkconfig命令、系统自动启动级别、主机名配置、IP地址配置、域名映射、防火墙设置
- c++判断正在使用的显卡_7°C警告:廉价硅脂害死显卡系列!还在用¥5块钱一大碗的导热膏吗...
- linux反序列化漏洞,Apache Camel Java对象反序列化漏洞(CVE-2015-5348)
- 计算机网络的abc类地址,abc类私有ip地址范围
- java 二叉树详解 + 实现代码
- 基于toolbox_calib工具箱的相机标定matlab仿真
- C# 如何批量删除Excel单元格中的公式只保留数据
- 命令提示符cmd查询IP地址时显示的各个值分别表示什么?
- 7-24 猜数字游戏 (15分)
- 利用Greenfoot制作简单的小游戏——记忆翻牌游戏(三)
- 第十一届蓝桥杯大赛软件类B组省赛题目(2020蓝桥杯)
- java监听微信_fastweixin: 极其方便的实现微信公众平台服务端开发,2行代码完成服务器绑定,3行代码实现用户消息监听...
- 实时空气质量监测解决方案
- 机器学习(19)之支持向量回归机
- 可视化搭建平台的参考网格线设计