From 92883a23a3f4bae4e25bfb8f594c3f84cdca8695 Mon Sep 17 00:00:00 2001
From: Sam Calisch <s.calisch@gmail.com>
Date: Sun, 8 Oct 2017 15:03:51 -0400
Subject: [PATCH] added timer gpiote example

---
 modules/timer_gpiote/timer_gpiote.ino | 57 +++++++++++++++++++++++++++
 1 file changed, 57 insertions(+)
 create mode 100644 modules/timer_gpiote/timer_gpiote.ino

diff --git a/modules/timer_gpiote/timer_gpiote.ino b/modules/timer_gpiote/timer_gpiote.ino
new file mode 100644
index 0000000..a9a3649
--- /dev/null
+++ b/modules/timer_gpiote/timer_gpiote.ino
@@ -0,0 +1,57 @@
+//sec, 2017
+//adapted from https://devzone.nordicsemi.com/question/44628/maximum-clock-possible-on-gpio-pin-nrf51/
+
+#define TEST_PIN               0 //XL1
+#define GPIOTE_CHANNEL_NUMBER  0 
+
+void gpiote_init()
+{
+    //configure output and drive
+    NRF_GPIO->PIN_CNF[TEST_PIN] = 
+          ((GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos) & GPIO_PIN_CNF_DIR_Msk) | 
+          ((GPIO_PIN_CNF_INPUT_Disconnect << GPIO_PIN_CNF_INPUT_Pos) & GPIO_PIN_CNF_INPUT_Msk) | 
+          ((GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos) & GPIO_PIN_CNF_DRIVE_Msk);
+    NRF_GPIO->OUTCLR = (1 << TEST_PIN);  //low initial value
+
+    NRF_GPIOTE->TASKS_OUT[GPIOTE_CHANNEL_NUMBER] = 1;
+    NRF_GPIOTE->CONFIG[GPIOTE_CHANNEL_NUMBER] = (GPIOTE_CONFIG_MODE_Task << GPIOTE_CONFIG_MODE_Pos) |
+                               (TEST_PIN << GPIOTE_CONFIG_PSEL_Pos) |
+                               (GPIOTE_CONFIG_POLARITY_Toggle << GPIOTE_CONFIG_POLARITY_Pos) |
+                               (GPIOTE_CONFIG_OUTINIT_Low << GPIOTE_CONFIG_OUTINIT_Pos);
+    __NOP(); __NOP(); __NOP(); 
+}
+
+void timer2_init()
+{      
+    NRF_TIMER2->MODE = TIMER_MODE_MODE_Timer;       // Set the timer in Timer Mode.
+    NRF_TIMER2->PRESCALER = 0;                          
+    NRF_TIMER2->BITMODE = TIMER_BITMODE_BITMODE_16Bit; // 16 bit mode.
+    NRF_TIMER2->TASKS_CLEAR = 1;
+    NRF_TIMER2->CC[0] = 1;
+    NRF_TIMER2->EVENTS_COMPARE[0] = 0;
+    NRF_TIMER2->SHORTS = (TIMER_SHORTS_COMPARE0_CLEAR_Enabled << TIMER_SHORTS_COMPARE0_CLEAR_Pos);
+}
+
+void ppi_init()
+{
+    NRF_PPI->CH[0].EEP = (uint32_t)&NRF_TIMER2->EVENTS_COMPARE[0];
+    NRF_PPI->CH[0].TEP = (uint32_t)&NRF_GPIOTE->TASKS_OUT[GPIOTE_CHANNEL_NUMBER];
+    NRF_PPI->CHEN = (PPI_CHEN_CH0_Enabled << PPI_CHEN_CH0_Pos);     // Enable PPI channel 0
+}
+
+void setup(){
+    //Need to switch to internal LFCLK to disconnect from XL1 and XL2
+    NRF_CLOCK->LFCLKSRC = 0; //disconnect XL1 AND XL2 FROM LFCLK
+    NRF_CLOCK->EVENTS_LFCLKSTARTED = 0;
+    NRF_CLOCK->TASKS_LFCLKSTART    = 1;
+    while (NRF_CLOCK->EVENTS_LFCLKSTARTED == 0){}
+
+    timer2_init();
+    ppi_init();
+    gpiote_init();
+    NRF_TIMER2->TASKS_START = 1;
+    while(1){};
+}
+
+void loop(){}
+
-- 
GitLab