0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

定时模块app_timer用法及常见问题—nRF5 SDK模块系列二

jf_14701710 来源:jf_14701710 作者:jf_14701710 2025-05-12 16:13 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

app_timer是大家经常用到的一个库,app_timer的功能就是定时,也就是说,你在某一时刻启动一个app timer并设定超时时间,超时时间一到,app_timer就会回调timeout handler,然后执行你需要的工作。使用app_timer时有如下几点需要注意:

app_timer底层使用的是RTC1,而不是timer1/2/3/4,所以app_timer的功耗非常低:0.1uA左右。

app_timer计时精度为1ms,也就是说,app_timer只能计时毫秒的倍数,如果你的计时精度小于1ms,请使用传统timer1/2/3/4来做。

app_timer计时不是很准确。app_timer库可以创建几十甚至上百个app timer,每次start或者stop这些timer,都会对其他timer计时精度产生一些影响。而且app_timer的中断优先级也不高,所以timeout handler经常会被推迟执行。

启动或者停止app_timer都是异步的,也就是说,当调用app_timer_start或者app_timer_stop时,系统只是把start或者stop操作入队,然后触发一个软中断,如果此时上下文环境的中断优先级高于软中断,那么只有等退出了当前上下文环境后才会真正去执行软中断handler然后启动或者停止timer,这也是为什么app_timer模块需要一个operation queue,并通过APP_TIMER_CONFIG_OP_QUEUE_SIZE来配置其大小;如果此时上下文环境的优先级低于软中断,那么立即触发软中断handler并启动或者停止timer。

用法说明

一般按照如下步骤使用app_timer:

修改app_timer默认配置参数,如下:

wKgZO2ghrbCARrzpAAG2gMbkbPs301.png

创建app_timer。创建app timer时,先定义一个timer ID,用来表示这个timer,然后选择app timer模式:single shot或者repeated。Single shot模式app timer只运行一次,timeout后执行timeout handler然后自动停止app timer。Repeated模式app timer自动循环执行,每次timeout后执行timeout handler,然后继续计时,直到下一个timeout然后再次执行timeout handler,如此循环往复。创建app timer的时候,还需要定义timeout handler。

APP_TIMER_DEF(my_timer_id);   //定义timer ID

err_code = app_timer_create(&my_timer_id, APP_TIMER_MODE_REPEATED, my_timeout_handler)

static void my_timeout_handler (void * p_context)

{

       //add your code here

}

启动app_timer或者停止app_timer。前面也提及过,启动或者停止timer是异步的,所以我们有一个operation queue来存放start或者stop操作。真正的start或者stop操作是通过软中断0来实现的。

err_code = app_timer_start(my_timer_id, APP_TIMER_TICKS(10), NULL);  //启动timer并定时10ms

err_code = app_timer_stop(my_timer_id);

常见使用问题

目前看到的常见使用问题有:

没有按照使用说明来使用app_timer,比如定义app timer ID的时候不使用宏APP_TIMER_DEF,超时时间不使用宏APP_TIMER_TICKS来计算。

多次重复调用同一个app_timer_create。app_timer_create用于创建一个timer,多次调用同一个app_timer_create,会让系统产生多个相同ID的app timer,以致于系统出现不可知的行为。

Stop没有start的timer。当一个timer没有通过app_timer_start启动时,使用app_timer_stop停止它时,或者使用app_timer_stop停止一个不存在的timer时,会打乱app timer的正常行为,产生不可预测的结果。

Operation queue溢出。这个需要具体问题具体分析,有时候operation queue溢出不一定是因为queue size设置太小导致的,而是系统某个地方,确切说某个中断例程,执行时间太久,导致start和stop操作积累太多,从而产生queue溢出,这个时候就必须找出这个中断例程执行时间太久的原因,才能从根本上解决这个问题。

没有初始化app_scheduler,而直接使用app_timer的schedule模式。app_scheduler原理及使用说明见:https://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.sdk5.v15.3.0%2Flib_scheduler.html&cp=5_1_3_38,概括来说,app_scheduler的作用就是把长长的中断代码从中断函数转到main线程中来执行。


