【nordic 52832】 创建精准时间定时器

转自:https://blog.csdn.net/gyb510/article/details/51842834/

nordic封装了定时器,操作起来没有STM32一样方便,本文教你如何做时间计时

nrf52832 有五个定时器,timer0--timer4 。因为SDK已经使用了timer0,所以如果使用了SDK,就不能再使用timer0,只能使用timer1--timer4。

开发环境:在ble_app_hrs   demo上添加定时器任务      参考timer这个demo。

本例使用timer1,并且修改为32bit模式,原版是16bit,不修改会导致及时不正常

 

添加步骤:

1、添加驱动文件    nrf_drv_timer.c      在协议栈中的目录位置 :   nRF52_SDK\components\drivers_nrf\timer文件夹下

2、mian.c中添加头文件nrf_drv_timer.h

#include "nrf_drv_timer.h"

3、main.c中添加timer结构体变量:

const nrf_drv_timer_t TIMER_LED = NRF_DRV_TIMER_INSTANCE(1);

4、在main.c中添加timer1 初始化函数以及定时任务处理函数:

/**
 * @brief Handler for timer events.
 */
void timer_led_event_handler(nrf_timer_event_t event_type, void* p_context)
{
   // uint32_t led_to_invert = (1 << leds_list[(i++) % LEDS_NUMBER]);
   // printf("6\n");
    switch(event_type)
    {
        case NRF_TIMER_EVENT_COMPARE0:
          //  LEDS_INVERT(led_to_invert);
                  ledFlash();
            
            break;
        
        default:
            //Do nothing.
            break;
    }    
}
 
 
void myTimerInit()
{
    uint32_t time_ms = 1000; //Time(in miliseconds) between consecutive compare events.
    uint32_t time_ticks;
    uint32_t err_code = NRF_SUCCESS;
    
    //Configure all leds on board.
 
    
    //Configure TIMER_LED for generating simple light effect - leds on board will invert his state one after the other.
    err_code = nrf_drv_timer_init(&TIMER_LED, NULL, timer_led_event_handler);
    APP_ERROR_CHECK(err_code);
    
    time_ticks = nrf_drv_timer_ms_to_ticks(&TIMER_LED, time_ms);
    
    nrf_drv_timer_extended_compare(
         &TIMER_LED, NRF_TIMER_CC_CHANNEL0, time_ticks, NRF_TIMER_SHORT_COMPARE0_CLEAR_MASK, true);
    
    nrf_drv_timer_enable(&TIMER_LED);
}


 
 


5、main函数中添加timer初始化调用:
    

myTimerInit();

6、在nrf_driver_config.c中修改timer1的定义:

#define TIMER1_ENABLED 1
 
#if (TIMER1_ENABLED == 1)
#define TIMER1_CONFIG_FREQUENCY    NRF_TIMER_FREQ_16MHz
#define TIMER1_CONFIG_MODE         TIMER_MODE_MODE_Timer
#define TIMER1_CONFIG_BIT_WIDTH    TIMER_BITMODE_BITMODE_32Bit
#define TIMER1_CONFIG_IRQ_PRIORITY APP_IRQ_PRIORITY_LOW


7.如何设置进入中断时间

在myTimerInit()内修改,这样不需要设置系统分频就可以计时了。

uint32_t time_ms = 1000;1000ms中断一次

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值