Skip to content

Commit d1ba108

Browse files
author
Marcus Chang
committed
NRF52: fix us_ticker IRQ handler
Applying PR to NRF52 SDK 14.2: #5046
1 parent 7a08307 commit d1ba108

File tree

3 files changed

+25
-10
lines changed

3 files changed

+25
-10
lines changed

targets/TARGET_NORDIC/TARGET_NRF5x/common_rtc.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@
3333
#define OS_TICK_CC_CHANNEL 1
3434
#define LP_TICKER_CC_CHANNEL 2
3535

36+
#define US_TICKER_SW_IRQ_MASK 0x1
37+
#define LP_TICKER_SW_IRQ_MASK 0x2
38+
3639
#define COMMON_RTC_EVENT_COMPARE(channel) \
3740
CONCAT_2(NRF_RTC_EVENT_COMPARE_, channel)
3841
#define COMMON_RTC_INT_COMPARE_MASK(channel) \
@@ -47,6 +50,7 @@
4750

4851
extern bool m_common_rtc_enabled;
4952
extern uint32_t volatile m_common_rtc_overflows;
53+
extern uint8_t volatile m_common_sw_irq_flag;
5054

5155
void common_rtc_init(void);
5256
uint32_t common_rtc_32bit_ticks_get(void);

targets/TARGET_NORDIC/TARGET_NRF5x/lp_ticker.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#if DEVICE_LOWPOWERTIMER
1919

2020
#include "common_rtc.h"
21+
#include "mbed_critical.h"
2122

2223
void lp_ticker_init(void)
2324
{
@@ -37,10 +38,10 @@ void lp_ticker_set_interrupt(timestamp_t timestamp)
3738

3839
void lp_ticker_fire_interrupt(void)
3940
{
40-
uint32_t closest_safe_compare = common_rtc_32bit_ticks_get() + 2;
41-
42-
nrf_rtc_cc_set(COMMON_RTC_INSTANCE, LP_TICKER_CC_CHANNEL, RTC_WRAP(closest_safe_compare));
43-
nrf_rtc_event_enable(COMMON_RTC_INSTANCE, LP_TICKER_INT_MASK);
41+
core_util_critical_section_enter();
42+
m_common_sw_irq_flag |= LP_TICKER_SW_IRQ_MASK;
43+
NVIC_SetPendingIRQ(RTC1_IRQn);
44+
core_util_critical_section_exit();
4445
}
4546

4647
void lp_ticker_disable_interrupt(void)

targets/TARGET_NORDIC/TARGET_NRF5x/us_ticker.c

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,14 @@
4343
#include "lp_ticker_api.h"
4444
#include "mbed_critical.h"
4545

46+
#if defined(NRF52_ERRATA_20)
4647
#if defined(SOFTDEVICE_PRESENT)
4748
#include "nrf_sdh.h"
4849
#define NRF_HAL_US_TICKER_SD_IS_ENABLED() nrf_sdh_is_enabled()
4950
#else
5051
#define NRF_HAL_US_TICKER_SD_IS_ENABLED() 0
5152
#endif
53+
#endif
5254

5355
//------------------------------------------------------------------------------
5456
// Common stuff used also by lp_ticker and rtc_api (see "common_rtc.h").
@@ -58,6 +60,9 @@
5860
bool m_common_rtc_enabled = false;
5961
uint32_t volatile m_common_rtc_overflows = 0;
6062

63+
// lp/us ticker fire interrupt flag for IRQ handler
64+
volatile uint8_t m_common_sw_irq_flag = 0;
65+
6166
__STATIC_INLINE void rtc_ovf_event_check(void)
6267
{
6368
if (nrf_rtc_event_pending(COMMON_RTC_INSTANCE, NRF_RTC_EVENT_OVERFLOW)) {
@@ -77,11 +82,15 @@ void COMMON_RTC_IRQ_HANDLER(void)
7782

7883
rtc_ovf_event_check();
7984

80-
if (nrf_rtc_event_pending(COMMON_RTC_INSTANCE, US_TICKER_EVENT)) {
85+
if ((m_common_sw_irq_flag & US_TICKER_SW_IRQ_MASK) || nrf_rtc_event_pending(COMMON_RTC_INSTANCE, US_TICKER_EVENT)) {
8186
us_ticker_irq_handler();
8287
}
8388

8489
#if DEVICE_LOWPOWERTIMER
90+
if (m_common_sw_irq_flag & LP_TICKER_SW_IRQ_MASK) {
91+
m_common_sw_irq_flag &= ~LP_TICKER_SW_IRQ_MASK;
92+
lp_ticker_irq_handler();
93+
}
8594
if (nrf_rtc_event_pending(COMMON_RTC_INSTANCE, LP_TICKER_EVENT)) {
8695

8796
lp_ticker_irq_handler();
@@ -117,7 +126,7 @@ void common_rtc_init(void)
117126
errata_20();
118127

119128
NVIC_SetVector(RTC1_IRQn, (uint32_t)RTC1_IRQHandler);
120-
129+
121130
// RTC is driven by the low frequency (32.768 kHz) clock, a proper request
122131
// must be made to have it running.
123132
// Currently this clock is started in 'SystemInit' (see "system_nrf51.c"
@@ -276,10 +285,10 @@ void us_ticker_set_interrupt(timestamp_t timestamp)
276285

277286
void us_ticker_fire_interrupt(void)
278287
{
279-
uint32_t closest_safe_compare = common_rtc_32bit_ticks_get() + 2;
280-
281-
nrf_rtc_cc_set(COMMON_RTC_INSTANCE, US_TICKER_CC_CHANNEL, RTC_WRAP(closest_safe_compare));
282-
nrf_rtc_event_enable(COMMON_RTC_INSTANCE, US_TICKER_INT_MASK);
288+
core_util_critical_section_enter();
289+
m_common_sw_irq_flag |= US_TICKER_SW_IRQ_MASK;
290+
NVIC_SetPendingIRQ(RTC1_IRQn);
291+
core_util_critical_section_exit();
283292
}
284293

285294
void us_ticker_disable_interrupt(void)
@@ -289,6 +298,7 @@ void us_ticker_disable_interrupt(void)
289298

290299
void us_ticker_clear_interrupt(void)
291300
{
301+
m_common_sw_irq_flag &= ~US_TICKER_SW_IRQ_MASK;
292302
nrf_rtc_event_clear(COMMON_RTC_INSTANCE, US_TICKER_EVENT);
293303
}
294304

0 commit comments

Comments
 (0)