审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • SDK
    SDK
    +关注

    关注

    3

    文章

    1094

    浏览量

    51210
  • Nordic
    +关注

    关注

    9

    文章

    240

    浏览量

    48771
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    深度技术解析nRF Connect SDK裸机选项方案

    nRF Connect SDK的裸机选项基于经过市场验证的SoftDevice,这是预构建的低功耗蓝牙协议堆栈,该协议堆栈为大多数nRF5 SDK用户所熟悉,并由nrfx提供独立于
    发表于 10-31 23:11

    使用nRF52840芯片的USB Host 功能参考例程

    Host 示例 Nordic 的 nRF5 SDK(或 nRF Connect SDK,取决于你使用的开发框架)中包含专门的 USB Host 示例,路径通常如下:
    发表于 10-31 12:47

    深度技术解析低功耗蓝牙厂商nordic的nRF Connect SDK裸机选项方案

    : 基于nRF54L系列的裸机选项低功耗蓝牙开发 SoftDevice S115 仅支持外设角色,最多支持2个连接 与最新nRF5 SDK SoftDevice (v17)采用相同AP
    发表于 10-29 21:17

    nRF Connect SDK Basic

    用户在使用 nRF connect SDK 的时候经常会操作的外设有GPIO,I2C,SPI,UART。我们就以 nRF connect SDK 2.7.0 中的例程代码
    的头像 发表于 08-20 10:41 580次阅读
    <b class='flag-5'>nRF</b> Connect <b class='flag-5'>SDK</b> Basic

    Nordic nRF5 SDK和softdevice介绍

    里?Softdevice帮助文档在哪里?如何选择某个SDK例子 (example) 以开始我们的BLE开发之旅?本文将对以上问题进行解答。 Nordic目前有2套完全独立的SDKnRF5 S
    的头像 发表于 08-20 09:54 2632次阅读
    Nordic <b class='flag-5'>nRF5</b> <b class='flag-5'>SDK</b>和softdevice介绍

    如何调试nRF5 SDK

    本文将讲述Nordic nRF5 SDK的主要调试手段,以帮助大家快速定位问题,并解决问题。一般来说,你可以通过打log方式,IDE的debug模式,SDK自带的app_error_c
    的头像 发表于 06-24 08:59 528次阅读
    如何调试<b class='flag-5'>nRF5</b> <b class='flag-5'>SDK</b>

    nRF5 SDK软件架构及softdevice工作原理

    SDK,建议先看一下这篇文章“Nordic nRF5 SDK和softdevice介绍”,以建立Nordic nRF5 SDK的一些基本知
    的头像 发表于 06-23 11:08 526次阅读
    <b class='flag-5'>nRF5</b> <b class='flag-5'>SDK</b>软件架构及softdevice工作原理

    Nordic nRF51/nRF52开发流程说明

    51422/nRF51802等芯片,开发者可以按照如下流程去评估和开发nRF52/51应用解决方案。 如果你英文比较好的话,建议直接阅读Nordic官方的“nRF5 Getting Started”:https
    的头像 发表于 06-17 14:25 1042次阅读
    Nordic <b class='flag-5'>nRF</b>51/<b class='flag-5'>nRF</b>52开发流程说明

    Flash访问模块FDS用法常见问题nRF5 SDK模块系列

    模块是你最好的选择。FDS采用文件和记录方式来组织Flash数据,也就是说,真正的数据是放在一条记录中,而多条记录组成一个文件。根据应用的需要,整个系统可以只有一个文件,也可以包含多个文件。文件采用文件ID来标示,文件ID为2个字节(注:不能取值为0xFFFF)。一个文件下面可以放一条记录,
    的头像 发表于 05-12 15:59 1333次阅读
    Flash访问<b class='flag-5'>模块</b>FDS<b class='flag-5'>用法</b>及<b class='flag-5'>常见问题</b>—<b class='flag-5'>nRF5</b> <b class='flag-5'>SDK</b><b class='flag-5'>模块</b><b class='flag-5'>系列</b>一

    nRF Connect SDK(NCS)/Zephyr固件升级详解 – 重点讲述MCUboot和蓝牙空中升级

    编码如何解读?NCS可不可以进行单bank升级?可不可以把一个nRF5 SDK应用升级到NCS应用?MCUboot拷贝操作中的swap和overwrite有什么区别?为什么说MCUboot升级永远都不
    的头像 发表于 05-09 14:14 3020次阅读
    <b class='flag-5'>nRF</b> Connect <b class='flag-5'>SDK</b>(NCS)/Zephyr固件升级详解 – 重点讲述MCUboot和蓝牙空中升级

    如何调试nRF5 SDK

    本文将讲述Nordic nRF5 SDK的主要调试手段,以帮助大家快速定位问题,并解决问题。一般来说,你可以通过打log方式,IDE的debug模式,SDK自带的app_error_c
    发表于 04-26 23:13

    deepin 25系统安装常见问题

    随着 deepin 25 系列版本的发布,我们特别推出 deepin Q&A 常见问题指南,旨在帮助您轻松应对安装、升级及使用过程中可能遇到的常见问题
    的头像 发表于 04-14 14:08 4525次阅读
    deepin 25系统安装<b class='flag-5'>常见问题</b>

    STM32定时器基本原理及常见问题之培训资料

    STM32 定时器基本原理及常见问题之培训资料v3.10 时基单元、捕捉比较功能、主从触发与级联、案例分享 培训内容:
    发表于 04-08 16:26

    关于功率模块冷却的六个常见问题

    的寿命并使其发挥最佳性能。本文章将概述在为应用设计功率模块时可能出现的关于功率模块冷却的六个常见问题。1.器件温度是否均匀?功率晶体管和极管等功率元器件会产生局部热
    的头像 发表于 04-08 11:42 573次阅读
    关于功率<b class='flag-5'>模块</b>冷却的六个<b class='flag-5'>常见问题</b>

    蓝牙模块PTR5618性能、开发与应用解析

    J-Link驱动‌。 优先选择Nordic官方SDKnRF5 SDK)进行底层开发‌。 ‌六、互动讨论‌ ‌话题:你在PTR5618开发中遇到过哪些挑战?欢迎分享优化方案或替代型号推荐!‌ ‌声明:‌ 本文
    发表于 03-12 14:32