To get started with Seeed Tiny BLE, include detecting motion, button and battery level.
Dependencies: BLE_API eMPL_MPU6050 mbed nRF51822
Diff: nRF51822/nordic-sdk/components/drivers_nrf/hal/nrf_gpiote.h
- Revision:
- 1:fc2f9d636751
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nRF51822/nordic-sdk/components/drivers_nrf/hal/nrf_gpiote.h Wed Apr 22 07:47:17 2015 +0000 @@ -0,0 +1,153 @@ +/* Copyright (c) 2012 Nordic Semiconductor. All Rights Reserved. + * + * The information contained herein is property of Nordic Semiconductor ASA. + * Terms and conditions of usage are described in detail in NORDIC + * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT. + * + * Licensees are granted free, non-transferable use of the information. NO + * WARRANTY of ANY KIND is provided. This heading must NOT be removed from + * the file. + * + */ +#ifndef NRF_GPIOTE_H__ +#define NRF_GPIOTE_H__ + +#include "nrf.h" + +/** +* @defgroup nrf_gpiote GPIOTE abstraction +* @{ +* @ingroup nrf_drivers +* @brief GPIOTE abstraction for configuration of channels. +*/ + + + /** + * @enum nrf_gpiote_polarity_t + * @brief Polarity for GPIOTE channel enumerator. + */ +typedef enum +{ + NRF_GPIOTE_POLARITY_LOTOHI = GPIOTE_CONFIG_POLARITY_LoToHi, ///< Low to high + NRF_GPIOTE_POLARITY_HITOLO = GPIOTE_CONFIG_POLARITY_HiToLo, ///< High to low + NRF_GPIOTE_POLARITY_TOGGLE = GPIOTE_CONFIG_POLARITY_Toggle ///< Toggle +} nrf_gpiote_polarity_t; + + + /** + * @enum nrf_gpiote_outinit_t + * @brief Initial output value for GPIOTE channel enumerator. + */ +typedef enum +{ + NRF_GPIOTE_INITIAL_VALUE_LOW = GPIOTE_CONFIG_OUTINIT_Low, ///< Low to high + NRF_GPIOTE_INITIAL_VALUE_HIGH = GPIOTE_CONFIG_OUTINIT_High ///< High to low +} nrf_gpiote_outinit_t; + + +/** + * @brief Function for configuring GPIOTE channel as output, setting the properly desired output level. + * + * + * @param channel_number specifies the GPIOTE channel [0:3] to configure as an output channel. + * @param pin_number specifies the pin number [0:30] to use in the GPIOTE channel. + * @param polarity specifies the desired polarity in the output GPIOTE channel. + * @param initial_value specifies the initial value of the GPIOTE channel input after the channel configuration. + */ +static __INLINE void nrf_gpiote_task_config(uint32_t channel_number, uint32_t pin_number, nrf_gpiote_polarity_t polarity, nrf_gpiote_outinit_t initial_value) +{ + /* Check if the output desired is high or low */ + if (initial_value == NRF_GPIOTE_INITIAL_VALUE_LOW) + { + /* Workaround for the OUTINIT PAN. When nrf_gpiote_task_config() is called a glitch happens + on the GPIO if the GPIO in question is already assigned to GPIOTE and the pin is in the + correct state in GPIOTE but not in the OUT register. */ + NRF_GPIO->OUTCLR = (1 << pin_number); + + /* Configure channel to Pin31, not connected to the pin, and configure as a tasks that will set it to proper level */ + NRF_GPIOTE->CONFIG[channel_number] = (GPIOTE_CONFIG_MODE_Task << GPIOTE_CONFIG_MODE_Pos) | + (31UL << GPIOTE_CONFIG_PSEL_Pos) | + (GPIOTE_CONFIG_POLARITY_HiToLo << GPIOTE_CONFIG_POLARITY_Pos); + } + else + { + /* Workaround for the OUTINIT PAN. When nrf_gpiote_task_config() is called a glitch happens + on the GPIO if the GPIO in question is already assigned to GPIOTE and the pin is in the + correct state in GPIOTE but not in the OUT register. */ + NRF_GPIO->OUTSET = (1 << pin_number); + + /* Configure channel to Pin31, not connected to the pin, and configure as a tasks that will set it to proper level */ + NRF_GPIOTE->CONFIG[channel_number] = (GPIOTE_CONFIG_MODE_Task << GPIOTE_CONFIG_MODE_Pos) | + (31UL << GPIOTE_CONFIG_PSEL_Pos) | + (GPIOTE_CONFIG_POLARITY_LoToHi << GPIOTE_CONFIG_POLARITY_Pos); + } + + /* Three NOPs are required to make sure configuration is written before setting tasks or getting events */ + __NOP(); + __NOP(); + __NOP(); + + /* Launch the task to take the GPIOTE channel output to the desired level */ + NRF_GPIOTE->TASKS_OUT[channel_number] = 1; + + + /* Finally configure the channel as the caller expects. If OUTINIT works, the channel is configured properly. + If it does not, the channel output inheritance sets the proper level. */ + NRF_GPIOTE->CONFIG[channel_number] = (GPIOTE_CONFIG_MODE_Task << GPIOTE_CONFIG_MODE_Pos) | + ((uint32_t)pin_number << GPIOTE_CONFIG_PSEL_Pos) | + ((uint32_t)polarity << GPIOTE_CONFIG_POLARITY_Pos) | + ((uint32_t)initial_value << GPIOTE_CONFIG_OUTINIT_Pos); + + /* Three NOPs are required to make sure configuration is written before setting tasks or getting events */ + __NOP(); + __NOP(); + __NOP(); +} + +/** + * @brief Function for configuring GPIOTE channel as input, automatically clearing an event that appears in some cases under configuration. + * + * Note that when configuring the channel as input an event might be triggered. Care of disabling interrupts + * for that channel is left to the user. + * + * @param channel_number specifies the GPIOTE channel [0:3] to configure as an input channel. + * @param pin_number specifies the pin number [0:30] to use in the GPIOTE channel. + * @param polarity specifies the desired polarity in the output GPIOTE channel. + */ +static __INLINE void nrf_gpiote_event_config(uint32_t channel_number, uint32_t pin_number, nrf_gpiote_polarity_t polarity) +{ + /* Configure the channel as the caller expects */ + NRF_GPIOTE->CONFIG[channel_number] = (GPIOTE_CONFIG_MODE_Event << GPIOTE_CONFIG_MODE_Pos) | + ((uint32_t)pin_number << GPIOTE_CONFIG_PSEL_Pos) | + ((uint32_t)polarity << GPIOTE_CONFIG_POLARITY_Pos); + + /* Three NOPs are required to make sure configuration is written before setting tasks or getting events */ + __NOP(); + __NOP(); + __NOP(); + + /* Clear the event that appears in some cases */ + NRF_GPIOTE->EVENTS_IN[channel_number] = 0; +} + + +/** + * @brief Function for unconfiguring GPIOTE channel. + * + * + * Note that when unconfiguring the channel, the pin is configured as GPIO PIN_CNF configuration. + * + * @param channel_number specifies the GPIOTE channel [0:3] to unconfigure. + */ +static __INLINE void nrf_gpiote_unconfig(uint32_t channel_number) +{ + /* Unonfigure the channel as the caller expects */ + NRF_GPIOTE->CONFIG[channel_number] = (GPIOTE_CONFIG_MODE_Disabled << GPIOTE_CONFIG_MODE_Pos) | + (31UL << GPIOTE_CONFIG_PSEL_Pos) | + (GPIOTE_CONFIG_POLARITY_Toggle << GPIOTE_CONFIG_POLARITY_Pos); +} + + +/** @} */ + +#endif \ No newline at end of file