diff --git a/libraries/mbed/targets/cmsis/TARGET_NORDIC/TARGET_nRF51822/TOOLCHAIN_ARM_STD/startup_nRF51822.s b/libraries/mbed/targets/cmsis/TARGET_NORDIC/TARGET_nRF51822/TOOLCHAIN_ARM_STD/startup_nRF51822.s index f7f89f3f99..1d1581ab7e 100644 --- a/libraries/mbed/targets/cmsis/TARGET_NORDIC/TARGET_nRF51822/TOOLCHAIN_ARM_STD/startup_nRF51822.s +++ b/libraries/mbed/targets/cmsis/TARGET_NORDIC/TARGET_nRF51822/TOOLCHAIN_ARM_STD/startup_nRF51822.s @@ -100,8 +100,8 @@ NRF_POWER_RAMON_RAMxON_ONMODE_Msk EQU 0xF ; All RAM blocks on in onmod Reset_Handler PROC EXPORT Reset_Handler [WEAK] - IMPORT EnableSoftDevice IMPORT SystemInit + IMPORT EnableSoftDevice IMPORT __main LDR R0, =NRF_POWER_RAMON_ADDRESS LDR R2, [R0] diff --git a/libraries/mbed/targets/cmsis/TARGET_NORDIC/TARGET_nRF51822/system_nRF51822.c b/libraries/mbed/targets/cmsis/TARGET_NORDIC/TARGET_nRF51822/system_nRF51822.c index 8c063118f6..b8bc885228 100644 --- a/libraries/mbed/targets/cmsis/TARGET_NORDIC/TARGET_nRF51822/system_nRF51822.c +++ b/libraries/mbed/targets/cmsis/TARGET_NORDIC/TARGET_nRF51822/system_nRF51822.c @@ -37,11 +37,11 @@ static bool is_disabled_in_debug_needed(void); uint32_t SystemCoreClock __attribute__((used)) = __SYSTEM_CLOCK; #endif -static void softdevice_assertion_handler(uint32_t pc, uint16_t line_num, const uint8_t * file_name) -{ +//static void softdevice_assertion_handler(uint32_t pc, uint16_t line_num, const uint8_t * file_name) +//{ // UNUSED_PARAMETER(pc); // assert_nrf_callback(line_num, file_name); -} +//} void SystemCoreClockUpdate(void) @@ -72,11 +72,21 @@ void SystemInit(void) { NRF_MPU->DISABLEINDEBUG = MPU_DISABLEINDEBUG_DISABLEINDEBUG_Disabled << MPU_DISABLEINDEBUG_DISABLEINDEBUG_Pos; } + + // Start 16 MHz crystal oscillator. + NRF_CLOCK->EVENTS_HFCLKSTARTED = 0; + NRF_CLOCK->TASKS_HFCLKSTART = 1; + + // Wait for the external oscillator to start up. + while (NRF_CLOCK->EVENTS_HFCLKSTARTED == 0) + { + // Do nothing. + } } void EnableSoftDevice(void) { - sd_softdevice_enable(NRF_CLOCK_LFCLKSRC_XTAL_20_PPM, softdevice_assertion_handler); +// sd_softdevice_enable(NRF_CLOCK_LFCLKSRC_XTAL_20_PPM, softdevice_assertion_handler); } static bool is_manual_peripheral_setup_needed(void) diff --git a/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/PeripheralNames.h b/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/PeripheralNames.h index bd826de9ba..a4403cbf54 100644 --- a/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/PeripheralNames.h +++ b/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/PeripheralNames.h @@ -22,6 +22,10 @@ extern "C" { #endif +#define STDIO_UART_TX TX_PIN_NUMBER +#define STDIO_UART_RX RX_PIN_NUMBER +#define STDIO_UART UART_0 + typedef enum { UART_0 = (int)NRF_UART0_BASE } UARTName; @@ -33,10 +37,6 @@ typedef enum { SPIS = (int)NRF_SPIS1_BASE } SPIName; -#define STDIO_UART_TX TX_PIN_NUMBER -#define STDIO_UART_RX RX_PIN_NUMBER -#define STDIO_UART UART_0 - typedef enum { PWM_1 = 0, PWM_2 @@ -50,13 +50,7 @@ typedef enum { typedef enum { ADC0_0 = (int)NRF_ADC_BASE } ADCName; -/* -typedef enum { - DAC_0 = 0 -} DACName; - -*/ #ifdef __cplusplus } #endif diff --git a/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/PinNames.h b/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/PinNames.h index 9ed9fe49fc..5a5485359e 100644 --- a/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/PinNames.h +++ b/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/PinNames.h @@ -63,6 +63,42 @@ typedef enum { p30=30, // p31=31, + P0_0 = p0, + P0_1 = p1, + P0_2 = p2, + P0_3 = p3, + P0_4 = p4, + P0_5 = p5, + P0_6 = p6, + P0_7 = p7, + + P1_0 = p8, + P1_1 = p9, + P1_2 = p10, + P1_3 = p11, + P1_4 = p12, + P1_5 = p13, + P1_6 = p14, + P1_7 = p15, + + P2_0 = p16, + P2_1 = p17, + P2_2 = p18, + P2_3 = p19, + P2_4 = p20, + P2_5 = p21, + P2_6 = p22, + P2_7 = p23, + + P3_0 = p24, + P3_1 = p25, + P3_2 = p26, + P3_3 = p27, + P3_4 = p28, + P3_5 = p29, + P3_6 = p30, + //P3_7 = p31, + LED_START = p18, LED_STOP = p19, LED1 = LED_START, @@ -82,20 +118,20 @@ typedef enum { USBTX = TX_PIN_NUMBER, USBRX = RX_PIN_NUMBER, - - SPI_PSELSCK0 = p25, + SPI_PSELMOSI0 = p20, SPI_PSELMISO0 = p22, SPI_PSELSS0 = p24, + SPI_PSELSCK0 = p25, + + SPI_PSELMOSI1 = p12, + SPI_PSELMISO1 = p13, + SPI_PSELSS1 = p14, + SPI_PSELSCK1 = p15, - SPI_PSELSCK1 = p29, - SPI_PSELMOSI1 = p21, - SPI_PSELMISO1 = p23, - SPI_PSELSS1 = p28, - - SPIS_PSELMISO = p12, - SPIS_PSELSS = p13, - SPIS_PSELMOSI = p14, + SPIS_PSELMOSI = p12, + SPIS_PSELMISO = p13, + SPIS_PSELSS = p14, SPIS_PSELSCK = p15, // Not connected diff --git a/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/analogin_api.c b/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/analogin_api.c index 9277305a59..9627037f3f 100644 --- a/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/analogin_api.c +++ b/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/analogin_api.c @@ -22,9 +22,7 @@ #define ADC_10BIT_RANGE 0x3FF -static inline int div_round_up(int x, int y) { - return (x + (y - 1)) / y; -} +#define ADC_RANGE ADC_10BIT_RANGE static const PinMap PinMap_ADC[] = { // {p26, ADC0_0, 1}, @@ -38,15 +36,14 @@ static const PinMap PinMap_ADC[] = { {NC , NC , 0} }; -#define ADC_RANGE ADC_10BIT_RANGE - void analogin_init(analogin_t *obj, PinName pin) { - obj->adc = (NRF_ADC_Type *) ((ADCName)pinmap_peripheral(pin, PinMap_ADC)); + obj->adc = (ADCName)((NRF_ADC_Type *)pinmap_peripheral(pin, PinMap_ADC)); if (obj->adc == (ADCName)NC) { error("ADC pin mapping failed"); } + int analogInputPin=0; - PinMap *map = PinMap_ADC; + const PinMap *map = PinMap_ADC; while (map->pin != NC) { if (map->pin == pin){ analogInputPin = map->function; @@ -63,7 +60,6 @@ void analogin_init(analogin_t *obj, PinName pin) { (ADC_CONFIG_EXTREFSEL_None << ADC_CONFIG_EXTREFSEL_Pos); } - uint16_t analogin_read_u16(analogin_t *obj) { NRF_ADC->TASKS_START = 1; while (((NRF_ADC->BUSY & ADC_BUSY_BUSY_Msk) >> ADC_BUSY_BUSY_Pos) == ADC_BUSY_BUSY_Busy) diff --git a/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/device.h b/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/device.h index 6f4a71f842..001b6835e2 100644 --- a/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/device.h +++ b/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/device.h @@ -51,8 +51,6 @@ #define DEVICE_STDIO_MESSAGES 0 -//#define DEVICE_ERROR_RED 0 - #include "objects.h" #endif diff --git a/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/gpio_api.c b/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/gpio_api.c index b794e05bbe..f21330dea6 100644 --- a/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/gpio_api.c +++ b/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/gpio_api.c @@ -25,15 +25,13 @@ void gpio_init(gpio_t *obj, PinName pin, PinDirection direction) { if(pin == NC) return; obj->pin = pin; - obj->mask = (1<mask = (1<> PORT_SHIFT; - - // FGPIO_Type *reg = (FGPIO_Type *)(FPTA_BASE + port * 0x40); - obj->reg_set = &NRF_GPIO->OUTSET;// ®->PSOR; - obj->reg_clr = &NRF_GPIO->OUTCLR;//®->PCOR; - obj->reg_in = &NRF_GPIO->IN;//®->PDIR; - obj->reg_dir = &NRF_GPIO->DIR;//®->PDDR; + unsigned int port = (unsigned int)pin/8; + obj->reg_set = &NRF_GPIO->OUTSET; + obj->reg_clr = &NRF_GPIO->OUTCLR; + obj->reg_in = &NRF_GPIO->IN; + obj->reg_dir = &NRF_GPIO->DIR; gpio_dir(obj, direction); switch (direction) { @@ -63,15 +61,4 @@ void gpio_dir(gpio_t *obj, PinDirection direction) { break; } } -/* -void gpio_write(gpio_t *obj, int value) { - if (value) - *obj->reg_set = obj->mask; - else - *obj->reg_clr = obj->mask; -} - -int gpio_read(gpio_t *obj) { - return ((*obj->reg_in & obj->mask) ? 1 : 0); -}*/ diff --git a/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/gpio_irq_api.c b/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/gpio_irq_api.c index 3fe31e37d2..0e4a4babcf 100644 --- a/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/gpio_irq_api.c +++ b/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/gpio_irq_api.c @@ -27,48 +27,34 @@ static uint32_t portRISE= 0; static uint32_t portFALL= 0; static gpio_irq_handler irq_handler; -volatile uint32_t oldPortValue; -static int test=0; - void GPIOTE_IRQHandler(void) { - volatile uint32_t newVal = NRF_GPIO->IN; - if ((NRF_GPIOTE->EVENTS_PORT != 0) && ((NRF_GPIOTE->INTENSET & GPIOTE_INTENSET_PORT_Msk) != 0)){ - //NRF_GPIOTE->INTENSET &= ~(GPIOTE_INTENSET_PORT_Enabled<IN; + if ((NRF_GPIOTE->EVENTS_PORT != 0) && ((NRF_GPIOTE->INTENSET & GPIOTE_INTENSET_PORT_Msk) != 0)){ NRF_GPIOTE->EVENTS_PORT = 0; for(uint8_t i=0;i<31;i++) { - if(channel_ids[i]>0){ - if((portRISE>>i)&1){ - if(((newVal>>i)&1) && ((oldPortValue>>i)&1)==0 ){// - if(channel_enabled[i]){ - irq_handler(channel_ids[i], IRQ_RISE); - } - NRF_GPIO->PIN_CNF[i] &= ~(GPIO_PIN_CNF_SENSE_Msk); - NRF_GPIO->PIN_CNF[i] |= (GPIO_PIN_CNF_SENSE_Low << GPIO_PIN_CNF_SENSE_Pos) ; - } - else if(((newVal>>i)&1)==0 && ((NRF_GPIO->PIN_CNF[i] >>GPIO_PIN_CNF_SENSE_Pos)&GPIO_PIN_CNF_SENSE_Low) == GPIO_PIN_CNF_SENSE_Low){ - NRF_GPIO->PIN_CNF[i] &= ~(GPIO_PIN_CNF_SENSE_Msk); - NRF_GPIO->PIN_CNF[i] |= (GPIO_PIN_CNF_SENSE_High << GPIO_PIN_CNF_SENSE_Pos) ; - } - } - else if((portFALL>>i)&1){ - if(((oldPortValue>>i)&1) && ((newVal>>i)&1)==0 ){ - if(channel_enabled[i]){ + if(channel_ids[i]>0){ + if(channel_enabled[i]){ + if(((newVal>>i)&1) && ((NRF_GPIO->PIN_CNF[i] >>GPIO_PIN_CNF_SENSE_Pos)&GPIO_PIN_CNF_SENSE_Low) != GPIO_PIN_CNF_SENSE_Low && (portRISE>>i)&1){ + irq_handler(channel_ids[i], IRQ_RISE); + } + else if( ((newVal>>i)&1)==0&& ((NRF_GPIO->PIN_CNF[i] >>GPIO_PIN_CNF_SENSE_Pos)&GPIO_PIN_CNF_SENSE_Low) == GPIO_PIN_CNF_SENSE_Low && (portFALL>>i)&1){ irq_handler(channel_ids[i], IRQ_FALL); - } - NRF_GPIO->PIN_CNF[i] &= ~(GPIO_PIN_CNF_SENSE_Msk); - NRF_GPIO->PIN_CNF[i] |= (GPIO_PIN_CNF_SENSE_High << GPIO_PIN_CNF_SENSE_Pos) ; - } - else if(((newVal>>i)&1) && ((NRF_GPIO->PIN_CNF[i] >>GPIO_PIN_CNF_SENSE_Pos)&GPIO_PIN_CNF_SENSE_Low) != GPIO_PIN_CNF_SENSE_Low){ - NRF_GPIO->PIN_CNF[i] &= ~(GPIO_PIN_CNF_SENSE_Msk); + } + } + if(NRF_GPIO->PIN_CNF[i] &GPIO_PIN_CNF_SENSE_Msk) + { + NRF_GPIO->PIN_CNF[i] &= ~(GPIO_PIN_CNF_SENSE_Msk); + if(newVal>>i &1){ NRF_GPIO->PIN_CNF[i] |= (GPIO_PIN_CNF_SENSE_Low << GPIO_PIN_CNF_SENSE_Pos) ; } + else{ + NRF_GPIO->PIN_CNF[i] |= (GPIO_PIN_CNF_SENSE_High << GPIO_PIN_CNF_SENSE_Pos) ; + } } } - } - oldPortValue = newVal; - //NRF_GPIOTE->INTENSET = GPIOTE_INTENSET_PORT_Enabled<ch = pin; - oldPortValue = NRF_GPIO->IN; - - //NVIC_DisableIRQ(GPIOTE_IRQn); - NRF_GPIOTE->EVENTS_PORT = 0; - NRF_GPIOTE->INTENSET = GPIOTE_INTENSET_PORT_Set<EVENTS_PORT = 0; channel_ids[pin]=id; channel_enabled[pin]=1; + NRF_GPIOTE->INTENSET = GPIOTE_INTENSET_PORT_Set<ch); - portFALL &=~(1<ch); + NRF_GPIO->PIN_CNF[obj->ch] &= ~(GPIO_PIN_CNF_SENSE_Msk); if(enable){ if(event == IRQ_RISE){ portRISE |=(1<ch); - NRF_GPIO->PIN_CNF[obj->ch] &= ~(GPIO_PIN_CNF_SENSE_Msk);// | GPIO_PIN_CNF_PULL_Msk); - NRF_GPIO->PIN_CNF[obj->ch] |= (GPIO_PIN_CNF_SENSE_High << GPIO_PIN_CNF_SENSE_Pos) ;//| (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos); } else if(event == IRQ_FALL){ portFALL |=(1<ch); - NRF_GPIO->PIN_CNF[obj->ch] &= ~(GPIO_PIN_CNF_SENSE_Msk );//| GPIO_PIN_CNF_PULL_Msk); - NRF_GPIO->PIN_CNF[obj->ch] |= (GPIO_PIN_CNF_SENSE_Low << GPIO_PIN_CNF_SENSE_Pos);// | (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos); + } + } + else{ + if(event == IRQ_RISE){ + portRISE &=~(1<ch); } - } - oldPortValue = NRF_GPIO->IN; + else if(event == IRQ_FALL){ + portFALL &=~(1<ch); + } + + } + if( (portRISE>>obj->ch) || (portFALL>>obj->ch) ) + { + if((NRF_GPIO->IN>>obj->ch)&1) + { + NRF_GPIO->PIN_CNF[obj->ch] |= (GPIO_PIN_CNF_SENSE_Low << GPIO_PIN_CNF_SENSE_Pos);// | (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos); + + } + else{ + NRF_GPIO->PIN_CNF[obj->ch] |= (GPIO_PIN_CNF_SENSE_High << GPIO_PIN_CNF_SENSE_Pos) ;//| (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos); + } + } } void gpio_irq_enable(gpio_irq_t *obj) { diff --git a/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/i2c_api.c b/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/i2c_api.c index 00798598c6..36bcb44f01 100644 --- a/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/i2c_api.c +++ b/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/i2c_api.c @@ -19,16 +19,18 @@ #include "error.h" -/* + static const PinMap PinMap_I2C_SDA[] = { - {p9, I2C_0, 1}, + {p22, I2C_0, 1}, + {p13, I2C_1, 2}, {NC , NC , 0} }; static const PinMap PinMap_I2C_SCL[] = { - {p8, I2C_0, 1}, + {p20, I2C_0, 1}, + {p15, I2C_1, 2}, {NC , NC, 0} -};*/ +}; uint8_t I2C_USED[] = {0,0}; uint8_t addrSet=0; void i2c_interface_enable(i2c_t *obj) @@ -57,9 +59,11 @@ void twi_master_init(i2c_t *obj, PinName sda, PinName scl, int frequency) { } void i2c_init(i2c_t *obj, PinName sda, PinName scl) { // determine the SPI to use - // I2CName i2c_sda = (I2CName)pinmap_peripheral(sda, PinMap_I2C_SDA); - // I2CName i2c_scl = (I2CName)pinmap_peripheral(scl, PinMap_I2C_SCL); - if(I2C_USED[0]){ + I2CName i2c_sda = (I2CName)pinmap_peripheral(sda, PinMap_I2C_SDA); + I2CName i2c_scl = (I2CName)pinmap_peripheral(scl, PinMap_I2C_SCL); + I2CName i2c = (I2CName)pinmap_merge(i2c_sda,i2c_scl); + obj->i2c = (NRF_TWI_Type *)i2c; + /*if(I2C_USED[0]){ if(I2C_USED[1]){ error("All TWI peripherals in use."); } @@ -68,7 +72,7 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl) { } else{ obj->i2c = (NRF_TWI_Type *)I2C_0; - } + }*/ if ((int)obj->i2c == NC) { error("I2C pin mapping failed"); @@ -185,20 +189,6 @@ int checkError(i2c_t *obj) return 0; } -// The I2C does a read or a write as a whole operation -// There are two types of error conditions it can encounter -// 1) it can not obtain the bus -// 2) it gets error responses at part of the transmission -// -// We tackle them as follows: -// 1) we retry until we get the bus. we could have a "timeout" if we can not get it -// which basically turns it in to a 2) -// 2) on error, we use the standard error mechanisms to report/debug -// -// Therefore an I2C transaction should always complete. If it doesn't it is usually -// because something is setup wrong (e.g. wiring), and we don't need to programatically -// check for that - int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) { int status,count; obj->i2c->ADDRESS = (address>>1); @@ -217,11 +207,6 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) { } } - /*status = i2c_do_read(obj,&data[length-2], 1); - if (status) { - i2c_reset(obj); - return length - 2; - }*/ // read in last byte status = i2c_do_read(obj,&data[length-1], 1); if (status) { diff --git a/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/pinmap.c b/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/pinmap.c index dc71c2c35a..3d66cacc6a 100644 --- a/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/pinmap.c +++ b/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/pinmap.c @@ -25,12 +25,6 @@ void pin_mode(PinName pin, PinMode mode) { uint32_t pin_number = (uint32_t)pin; - + NRF_GPIO->PIN_CNF[pin_number] &= ~GPIO_PIN_CNF_PULL_Msk; NRF_GPIO->PIN_CNF[pin_number] |= (mode<PIN_CNF[pin_number] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) - | (GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos) - | (mode << GPIO_PIN_CNF_PULL_Pos) - | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos);*/ \ No newline at end of file +} \ No newline at end of file diff --git a/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/port_api.c b/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/port_api.c index 9a497b8e34..1859996948 100644 --- a/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/port_api.c +++ b/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/port_api.c @@ -28,14 +28,6 @@ void port_init(port_t *obj, PortName port, int mask, PinDirection dir) { obj->reg_out = &NRF_GPIO->OUT; obj->reg_in = &NRF_GPIO->IN; obj->reg_cnf = NRF_GPIO->PIN_CNF; - - uint32_t i; - // The function is set per pin: reuse gpio logic - /* for (i=0; i<32; i++) { - if (obj->mask & (1<port, i)); - } - }*/ port_dir(obj, dir); } diff --git a/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/serial_api.c b/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/serial_api.c index 7efbb50ba3..250c79889b 100644 --- a/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/serial_api.c +++ b/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/serial_api.c @@ -57,12 +57,9 @@ void serial_init(serial_t *obj, PinName tx, PinName rx) { //pin configurations -- //outputs - //nrf_gpio_cfg_output(TX_PIN_NUMBER); NRF_GPIO->DIR |= (1<DIR |= (1<DIR &= ~(1<DIR &= ~(1<uart->PSELCTS = CTS_PIN_NUMBER; obj->uart->PSELRXD = rx;//RX_PIN_NUMBER; - - // LPC_SYSCON->SYSAHBCLKCTRL |= (1<<12); - - //disconnect USBTX/RX mapping mux, for case when switching ports - //pin_function(USBTX, 0); - //pin_function(USBRX, 0); // set default baud rate and format @@ -87,9 +78,6 @@ void serial_init(serial_t *obj, PinName tx, PinName rx) { obj->uart->TASKS_STARTTX = 1; obj->uart->TASKS_STARTRX = 1; obj->uart->EVENTS_RXDRDY =0; - // pinout the chosen uart - // pinmap_pinout(tx, PinMap_UART_TX); - // pinmap_pinout(rx, PinMap_UART_RX); // set rx/tx pins in PullUp mode pin_mode(tx, PullUp); @@ -144,8 +132,7 @@ void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_b obj->uart->CONFIG = (UART_CONFIG_PARITY_Included<uart->CONFIG |= (UART_CONFIG_HWFC_Enabled << UART_CONFIG_HWFC_Pos); + //no Flow Control } //****************************************************************************** @@ -164,7 +151,7 @@ static inline void uart_irq(uint32_t iir, uint32_t index) { irq_handler(serial_irq_ids[index], irq_type); } -void uart0_irq() +void UART0_IRQHandler() { uint32_t irtype =0; if(NRF_UART0->EVENTS_TXDRDY) @@ -188,32 +175,22 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) { } if (enable) { - switch (irq) { - case RxIrq:// obj->uart->INTEN |= (UART_INTENSET_RXDRDY_Msk); - obj->uart->INTENSET |= (UART_INTENSET_RXDRDY_Msk); - break; - - case TxIrq: //obj->uart->INTEN |= (UART_INTENSET_TXDRDY_Msk); - obj->uart->INTENSET |= (UART_INTENSET_TXDRDY_Msk); - break; - } - // NVIC_SetVector(irq_n, vector); - NVIC_EnableIRQ(irq_n); - } else { // disable - int all_disabled = 0; - switch (irq) { - case RxIrq: //obj->uart->INTEN &= ~(UART_INTENSET_RXDRDY_Msk); - obj->uart->INTENSET &= ~(UART_INTENSET_RXDRDY_Msk); + case RxIrq: obj->uart->INTENSET |= (UART_INTENSET_RXDRDY_Msk);break; + case TxIrq: obj->uart->INTENSET |= (UART_INTENSET_TXDRDY_Msk);break; + } + NVIC_EnableIRQ(irq_n); + } + else { // disable + int all_disabled = 0; + switch (irq) { + case RxIrq: obj->uart->INTENSET &= ~(UART_INTENSET_RXDRDY_Msk); all_disabled = (obj->uart->INTENSET& (UART_INTENSET_TXDRDY_Msk))==0; - break; - case TxIrq://obj->uart->INTEN &= ~(UART_INTENSET_TXDRDY_Msk); - obj->uart->INTENSET &= ~(UART_INTENSET_TXDRDY_Msk); + case TxIrq: obj->uart->INTENSET &= ~(UART_INTENSET_TXDRDY_Msk); all_disabled = (obj->uart->INTENSET& (UART_INTENSET_RXDRDY_Msk))==0; break; } - if (all_disabled) NVIC_DisableIRQ(irq_n); } @@ -224,16 +201,14 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) { //****************************************************************************** int serial_getc(serial_t *obj) { while (!serial_readable(obj)); - obj->uart->EVENTS_RXDRDY = 0; return (uint8_t)obj->uart->RXD; } void serial_putc(serial_t *obj, int c) { - obj->uart->TXD = (uint8_t)c; - while (!serial_writable(obj)); - obj->uart->EVENTS_TXDRDY =0; + while (!serial_writable(obj)); + obj->uart->EVENTS_TXDRDY =0; } int serial_readable(serial_t *obj) { @@ -244,18 +219,11 @@ int serial_writable(serial_t *obj) { return (obj->uart->EVENTS_TXDRDY ==1); } -void serial_clear(serial_t *obj) { -} - -void serial_pinout_tx(PinName tx) { - // pinmap_pinout(tx, PinMap_UART_TX); - //obj->uart->PSELTXD = (1<uart->LCR |= (1 << 6); + obj->uart->TASKS_SUSPEND = 1; } void serial_break_clear(serial_t *obj) { - // obj->uart->LCR &= ~(1 << 6); -} + obj->uart->TASKS_STARTTX = 1; + obj->uart->TASKS_STARTRX = 1; +} \ No newline at end of file diff --git a/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/sleep.c b/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/sleep.c new file mode 100644 index 0000000000..a64ecccb79 --- /dev/null +++ b/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/sleep.c @@ -0,0 +1,38 @@ +/* mbed Microcontroller Library + * Copyright (c) 2006-2013 ARM Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include "sleep_api.h" +#include "cmsis.h" +#include "mbed_interface.h" + +void sleep(void) { + // ensure debug is disconnected if semihost is enabled.... + // mbed_interface_disconnect(); + + NRF_POWER->TASKS_LOWPWR=1; + SCB->SCR &= ~SCB_SCR_SLEEPDEEP_Msk; + + // wait for interrupt + __WFI(); +} + +void deepsleep(void) { + + // PCON[PD] set to deepsleep + // sleep(); + NRF_POWER->TASKS_LOWPWR=1; + SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; + __WFI(); +} diff --git a/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/us_ticker.c b/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/us_ticker.c index 70113a611e..80329a8a4b 100644 --- a/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/us_ticker.c +++ b/libraries/mbed/targets/hal/TARGET_NORDIC/TARGET_nRF51822/us_ticker.c @@ -23,7 +23,7 @@ int us_ticker_inited = 0; volatile uint16_t overflow=0; //overflow value that forms the upper 16 bits of the counter -volatile uint32_t overflowShifted=0; //reduces number of times the overflow is shifted +volatile uint16_t timeStamp=0; void TIMER1_IRQHandler(void) { if ((US_TICKER_TIMER->EVENTS_COMPARE[1] != 0) && @@ -31,14 +31,26 @@ void TIMER1_IRQHandler(void) { US_TICKER_TIMER->EVENTS_COMPARE[1] = 0; overflow++; - overflowShifted = ((uint32_t)overflow<<16); - US_TICKER_TIMER->CC[1] =0;//US_TICKER_TIMER->CC[1]+ 1; - + US_TICKER_TIMER->CC[1] =0xFFFF; + if(timeStamp>0) + { + timeStamp--; + if(timeStamp==0) + { + us_ticker_clear_interrupt(); + us_ticker_disable_interrupt(); + us_ticker_irq_handler(); + return; + } + } } if ((US_TICKER_TIMER->EVENTS_COMPARE[0] != 0) && ((US_TICKER_TIMER->INTENSET & TIMER_INTENSET_COMPARE0_Msk) != 0)) - { - us_ticker_irq_handler(); + { + us_ticker_clear_interrupt(); + us_ticker_disable_interrupt(); + if(timeStamp==0) + us_ticker_irq_handler(); } } @@ -59,7 +71,8 @@ void us_ticker_init(void) US_TICKER_TIMER->PRESCALER = 4; US_TICKER_TIMER->BITMODE = TIMER_BITMODE_BITMODE_16Bit; - US_TICKER_TIMER->CC[1] = 0; + US_TICKER_TIMER->TASKS_CLEAR =1; + US_TICKER_TIMER->CC[1] = 0xFFFF; US_TICKER_TIMER->INTENSET = TIMER_INTENSET_COMPARE1_Set << TIMER_INTENSET_COMPARE1_Pos; NVIC_EnableIRQ(US_TICKER_TIMER_IRQn); @@ -73,16 +86,13 @@ uint32_t us_ticker_read() { us_ticker_init(); } - uint32_t bufferedOverFlow = overflowShifted; - - US_TICKER_TIMER->TASKS_CAPTURE[2] = 1; - __NOP(); //essential to register the capture - if(overflowShifted!=bufferedOverFlow){ - bufferedOverFlow = overflowShifted; + uint16_t bufferedOverFlow = overflow; + US_TICKER_TIMER->TASKS_CAPTURE[2] = 1; + if(overflow!=bufferedOverFlow){ + bufferedOverFlow = overflow; US_TICKER_TIMER->TASKS_CAPTURE[2] = 1; } - - return (bufferedOverFlow | US_TICKER_TIMER->CC[2]); + return (((uint32_t)bufferedOverFlow<<16) | US_TICKER_TIMER->CC[2]); } void us_ticker_set_interrupt(unsigned int timestamp) @@ -90,11 +100,18 @@ void us_ticker_set_interrupt(unsigned int timestamp) if (!us_ticker_inited) { us_ticker_init(); - } - - US_TICKER_TIMER->INTENSET |= TIMER_INTENSET_COMPARE0_Set << TIMER_INTENSET_COMPARE0_Pos; - US_TICKER_TIMER->TASKS_CAPTURE[0] = 1; - US_TICKER_TIMER->CC[0] += timestamp;// * 16; + } + US_TICKER_TIMER->TASKS_CAPTURE[0] = 1; + uint16_t tsUpper16 = (uint16_t)((timestamp-us_ticker_read())>>16); + if(tsUpper16>0){ + if(timeStamp ==0 || timeStamp> tsUpper16){ + timeStamp = tsUpper16; + } + } + else{ + US_TICKER_TIMER->INTENSET |= TIMER_INTENSET_COMPARE0_Set << TIMER_INTENSET_COMPARE0_Pos; + US_TICKER_TIMER->CC[0] += timestamp-us_ticker_read(); + } } void us_ticker_disable_interrupt(void) diff --git a/libraries/tests/mbed/basic/main.cpp b/libraries/tests/mbed/basic/main.cpp index 2eab829b21..7b425e5317 100644 --- a/libraries/tests/mbed/basic/main.cpp +++ b/libraries/tests/mbed/basic/main.cpp @@ -1,5 +1,4 @@ #include "test_env.h" - int main() { notify_completion(true); } diff --git a/libraries/tests/mbed/i2c_master/main.cpp b/libraries/tests/mbed/i2c_master/main.cpp index 3c17c70756..2a888b2b3e 100644 --- a/libraries/tests/mbed/i2c_master/main.cpp +++ b/libraries/tests/mbed/i2c_master/main.cpp @@ -6,6 +6,8 @@ #if defined(TARGET_KL25Z) I2C i2c(PTE0, PTE1); +#elif defined(TARGET_nRF51822) +I2C i2c(p22,p20); #else I2C i2c(p28, p27); #endif diff --git a/libraries/tests/mbed/interruptin/main.cpp b/libraries/tests/mbed/interruptin/main.cpp index 4fb647f20e..c4562ae988 100644 --- a/libraries/tests/mbed/interruptin/main.cpp +++ b/libraries/tests/mbed/interruptin/main.cpp @@ -48,14 +48,13 @@ void flipper() { int main() { out = 0; myled = 0; - //Test falling edges first in.rise(NULL); in.fall(in_handler); flipper(); if(checks != 5) { - printf("falling edges test failed\n"); + printf("falling edges test failed: %d\n",checks); notify_completion(false); } @@ -65,7 +64,7 @@ int main() { flipper(); if (checks != 10) { - printf("raising edges test failed\n"); + printf("raising edges test failed: %d\n",checks); notify_completion(false); } diff --git a/libraries/tests/mbed/portinout/main.cpp b/libraries/tests/mbed/portinout/main.cpp index db3b291dc9..ae88a4541a 100644 --- a/libraries/tests/mbed/portinout/main.cpp +++ b/libraries/tests/mbed/portinout/main.cpp @@ -44,34 +44,44 @@ #define P2_1 (1 << 5) // PTC5 #define P2_2 (1 << 6) // PTC6 #define PORT_2 PortC + +#elif defined(TARGET_nRF51822) +#define P1_1 (1 << 4) // p4 +#define P1_2 (1 << 5) // p5 +#define PORT_1 Port0 + +#define P2_1 (1 << 0) // p24 +#define P2_2 (1 << 1) // p25 +#define PORT_2 Port3 + #endif #define MASK_1 (P1_1 | P1_2) #define MASK_2 (P2_1 | P2_2) -PortInOut p1(PORT_1, MASK_1); -PortInOut p2(PORT_2, MASK_2); +PortInOut port1(PORT_1, MASK_1); +PortInOut port2(PORT_2, MASK_2); int main() { bool check = true; - p1.output(); - p2.input(); + port1.output(); + port2.input(); - p1 = MASK_1; wait(0.1); - if (p2 != MASK_2) check = false; + port1 = MASK_1; wait(0.1); + if (port2 != MASK_2) check = false; - p1 = 0; wait(0.1); - if (p2 != 0) check = false; + port1 = 0; wait(0.1); + if (port2 != 0) check = false; - p1.input(); - p2.output(); + port1.input(); + port2.output(); - p2 = MASK_2; wait(0.1); - if (p1 != MASK_1) check = false; + port2 = MASK_2; wait(0.1); + if (port1 != MASK_1) check = false; - p2 = 0; wait(0.1); - if (p1 != 0) check = false; + port2 = 0; wait(0.1); + if (port1 != 0) check = false; notify_completion(check); } diff --git a/libraries/tests/mbed/portout_portin/main.cpp b/libraries/tests/mbed/portout_portin/main.cpp index 5a4e8c874b..122986653c 100644 --- a/libraries/tests/mbed/portout_portin/main.cpp +++ b/libraries/tests/mbed/portout_portin/main.cpp @@ -44,6 +44,15 @@ #define P2_1 (1 << 5) // PTC5 #define P2_2 (1 << 6) // PTC6 #define PORT_2 PortC + +#elif defined(TARGET_nRF51822) +#define P1_1 (1 << 4) // p4 +#define P1_2 (1 << 5) // p5 +#define PORT_1 Port0 + +#define P2_1 (1 << 0) // p24 +#define P2_2 (1 << 1) // p25 +#define PORT_2 Port3 #endif #define MASK_1 (P1_1 | P1_2) diff --git a/libraries/tests/mbed/pwm/pwm.cpp b/libraries/tests/mbed/pwm/pwm.cpp index 76157ea9ff..a5b8a3d9ab 100644 --- a/libraries/tests/mbed/pwm/pwm.cpp +++ b/libraries/tests/mbed/pwm/pwm.cpp @@ -16,7 +16,7 @@ CT32B0/MR2 p10 (P1_26) int main() { #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) || defined(TARGET_LPC11U24) || defined(TARGET_LPC4088) - PwmOut pwm_p25(p25); + PwmOut pwm_p25(p25); PwmOut pwm_p26(p26); pwm_p25.write(0.75); @@ -48,6 +48,15 @@ int main() { pwm_d2.period_ms(10); pwm_d2.write(0.75); printf("%.2f\n", pwm_d2.read()); +#elif defined(TARGET_nRF51822) + PwmOut pwm_p24(p24); + PwmOut pwm_p25(p25); + + pwm_p24.write(0.75); + pwm_p25.write(0.50); + + printf("Initialize PWM on pin 24 with duty cycle: %.2f\n", pwm_p24.read()); + printf("Initialize PWM on pin 25 with duty cycle: %.2f\n", pwm_p25.read()); #endif notify_completion(true); diff --git a/workspace_tools/make.py b/workspace_tools/make.py index 9366db922a..5a6fe135f1 100644 --- a/workspace_tools/make.py +++ b/workspace_tools/make.py @@ -20,6 +20,7 @@ TEST BUILD & RUN """ import sys from os.path import join, abspath, dirname +from subprocess import call from shutil import copy from time import sleep @@ -74,7 +75,8 @@ if __name__ == '__main__': default=None, help="The mbed serial port") parser.add_option("-b", "--baud", type="int", dest="baud", default=None, help="The mbed serial baud rate") - + parser.add_option("--nrfjprog",dest="nrfjprog",default=None,help="Program nRF Chip via J-Link") + # Ideally, all the tests with a single "main" thread can be run with, or # without the rtos parser.add_option("--rtos", action="store_true", dest="rtos", @@ -164,7 +166,10 @@ if __name__ == '__main__': if options.disk: # Simple copy to the mbed disk copy(bin, options.disk) - + if options.nrfjprog: + #Convert bin to Hex and Program nrf chip via jlink + call(["c:\\msdos\\msdos.exe","c:\\BIN2HEX.EXE",bin]) + call(["nrfjprog","-e","--program",bin.replace(".bin",".hex"),"--verify","-p"]) if options.serial: # Import pyserial: https://pypi.python.org/pypi/pyserial from serial import Serial diff --git a/workspace_tools/tests.py b/workspace_tools/tests.py index 9d7630f0c0..7462991bda 100644 --- a/workspace_tools/tests.py +++ b/workspace_tools/tests.py @@ -253,7 +253,7 @@ TESTS = [ "source_dir": join(TEST_DIR, "mbed", "sleep"), "dependencies": [MBED_LIBRARIES, TEST_MBED_LIB], "duration": 30, - "mcu": ["LPC1768", "LPC11U24", "LPC4088"] + "mcu": ["LPC1768", "LPC11U24", "LPC4088","nRF51822"] }, { "id": "MBED_5", "description": "PWM",