From baaa6086e60cafe937826c7d99ab305cdb62c7de Mon Sep 17 00:00:00 2001 From: Andrzej Puzdrowski Date: Wed, 11 Jan 2017 11:24:06 +0100 Subject: [PATCH] nrf52840: add workaround for RTC errata 20 include thered main stack for cmsis rtos --- rtos/rtx/TARGET_CORTEX_M/RTX_CM_lib.h | 2 +- .../TARGET_NORDIC/TARGET_NRF5_SDK13/us_ticker.c | 16 ++++++++++++++++ targets/targets.json | 4 ++-- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/rtos/rtx/TARGET_CORTEX_M/RTX_CM_lib.h b/rtos/rtx/TARGET_CORTEX_M/RTX_CM_lib.h index 410007facb..40aa2fff76 100644 --- a/rtos/rtx/TARGET_CORTEX_M/RTX_CM_lib.h +++ b/rtos/rtx/TARGET_CORTEX_M/RTX_CM_lib.h @@ -354,7 +354,7 @@ __attribute__((used)) void _mutex_release (OS_ID *mutex) { /* Main Thread definition */ extern void pre_main (void); -#if defined(TARGET_MCU_NRF52832) ||\ +#if defined(TARGET_MCU_NRF52840) ||\ defined(TARGET_MCU_NRF51822) || defined(TARGET_MCU_NRF52832) || defined (TARGET_STM32F334R8) ||\ defined(TARGET_STM32F070RB) || defined(TARGET_STM32F072RB) || \ defined(TARGET_STM32F302R8) || defined(TARGET_STM32F303K8) || defined (TARGET_STM32F334C8) ||\ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5_SDK13/us_ticker.c b/targets/TARGET_NORDIC/TARGET_NRF5_SDK13/us_ticker.c index d7267b81cc..a4d4bc5d89 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5_SDK13/us_ticker.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5_SDK13/us_ticker.c @@ -76,6 +76,20 @@ void COMMON_RTC_IRQ_HANDLER(void) } } +// Function for fix errata 20: RTC Register values are invalid +__STATIC_INLINE void errata_20(void) +{ +#if defined(NRF52_ERRATA_20) + if (!softdevice_handler_is_enabled()) + { + NRF_CLOCK->EVENTS_LFCLKSTARTED = 0; + NRF_CLOCK->TASKS_LFCLKSTART = 1; + while (NRF_CLOCK->EVENTS_LFCLKSTARTED == 0) {} + } + NRF_RTC1->TASKS_STOP = 0; +#endif +} + #if (defined (__ICCARM__)) && defined(TARGET_MCU_NRF51822)//IAR __stackless __task #endif @@ -87,6 +101,8 @@ void common_rtc_init(void) return; } + errata_20(); + NVIC_SetVector(RTC1_IRQn, (uint32_t)RTC1_IRQHandler); // RTC is driven by the low frequency (32.768 kHz) clock, a proper request diff --git a/targets/targets.json b/targets/targets.json index f5d2210020..860f3fdd52 100644 --- a/targets/targets.json +++ b/targets/targets.json @@ -2657,7 +2657,7 @@ "MCU_NRF52840": { "inherits": ["Target"], "core": "Cortex-M4F", - "macros": ["TARGET_NRF52840", "BLE_STACK_SUPPORT_REQD", "SOFTDEVICE_PRESENT", "S140", "NRF_SD_BLE_API_VERSION=5", "NRF52840_XXAA", "NRF_DFU_SETTINGS_VERSION=1"], + "macros": ["TARGET_NRF52840", "BLE_STACK_SUPPORT_REQD", "SOFTDEVICE_PRESENT", "S140", "NRF_SD_BLE_API_VERSION=5", "NRF52840_XXAA", "NRF_DFU_SETTINGS_VERSION=1", "NRF_SD_BLE_API_VERSION=5"], "extra_labels": ["NORDIC", "MCU_NRF52840", "NRF5_SDK13"], "OUTPUT_EXT": "hex", "is_disk_virtual": true, @@ -2695,7 +2695,7 @@ "NRF52840_DK": { "supported_form_factors": ["ARDUINO"], "inherits": ["MCU_NRF52840"], - "macros_add": ["BOARD_PCA10056", "CONFIG_GPIO_AS_PINRESET", "SWI_DISABLE0"], + "macros_add": ["BOARD_PCA10056", "CONFIG_GPIO_AS_PINRESET", "SWI_DISABLE0", "NRF52_ERRATA_20"], "device_has": ["ANALOGIN", "ERROR_PATTERN", "I2C", "I2C_ASYNCH", "INTERRUPTIN", "LOWPOWERTIMER", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SERIAL_FC", "SLEEP", "SPI", "SPI_ASYNCH", "SPISLAVE"], "release_versions": ["2", "5"], "device_name": "nRF52840_xxAA"