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滴答定时器中断回调函数相关推荐

  1. can通信中断和系统滴答定时器中断冲突的问题

    我实现了两个SMT32之间的can通信,但是再加入新的系统滴答定时器后就崩溃了.现在的情况是这样的,下载了滴答定时器程序的那块板子可以像另一块板子发送数据,这没有问题.但是含有滴答定时器中断的板子在接 ...

  2. cube 设置滴答定时器_stm32cubemx生成的代码总是进入滴答定时器中断

    最近stm32cubemx生成的代码总是进入滴答定时器中断,调了好长时间才发现,原来有好几个地方都在设置滴答定时器,最后我把 uint32_t HAL_SYSTICK_Config(uint32_t ...

  3. 【STM32】STM32之系统滴答定时器

    本篇博文最后修改时间:2016年12月29日,01:06. 一.简介 本文介绍如何使用STM32的系统滴答定时器,以延时1S.10S为例. 二.实验平台 库版本:STM32F10x_StdPeriph ...

  4. SysTick系统滴答定时器(STM32F4xx系列)

    定时器概念 1.1 定时器的含义 1.2片上外设的定时器 1.3定时/延时原理 系统滴答定时器 2.1 为什么需要系统滴答定时器 2.2 系统滴答定时器概述 2.3 系统滴答定时器框架 2.4 系统滴 ...

  5. 标准库滴答定时器的用法

    #include " systick_driver.h"/*滴答定时器一毫米的延时*/ void SystickInit(void) {unsigned int ticks = 0 ...

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

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

  7. STM32系统滴答定时器(systick)应用

    一:系统滴答定时器(systick) 1.systick介绍 Systick就是一个定时器而已,只是它放在了NVIC中,主要的目的是为了给操作系统提供一个硬件上的中断(号称滴答中断).滴答中断?这里来 ...

  8. stm32系统滴答定时器使用

     STM32菜鸟成长记录---系统滴答定时器(systick)应用 标签: delay任务测试reference编译器工作 2012-08-19 22:55 47395人阅读 评论(4) 收藏 举 ...

  9. 定时器开始时延时了十几秒_第六章--系统滴答定时器

    第六章--系统滴答定时器 简介:系统滴答定时器是内核(这里指M4)定时器使用的是内核时钟源168MZ或可以选择外部时钟源21MZ 应用场合: 为UCOS系统提供时钟节拍 作为简单的定时器延时使用 // ...

  10. 系统滴答定时器(systick)应用

    1.systick介绍 Systick就是一个定时器而已,只是它放在了NVIC中,主要的目的是为了给操作系统提供一个硬件上的中断(号称滴答中断).滴答中断?这里来简单地解释一下.操作系统进行运转的时候 ...

最新文章

  1. XGBoost缺失值引发的问题及其深度分析 | CSDN博文精选
  2. getFields()和getDeclaredFields的区别
  3. OpenLayer + Ags 综合应用(一)--OpenLayer 地图展现
  4. python二十:内置函数
  5. 关于Integer类中parseInt()和valueOf()方法的区别以及int和String类性的转换.以及String类valueOf()方法...
  6. 远程拷贝、查看端口、vim常见快捷键、查找替换命令、grep命令、查看存储空间的命令、chkconfig命令、系统自动启动级别、主机名配置、IP地址配置、域名映射、防火墙设置
  7. c++判断正在使用的显卡_7°C警告:廉价硅脂害死显卡系列!还在用¥5块钱一大碗的导热膏吗...
  8. linux反序列化漏洞,Apache Camel Java对象反序列化漏洞(CVE-2015-5348)
  9. 计算机网络的abc类地址,abc类私有ip地址范围
  10. java 二叉树详解 + 实现代码
  11. 基于toolbox_calib工具箱的相机标定matlab仿真
  12. C# 如何批量删除Excel单元格中的公式只保留数据
  13. 命令提示符cmd查询IP地址时显示的各个值分别表示什么?
  14. 7-24 猜数字游戏 (15分)
  15. 利用Greenfoot制作简单的小游戏——记忆翻牌游戏(三)
  16. 第十一届蓝桥杯大赛软件类B组省赛题目(2020蓝桥杯)
  17. java监听微信_fastweixin: 极其方便的实现微信公众平台服务端开发,2行代码完成服务器绑定,3行代码实现用户消息监听...
  18. 实时空气质量监测解决方案
  19. 机器学习(19)之支持向量回归机
  20. 可视化搭建平台的参考网格线设计

热门文章

  1. 纯HTML CSS制作导航栏 下拉菜单
  2. 使用强化学习评估训练数据,准确量化训练样本
  3. WDR7660虚拟服务器,TP-Link TL-WDR7660路由器怎么设置?
  4. 怎么用python画椭圆_python画椭圆
  5. java获取登录内网ip地址
  6. css选择文件的图片大小,怎么用css设置图片大小
  7. windows环境下定时进行阿里云DDNS解析
  8. 出大问题!苹果硅或许意味着Wintel时代的终结……
  9. C/C++编程:字符串拼接
  10. 如果你热爱编码,就应该少写代码