您当前的位置: 首页 > 

仙剑情缘

暂无认证

  • 2浏览

    0关注

    333博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

NRF52832 GPIOTE OUTPUT使用

仙剑情缘 发布时间:2018-10-31 16:28:41 ,浏览量:2

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

 

 

关注
打赏
1658017818
查看更多评论
立即登录/注册

微信扫码登录

0.0383s