nRF52840 APP_timer使用

APP_timer(软件定时器移植)

1.添加库文件Libraries和驱动文件

 

2.修改SDK_config.h

3.在keil里面定义全局宏

4.添加lfclk初始化
/**
 * @brief Function for starting lfclk needed by APP_TIMER.
 */
static void lfclk_init(void)
{
    uint32_t err_code;
    err_code = nrf_drv_clock_init();
    APP_ERROR_CHECK(err_code);

    nrf_drv_clock_lfclk_request(NULL);
}

 代码使用 

1.包含头文件

#include "app_timer.h"

2.定义一个定时器实例

APP_TIMER_DEF(s_testTimer);    // 定义软件定时器实例

5.函数

#include "app_timer.h"

APP_TIMER_DEF(s_testTimer);    // 定义软件定时器实例

lfclk_init();   //lfclk初始化

ret_code_t app_timer_init(void);    //soft timer初始化

/**@brief Timer modes. */
typedef enum
{
    APP_TIMER_MODE_SINGLE_SHOT,                 /**< The timer will expire only once. */
    APP_TIMER_MODE_REPEATED                     /**< The timer will restart each time it expires. */
} app_timer_mode_t;

/*
创建一个软件定时器
参数:
p_timer_id:        软件定时器实例
mode:              模式,单次还是循环周期
timeout_handler:   超时回调函数
*/
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);

/*
开启软件定时器
参数:
p_timer_id:        软件定时器实例
timeout_ticks:     超时时间
p_context:         设置为NULL
*/
ret_code_t app_timer_start(app_timer_id_t timer_id, uint32_t timeout_ticks, void * p_context);

//停止软件定时器
ret_code_t app_timer_stop(app_timer_id_t timer_id);

### nRF52840使用 FreeRTOS 和定时器 当在 nRF52840 设备上配置并使用 FreeRTOS 时,了解如何正确设置和管理定时器至关重要。这不仅涉及到硬件资源的有效利用,还关系到系统的稳定性和性能优化。 #### 配置 FreeRTOS 的基础架构 为了使 FreeRTOS 能够高效运作于 nRF52840 平台上,需先掌握其核心组件——任务(Task)、信号量(Semaphore)、互斥锁(Mutex)、事件标志组(Event Flags),以及队列(Queue)[^2]。这些机制共同作用以支持多线程编程环境下的进程间通信与同步操作。 #### 设置 HAL 基础时钟 尽管上述信息主要针对 STM32 系列微控制器,但在其他平台如 nRF52840 中也有相似考量。对于基于 ARM Cortex-M 架构的设备而言,推荐采用独立于 SysTick 外设的时间基准源来驱动操作系统调度程序;这样做可以避免因中断优先级冲突而导致潜在问题的发生[^1]。 #### 实现 APP 定时器模块初始化 下面展示了一段简单的 C++ 代码片段,用于演示如何初始化应用程序级别的计时服务: ```cpp // 初始化APP定时器模块 static void timers_init(void){ // 初始化APP定时器模块 ret_code_t err_code = app_timer_init(); // 检查返回值 APP_ERROR_CHECK(err_code); } ``` 此函数通过调用 `app_timer_init()` 来启动 SDK 提供的标准时间管理功能,并借助宏定义 `APP_ERROR_CHECK` 对可能产生的错误情况进行处理[^3]。 #### 创建自定义周期性回调任务 接下来是一个更具体的例子,它展示了怎样建立一个每秒触发一次的任务实例: ```c #include "nrf.h" #include "app_error.h" #include "app_timer.h" #define ONE_SECOND_IN_MS (uint32_t)(1000) void my_periodic_task(void * p_context) { // 用户定义的具体逻辑放在这里... } int main() { uint32_t err_code; // 初始化定时器子系统 timers_init(); // 注册新的定时器句柄 static app_timer_id_t periodic_timer_id; // 创建具有固定间隔重复执行特性的软件定时器 err_code = app_timer_create(&periodic_timer_id, APP_TIMER_MODE_REPEATED, my_periodic_task); APP_ERROR_CHECK(err_code); // 启动该定时器,设定初始延迟时间为零毫秒 err_code = app_timer_start(periodic_timer_id, APP_TIMER_TICKS(ONE_SECOND_IN_MS), NULL); APP_ERROR_CHECK(err_code); while(true) { __WFE(); // 进入等待状态直到被唤醒 } } ``` 这段代码实现了如下目标: - **timers_init()**: 如前所述完成必要的准备工作; - **my_periodic_task()**: 自定义的工作负载函数体; - **main()**: 主循环里包含了创建及激活指定频率(即一秒)下自动重启型软定时器的过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值