Nordic52810入门篇-定时器模块

一、前言背景

为了精确控制led周期闪烁,通过引入定时器中断来处理。看了数据手册和例程,发现Nordic有提供了两种截然不同的定时器应用方案

二、定时器归类

TIMER: 定时器外设,可以理解为硬件定时器(类似STM32的通用定时器),运行在高频时钟源上(HFCLK),两种工作模式,定时与计数(捕捉与比较);Nordic52810总共有三路定时器外设,TIMER0 TIMER1 TIMER1

  • 优点: 功能丰富,可配置高中断优先级,精确高
  • 缺点: 功耗较高

app_timer:定时模块,可以理解为软件定时器(软件模拟的定时器),基于低频时钟(32kHZ)RTC1,配合协议栈使用,当定时时间溢出时(timeout),会通过蓝牙协议栈回调预先配置好的函数接口

  • 优点:功耗极低(uA),可配置多个定时器中断(理论上RAM充裕的话,可以一直往队列里面插入)
  • 缺点:精度较低,最小计时精度为1ms,由于是软定时器,会被其他高优先级任务抢占,多多少少会被影响计时精度

三、接口讲解

考虑到功耗至上的原则,选择app_timer中断来控制LED灯光闪烁(这个精度也不需要太高)

协议栈运行前需要初始化app_timer模块

ret_code_t app_timer_init(void)
{
    // Stop RTC to prevent any running timers from expiring (in case of reinitialization)
    rtc1_stop();//先停止rtc1

    // Initialize operation queue
    m_op_queue.first           = 0;
    m_op_queue.last            = 0;
    m_op_queue.size            = APP_TIMER_CONFIG_OP_QUEUE_SIZE+1;//最大支持的队列大小,可根据实际应用需要调整宏

    mp_timer_id_head            = NULL;
    m_ticks_elapsed_q_read_ind  = 0;
    m_ticks_elapsed_q_write_ind = 0;

#if APP_TIMER_WITH_PROFILER
    m_max_user_op_queue_utilization   = 0;
#endif

    NVIC_ClearPendingIRQ(SWI_IRQn);//通过swi异常中断后来触发定时回调
    NVIC_SetPriority(SWI_IRQn, SWI_IRQ_PRI);
    NVIC_EnableIRQ(SWI_IRQn);

    rtc1_init(APP_TIMER_CONFIG_RTC_FREQUENCY);

    m_ticks_latest = rtc1_counter_get();

    return NRF_SUCCESS;
}

初始化软定时器模块后,需要进行定时器的创建,通过接口app_timer_create

ret_code_t app_timer_create(app_timer_id_t const *      p_timer_id,
                            app_timer_mode_t            mode,
                            app_timer_timeout_handler_t timeout_handler)
{
    // Check state and parameters
    VERIFY_MODULE_INITIALIZED();

    if (timeout_handler == NULL)//定时中断回调的函数,为空返回无效参数
    {
        return NRF_ERROR_INVALID_PARAM;
    }
    if (p_timer_id == NULL)//句柄,为空返回无效参数
    {
        return NRF_ERROR_INVALID_PARAM;
    }
    if (((timer_node_t*)*p_timer_id)->is_running)
    {
        return NRF_ERROR_INVALID_STATE;
    }

    timer_node_t * p_node     = (timer_node_t *)*p_timer_id;//保存到队列中
    p_node->is_running        = false;
    p_node->mode              = mode;
    p_node->p_timeout_handler = timeout_handler;
    return NRF_SUCCESS;
}

软定时器创建完成后,可通过模块启动接口app_timer_start使能定时,也可以通过app_timer_stop停止定时

四、代码实例

通过配置1秒重复触发回调进行led灯的翻转闪烁

APP_TIMER_DEF(led_timer_id);   //定义句柄

//定时器触发回调
static void led_callback(void * p_context)
{
    bsp_LedToggle(BSP_LED0);//翻转led
}

int main(void)
{
    app_timer_init();//初始化app_timer模块
    // Initialize.
    ble_stack_init();//初始化协议栈
    
    bsp_InitLED();//初始化led

    app_timer_create(&led_timer_id,APP_TIMER_MODE_REPEATED,led_callback);//注册句柄,重复触发,回调函数
    app_timer_start(led_timer_id,APP_TIMER_TICKS(1000), NULL); //1秒触发一次

    while(1);

}

