1.在sdk_config.h中加入宏
// GPIOTE_ENABLED - nrf_drv_gpiote - GPIOTE peripheral driver
//==========================================================
#ifndef GPIOTE_ENABLED
#define GPIOTE_ENABLED 1
#endif
// GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS - Number of lower power input pins
#ifndef GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS
#define GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS 4
#endif
// GPIOTE_CONFIG_IRQ_PRIORITY - Interrupt priority
// Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice
// 0 (highest)
// 1
// 2
// 3
// 4
// 5
// 6
// 7
#ifndef GPIOTE_CONFIG_IRQ_PRIORITY
#define GPIOTE_CONFIG_IRQ_PRIORITY 7
#endif
#ifndef PPI_ENABLED
#define PPI_ENABLED 1
#endif
// TIMER_ENABLED - nrf_drv_timer - TIMER periperal driver - legacy layer
//==========================================================
#ifndef TIMER_ENABLED
#define TIMER_ENABLED 1
#endif
// TIMER_DEFAULT_CONFIG_FREQUENCY - Timer frequency if in Timer mode
// 16 MHz
// 8 MHz
// 4 MHz
// 2 MHz
// 1 MHz
// 500 kHz
// 250 kHz
// 125 kHz
// 62.5 kHz
// 31.25 kHz
#ifndef TIMER_DEFAULT_CONFIG_FREQUENCY
#define TIMER_DEFAULT_CONFIG_FREQUENCY 4
#endif
// TIMER_DEFAULT_CONFIG_MODE - Timer mode or operation
// Timer
// Counter
#ifndef TIMER_DEFAULT_CONFIG_MODE
#define TIMER_DEFAULT_CONFIG_MODE 0
#endif
// TIMER_DEFAULT_CONFIG_BIT_WIDTH - Timer counter bit width
// 16 bit
// 8 bit
// 24 bit
// 32 bit
#ifndef TIMER_DEFAULT_CONFIG_BIT_WIDTH
#define TIMER_DEFAULT_CONFIG_BIT_WIDTH 3
#endif
// TIMER_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority
// Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice
// 0 (highest)
// 1
// 2
// 3
// 4
// 5
// 6
// 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); //启动定时器
