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); //启动定时器