五、备注

  • 未初始化app_timer的情况下进行创建定时器将会导致非法访问空指针,导致系统异常复位
  • 未创建定时器任务,调用开启、停止接口也会导致访问空指针,导致系统异常复位
  • 重复调用开启、停止接口,将会出现产生不可预知的结果
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: nrf52810开发指南-上册.pdf是一本非常详细的指南,可以帮助人们更好地了解和学习nrf52810无线芯片的开发和使用方法。该指南主要介绍了nrf52810的基本特性、硬件架构、软件开发环境、开发工具、编程语言、开发流程等方面的内容。 该指南以实例讲解的方式,详细介绍了如何使用nrf52810从事无线应用程序的开发。具体而言,该指南介绍了如何使用Keil MDK、IAR Embedded Workbench、SEGGER Embedded Studio等IDE工具,以及nrf5 SDK和nrf5x Command Line Tools等开发工具进行开发。 另外,该指南还分析了nrf52810在无线通讯中的应用场景,包括基于Bluetooth Low Energy(BLE)的智能家居、可穿戴设备等领域。通过实践和案例演示,读者能够深入了解nrf52810芯片的广泛应用前景。 总之,nrf52810开发指南-上册.pdf是一份非常有价值的指南,对于无线产品开发者和爱好者都有非常大的帮助,值得一读。 ### 回答2: nrf52810Nordic公司最新推出的低功耗蓝牙芯片,它采用ARM Cortex-M4处理器,拥有256KB的闪存和24KB的RAM,非常适合开发低功耗蓝牙设备。该芯片还支持Nordic公司自主开发的S132 SoftDevice协议栈,可以实现BLE4.2和BLE5.0的各种特性,如长包、扫描窗口等。 该开发指南共分为六个章节,第一章介绍了nrf52810芯片的主要特点,第二章讲解了如何使用开发板进行测试与调试,第三章介绍了如何使用nRF5 SDK和nRF5 SoftDevice进行开发,第四章讲解了如何使用Nordic公司的开发工具nRF Connect和Segger J-Link进行开发,第五章讲解了如何进行定制化开发,第六章则是常见问题解答与扩展阅读。 通过阅读该开发指南,开发者可以快速了解nrf52810芯片的各项特性,掌握开发与调试技巧,并且学会如何利用Nordic公司的各种开发工具进行开发。此外,该指南还提供了大量的编程示例和实验框图,可以帮助开发者快速上手并深入理解nrf52810的开发流程。 总之,nrf52810开发指南为开发低功耗蓝牙设备的开发者提供了全面且实用的开发指导,是一本非常优秀的开发书籍,值得大家阅读。 ### 回答3: nRF52810开发指南-上册是针对nRF52810芯片的开发指南,该芯片是由北欧半导体公司推出的低功耗蓝牙SoC芯片。本开发指南针对该芯片的主要功能特点和应用场景,提供了全面的技术说明和具体实践操作指引。 一方面,本开发指南详细介绍了nRF52810芯片的硬件架构和软件框架,包括CPU核心、内存、外设、通信接口等方面的详细说明,同时还介绍了nRF52810芯片的功耗特点和低功耗技术实现方法。这些内容对于硬件工程师和软件工程师来说都是非常重要的,可以帮助他们在设计和开发过程中更好地了解和掌握nRF52810芯片的内部结构和工作原理。 另一方面,本开发指南还提供了丰富的样例程序和实践案例,包括基于SDK的应用程序设计、BLE服务设计、无线OTA升级、传感器数据采集和处理等方面的实现方法和具体代码。这些实践案例不仅可以帮助读者更好地理解nRF52810芯片的使用方法和应用场景,还可以为实际应用开发提供有参考价值的实践经验。 总之,nRF52810开发指南-上册是一份非常优秀的技术文档,对于从事低功耗蓝牙应用开发的工程师和科研人员来说都是非常有价值的。它详细介绍了nRF52810芯片的设计和开发方法、低功耗技术实现方案,并提供了多个实践案例和具体的应用程序设计,为读者提供了全面且实用的技术指导。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值