1.在sdk_config.h中加入宏
//
//==========================================================
#ifndef GPIOTE_ENABLED
#define GPIOTE_ENABLED 1
#endif
//
#ifndef GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS
#define GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS 4
#endif
//
// Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice
// <0=> 0 (highest)
// <1=> 1
// <2=> 2
// <3=> 3
// <4=> 4
// <5=> 5
// <6=> 6
// <7=> 7
#ifndef GPIOTE_CONFIG_IRQ_PRIORITY
#define GPIOTE_CONFIG_IRQ_PRIORITY 7
#endif
#ifndef PPI_ENABLED
#define PPI_ENABLED 1
#endif
//
//==========================================================
#ifndef TIMER_ENABLED
#define TIMER_ENABLED 1
#endif
//
// <0=> 16 MHz
// <1=> 8 MHz
// <2=> 4 MHz
// <3=> 2 MHz
// <4=> 1 MHz
// <5=> 500 kHz
// <6=> 250 kHz
// <7=> 125 kHz
// <8=> 62.5 kHz
// <9=> 31.25 kHz
#ifndef TIMER_DEFAULT_CONFIG_FREQUENCY
#define TIMER_DEFAULT_CONFIG_FREQUENCY 4
#endif
//
// <0=> Timer
// <1=> Counter
#ifndef TIMER_DEFAULT_CONFIG_MODE
#define TIMER_DEFAULT_CONFIG_MODE 0
#endif
//
// <0=> 16 bit
// <1=> 8 bit
// <2=> 24 bit
// <3=> 32 bit
#ifndef TIMER_DEFAULT_CONFIG_BIT_WIDTH
#define TIMER_DEFAULT_CONFIG_BIT_WIDTH 3
#endif
//
// Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice
// <0=> 0 (highest)
// <1=> 1
// <2=> 2
// <3=> 3
// <4=> 4
// <5=> 5
// <6=> 6
// <7=> 7
#ifndef TIMER_DEFAULT_CONFIG_IRQ_PRIORITY
#define TIMER_DEFAULT_CONFIG_IRQ_PRIORITY 6
#endif
#ifndef TIMER0_ENABLED
#define TIMER0_ENABLED 1
#endif
// TIMER1_ENABLED - Enable TIMER1 instance
#ifndef TIMER1_ENABLED
#define TIMER1_ENABLED 0
#endif
// TIMER2_ENABLED - Enable TIMER2 instance
#ifndef TIMER2_ENABLED
#define TIMER2_ENABLED 0
#endif
// TIMER3_ENABLED - Enable TIMER3 instance
#ifndef TIMER3_ENABLED
#define TIMER3_ENABLED 0
#endif
// TIMER4_ENABLED - Enable TIMER4 instance
#ifndef TIMER4_ENABLED
#define TIMER4_ENABLED 0
#endif
2.导入nrfx_ppi.c,nrfx_timer.c,nrfx_gpiote.c,nrf_drv_ppi.c到工程文件中
3.加入头文件
#include "nrf_drv_gpiote.h"
#include "nrf_drv_ppi.h"
#include "nrf_drv_timer.h"
4.定义定时器0实例
static nrf_drv_timer_t timer = NRF_DRV_TIMER_INSTANCE(0);
5.定时输出引脚
#define GPIO_OUTPUT_PIN_NUMBER 16 /**< Pin number for output. */
6.定义定时器事件,如果使能中断,则会调用
void timer_dummy_handler(nrf_timer_event_t event_type, void * p_context){
printf("timer_dummy_handler\n");
}
7.GPIOTE输出的相关初时化
static void led_blinking_setup()
{
uint32_t compare_evt_addr;
uint32_t gpiote_task_addr;
nrf_ppi_channel_t ppi_channel;
ret_code_t err_code;
nrf_drv_gpiote_out_config_t config = GPIOTE_CONFIG_OUT_TASK_TOGGLE(false);
err_code = nrf_drv_gpiote_out_init(GPIO_OUTPUT_PIN_NUMBER, &config); // P0_16 GPIOTE OUTPUT
APP_ERROR_CHECK(err_code);
nrf_drv_timer_extended_compare(&timer, (nrf_timer_cc_channel_t)0, 200 * 1000UL, NRF_TIMER_SHORT_COMPARE0_CLEAR_MASK, true); //false 不使用事件中断,true使用事件中断
err_code = nrf_drv_ppi_channel_alloc(&ppi_channel); //分配PPI通道
APP_ERROR_CHECK(err_code);
compare_evt_addr = nrf_drv_timer_event_address_get(&timer, NRF_TIMER_EVENT_COMPARE0); //获取定时器比较器0地址
gpiote_task_addr = nrf_drv_gpiote_out_task_addr_get(GPIO_OUTPUT_PIN_NUMBER); //获取GPIOTE输出任务地址
err_code = nrf_drv_ppi_channel_assign(ppi_channel, compare_evt_addr, gpiote_task_addr); //将相关事件,任务地址与PPI通道关联上
APP_ERROR_CHECK(err_code);
err_code = nrf_drv_ppi_channel_enable(ppi_channel); //使能PPI通道
APP_ERROR_CHECK(err_code);
nrf_drv_gpiote_out_task_enable(GPIO_OUTPUT_PIN_NUMBER); //使能GPIOTE任务
}
8.在主函数中初时化
uint32_t err_code;
err_code = nrf_drv_ppi_init(); //PPI初时化
APP_ERROR_CHECK(err_code);
if(!nrf_drv_gpiote_is_init())
{
err_code = nrf_drv_gpiote_init(); //GPIOTE初时化
APP_ERROR_CHECK(err_code);
}
nrf_drv_timer_config_t timer_cfg = NRF_DRV_TIMER_DEFAULT_CONFIG;
err_code = nrf_drv_timer_init(&timer, &timer_cfg, timer_dummy_handler); //定时器初时化
APP_ERROR_CHECK(err_code);
// Setup PPI channel with event from TIMER compare and task GPIOTE pin toggle.
led_blinking_setup();
// Enable timer
nrf_drv_timer_enable(&timer); //启动定时器