小小张 发表于 2018-12-5 17:50:50

nrf51822 协议栈下的定时器配置

各位大佬,小弟最近小在带协议栈的代码里加个外设定时器功能可是事件不按照我设定的时间触发,代码如下:
uin32_t time_ms=1000;
const nrf_drv_timer_t TIMER_LED = NRF_DRV_TIMER_INSTANCE(1);
nrf_drv_timer_config_t timer_cfg=NRF_DRV_TIMER_DEFAULT_CONFIG(1);
err_code=nrf_drv_timer_init(&TIMER_LED, &timer_cfg, timer_led_event_handler);

    APP_ERROR_CHECK(err_code);
    time_ticks = nrf_drv_timer_ms_to_ticks(&TIMER_LED, time_ms);
printf("time_ticks %d\r\n",time_ticks);
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);
事件一直在触发

admin 发表于 2018-12-6 08:53:23

我们写了一篇专门的协议栈下硬件定时器的教材,你可以去看看,注意脉宽设置为32位的

小小张 发表于 2018-12-6 10:53:27

admin 发表于 2018-12-6 08:53
我们写了一篇专门的协议栈下硬件定时器的教材,你可以去看看,注意脉宽设置为32位的

我用的是sdk10,但是我是仿照SDK15教材做的,现在就是触发的时间跟我设定的不对

admin 发表于 2018-12-6 12:21:42

小小张 发表于 2018-12-6 10:53
我用的是sdk10,但是我是仿照SDK15教材做的,现在就是触发的时间跟我设定的不对

具有哪里不对,触发时间差多少?

小小张 发表于 2018-12-6 13:45:55

一直在触发(好像几毫秒就触发一次),我定义的是1秒触发一次。
#define NRF_DRV_TIMER_DEFAULT_CONFIG(id)                                              \
    {                                                                                 \
      .frequency          = (nrf_timer_frequency_t)NRF_TIMER_FREQ_16MHz,                           \
      .mode               = (nrf_timer_mode_t)NRF_TIMER_MODE_TIMER,                \
      .bit_width          = (nrf_timer_bit_width_t)NRF_TIMER_BIT_WIDTH_32,      \
      .interrupt_priority = APP_IRQ_PRIORITY_LOW,                        \
      .p_context          = NULL                                                    \
    }
如上的配置是我自己配置的。教程上的配置如下但是我没找到出处,我定义的是定时器1
   .frequency=(nrf_timer_frequency_t)NRFX_TIMER_DEFAULT_CONFIG_FREQUENCY,\
       .mode =(nrf_timer_mode_t)NRFX_TIMER_DEFAULT_CONFIG_MODE, \
       .bit_width =(nrf_timer_bit_width_t)NRFX_TIMER_DEFAULT_CONFIG_BIT_WIDTH,\
       .interrupt_priority=NRFX_TIMER_DEFAULT_CONFIG_IRQ_PRIORITY, \
       .p_context= NULL \

admin 发表于 2018-12-6 17:14:34

小小张 发表于 2018-12-6 13:45
一直在触发(好像几毫秒就触发一次),我定义的是1秒触发一次。
#define NRF_DRV_TIMER_DEFAULT_CONFIG(id ...

nrf51822下TIME1 只有16位位宽,TIME0有32位位宽,你可以改成16位或者用下TIM0试试

小小张 发表于 2018-12-7 14:38:41

admin 发表于 2018-12-6 17:14
nrf51822下TIME1 只有16位位宽,TIME0有32位位宽,你可以改成16位或者用下TIM0试试

我看教程上说的是协议栈下的定时器只能用TIME1或者TIME2,time0被占用了不能用了我改成16位还是不行,我觉得是不是时钟的问题啊!在协议栈下用定时器用的是外部16M的嘛

admin 发表于 2018-12-7 19:35:58

小小张 发表于 2018-12-7 14:38
我看教程上说的是协议栈下的定时器只能用TIME1或者TIME2,time0被占用了不能用了我改成16位还是不行,我觉 ...

教程讲的是52832

小小张 发表于 2018-12-10 17:46:48

admin 发表于 2018-12-7 19:35
教程讲的是52832

嗯,发现了是不是51822做不了硬件定时器,只能软件实现。

peteryu 发表于 2022-6-10 18:35:05

学习学习,学习学习。
页: [1]
查看完整版本: nrf51822 协议栈下的定时器配置