Skip to content

Commit 02bc98a

Browse files
committed
Merge branch 'nordic_sdk_integration' of https://github.com/ARMmbed/mbed-nordic into nordic_sdk_integration
# Conflicts: # hal/targets.json
2 parents adf15c8 + 3bde75a commit 02bc98a

File tree

6 files changed

+82
-47
lines changed

6 files changed

+82
-47
lines changed

hal/targets.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1375,7 +1375,7 @@
13751375
"supported_form_factors": ["ARDUINO"],
13761376
"inherits": ["MCU_NRF51_32K"],
13771377
"progen": {"target": "nrf51-dk"},
1378-
"device_has": ["ANALOGIN", "ERROR_PATTERN", "I2C", "INTERRUPTIN", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SLEEP", "SPI", "SPI_ASYNCH"]
1378+
"device_has": ["ANALOGIN", "ERROR_PATTERN", "I2C", "I2C_ASYNCH", "INTERRUPTIN", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SLEEP", "SPI", "SPI_ASYNCH"]
13791379
},
13801380
"NRF51_DK_BOOT": {
13811381
"supported_form_factors": ["ARDUINO"],
@@ -1773,6 +1773,6 @@
17731773
"NRF52_PAN_62",
17741774
"NRF52_PAN_63"
17751775
],
1776-
"device_has": ["ANALOGIN", "ERROR_PATTERN", "I2C", "INTERRUPTIN", "PORTIN", "PORTINOUT", "PORTOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SLEEP", "SPI", "SPI_ASYNCH"]
1776+
"device_has": ["ANALOGIN", "ERROR_PATTERN", "I2C", "I2C_ASYNCH", "INTERRUPTIN", "PORTIN", "PORTINOUT", "PORTOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SLEEP", "SPI", "SPI_ASYNCH"]
17771777
}
17781778
}

hal/targets/hal/TARGET_NORDIC/TARGET_NRF5/common_rtc.h

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,27 @@
2424
// Instance 0 is reserved for SoftDevice.
2525
// Instance 1 is used as a common one for us_ticker, lp_ticker and (in case
2626
// of NRF51) as an alternative tick source for RTOS.
27+
// ["os_tick.c" uses hard coded addresses of the 'NRF_RTC1->EVENT_COMPARE[1]'
28+
// register in inline assembly implementations of COMMON_RTC_IRQ_HANDLER,
29+
// please remember to update those in case of doing changes here]
2730
#define COMMON_RTC_INSTANCE NRF_RTC1
28-
31+
#define COMMON_RTC_IRQ_HANDLER RTC1_IRQHandler
2932
#define US_TICKER_CC_CHANNEL 0
3033
#define OS_TICK_CC_CHANNEL 1
3134
#define LP_TICKER_CC_CHANNEL 2
3235

36+
#define COMMON_RTC_EVENT_COMPARE(channel) \
37+
CONCAT_2(NRF_RTC_EVENT_COMPARE_, channel)
38+
#define COMMON_RTC_INT_COMPARE_MASK(channel) \
39+
CONCAT_3(NRF_RTC_INT_COMPARE, channel, _MASK)
40+
41+
#define US_TICKER_EVENT COMMON_RTC_EVENT_COMPARE(US_TICKER_CC_CHANNEL)
42+
#define US_TICKER_INT_MASK COMMON_RTC_INT_COMPARE_MASK(US_TICKER_CC_CHANNEL)
43+
#define OS_TICK_EVENT COMMON_RTC_EVENT_COMPARE(OS_TICK_CC_CHANNEL)
44+
#define OS_TICK_INT_MASK COMMON_RTC_INT_COMPARE_MASK(OS_TICK_CC_CHANNEL)
45+
#define LP_TICKER_EVENT COMMON_RTC_EVENT_COMPARE(LP_TICKER_CC_CHANNEL)
46+
#define LP_TICKER_INT_MASK COMMON_RTC_INT_COMPARE_MASK(LP_TICKER_CC_CHANNEL)
47+
3348
extern bool m_common_rtc_enabled;
3449
extern uint32_t volatile m_common_rtc_overflows;
3550

hal/targets/hal/TARGET_NORDIC/TARGET_NRF5/i2c_api.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl)
122122
}
123123

124124
// No available peripheral
125-
error("No available I2C");
125+
error("No available I2C peripheral\r\n");
126126
}
127127

128128
void i2c_reset(i2c_t *obj)
@@ -215,7 +215,7 @@ int i2c_byte_write(i2c_t *obj, int data)
215215

216216
#if DEVICE_I2C_ASYNCH
217217

218-
void i2c_transfer_asynch(i2c_t *obj, void *tx, size_t tx_length,
218+
void i2c_transfer_asynch(i2c_t *obj, const void *tx, size_t tx_length,
219219
void *rx, size_t rx_length, uint32_t address,
220220
uint32_t stop, uint32_t handler,
221221
uint32_t event, DMAUsage hint)

hal/targets/hal/TARGET_NORDIC/TARGET_NRF5/lp_ticker.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,7 @@ void lp_ticker_set_interrupt(uint32_t now, uint32_t time)
3434
{
3535
(void)now;
3636
nrf_rtc_cc_set(COMMON_RTC_INSTANCE, LP_TICKER_CC_CHANNEL, RTC_WRAP(time));
37-
nrf_rtc_event_clear(COMMON_RTC_INSTANCE, NRF_RTC_EVENT_COMPARE_2);
38-
nrf_rtc_event_enable(COMMON_RTC_INSTANCE, NRF_RTC_INT_COMPARE2_MASK);
37+
nrf_rtc_event_enable(COMMON_RTC_INSTANCE, LP_TICKER_INT_MASK);
3938
}
4039

4140
uint32_t lp_ticker_get_overflows_counter(void)

hal/targets/hal/TARGET_NORDIC/TARGET_NRF5/os_tick.c

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
#include "common_rtc.h"
1919
#include "toolchain.h"
20-
#include "nrf_delay.h"
20+
#include "nrf_drv_common.h"
2121

2222

2323
#define MAX_RTC_COUNTER_VAL ((1uL << RTC_COUNTER_BITS) - 1)
@@ -44,7 +44,7 @@ MBED_WEAK void OS_Tick_Handler() { }
4444

4545
#if defined (__CC_ARM) /* ARMCC Compiler */
4646

47-
__asm void RTC1_IRQHandler(void)
47+
__asm void COMMON_RTC_IRQ_HANDLER(void)
4848
{
4949
IMPORT OS_Tick_Handler
5050
IMPORT common_rtc_irq_handler
@@ -59,7 +59,7 @@ __asm void RTC1_IRQHandler(void)
5959
* would never been dequeued.
6060
*
6161
* \code
62-
* void RTC1_IRQHandler(void) {
62+
* void COMMON_RTC_IRQ_HANDLER(void) {
6363
if(NRF_RTC1->EVENTS_COMPARE[1]) {
6464
// never return...
6565
OS_Tick_Handler();
@@ -83,7 +83,7 @@ US_TICKER_HANDLER
8383

8484
#elif defined (__GNUC__) /* GNU Compiler */
8585

86-
__attribute__((naked)) void RTC1_IRQHandler(void)
86+
__attribute__((naked)) void COMMON_RTC_IRQ_HANDLER(void)
8787
{
8888
/**
8989
* Chanel 1 of RTC1 is used by RTX as a systick.
@@ -95,7 +95,7 @@ __attribute__((naked)) void RTC1_IRQHandler(void)
9595
* would never been dequeued.
9696
*
9797
* \code
98-
* void RTC1_IRQHandler(void) {
98+
* void COMMON_RTC_IRQ_HANDLER(void) {
9999
if(NRF_RTC1->EVENTS_COMPARE[1]) {
100100
// never return...
101101
OS_Tick_Handler();
@@ -122,7 +122,7 @@ __attribute__((naked)) void RTC1_IRQHandler(void)
122122
#else
123123

124124
#error Compiler not supported.
125-
#error Provide a definition of RTC1_IRQHandler.
125+
#error Provide a definition of COMMON_RTC_IRQ_HANDLER.
126126

127127
/*
128128
* Chanel 1 of RTC1 is used by RTX as a systick.
@@ -134,7 +134,7 @@ __attribute__((naked)) void RTC1_IRQHandler(void)
134134
* will never been dequeued. After a certain time a stack overflow will happen.
135135
*
136136
* \code
137-
* void RTC1_IRQHandler(void) {
137+
* void COMMON_RTC_IRQ_HANDLER(void) {
138138
if(NRF_RTC1->EVENTS_COMPARE[1]) {
139139
// never return...
140140
OS_Tick_Handler();
@@ -188,8 +188,8 @@ static uint32_t get_next_tick_cc_delta() {
188188
}
189189

190190
static inline void clear_tick_interrupt() {
191-
NRF_RTC1->EVENTS_COMPARE[1] = 0;
192-
NRF_RTC1->EVTENCLR = (1 << 17);
191+
nrf_rtc_event_clear(COMMON_RTC_INSTANCE, OS_TICK_EVENT);
192+
nrf_rtc_event_disable(COMMON_RTC_INSTANCE, OS_TICK_INT_MASK);
193193
}
194194

195195
/**
@@ -224,7 +224,7 @@ static inline bool is_in_wrapped_range(uint32_t begin, uint32_t end, uint32_t va
224224
* Register the next tick.
225225
*/
226226
static void register_next_tick() {
227-
previous_tick_cc_value = NRF_RTC1->CC[1];
227+
previous_tick_cc_value = nrf_rtc_cc_get(COMMON_RTC_INSTANCE, OS_TICK_CC_CHANNEL);
228228
uint32_t delta = get_next_tick_cc_delta();
229229
uint32_t new_compare_value = (previous_tick_cc_value + delta) & MAX_RTC_COUNTER_VAL;
230230

@@ -236,16 +236,16 @@ static void register_next_tick() {
236236
// This code is very short 20-38 cycles in the worst case, it shouldn't
237237
// disturb softdevice.
238238
__disable_irq();
239-
uint32_t current_counter = NRF_RTC1->COUNTER;
239+
uint32_t current_counter = nrf_rtc_counter_get(COMMON_RTC_INSTANCE);
240240

241241
// If an overflow occur, set the next tick in COUNTER + delta clock cycles
242242
if (is_in_wrapped_range(previous_tick_cc_value, new_compare_value, current_counter) == false) {
243243
new_compare_value = current_counter + delta;
244244
}
245-
NRF_RTC1->CC[1] = new_compare_value;
246-
247-
// set the interrupt of CC channel 1 and reenable IRQs
248-
NRF_RTC1->INTENSET = RTC_INTENSET_COMPARE1_Msk;
245+
nrf_rtc_cc_set(COMMON_RTC_INSTANCE, OS_TICK_CC_CHANNEL, new_compare_value);
246+
// Enable generation of the compare event for the value set above (this
247+
// event will trigger the interrupt).
248+
nrf_rtc_event_enable(COMMON_RTC_INSTANCE, OS_TICK_INT_MASK);
249249
__enable_irq();
250250
}
251251

@@ -259,11 +259,10 @@ int os_tick_init (void)
259259
{
260260
common_rtc_init();
261261

262-
NRF_RTC1->CC[1] = 0;
263-
clear_tick_interrupt();
262+
nrf_rtc_cc_set(COMMON_RTC_INSTANCE, OS_TICK_CC_CHANNEL, 0);
264263
register_next_tick();
265264

266-
return RTC1_IRQn;
265+
return nrf_drv_get_IRQn(COMMON_RTC_INSTANCE);
267266
}
268267

269268
/**
@@ -283,8 +282,8 @@ void os_tick_irqack(void)
283282
* @return 1 if the timer has overflowed and 0 otherwise.
284283
*/
285284
uint32_t os_tick_ovf(void) {
286-
uint32_t current_counter = NRF_RTC1->COUNTER;
287-
uint32_t next_tick_cc_value = NRF_RTC1->CC[1];
285+
uint32_t current_counter = nrf_rtc_counter_get(COMMON_RTC_INSTANCE);
286+
uint32_t next_tick_cc_value = nrf_rtc_cc_get(COMMON_RTC_INSTANCE, OS_TICK_CC_CHANNEL);
288287

289288
return is_in_wrapped_range(previous_tick_cc_value, next_tick_cc_value, current_counter) ? 0 : 1;
290289
}
@@ -299,8 +298,8 @@ uint32_t os_tick_ovf(void) {
299298
* @return the value of the alternative hardware timer.
300299
*/
301300
uint32_t os_tick_val(void) {
302-
uint32_t current_counter = NRF_RTC1->COUNTER;
303-
uint32_t next_tick_cc_value = NRF_RTC1->CC[1];
301+
uint32_t current_counter = nrf_rtc_counter_get(COMMON_RTC_INSTANCE);
302+
uint32_t next_tick_cc_value = nrf_rtc_cc_get(COMMON_RTC_INSTANCE, OS_TICK_CC_CHANNEL);
304303

305304
// do not use os_tick_ovf because its counter value can be different
306305
if(is_in_wrapped_range(previous_tick_cc_value, next_tick_cc_value, current_counter)) {

hal/targets/hal/TARGET_NORDIC/TARGET_NRF5/us_ticker.c

Lines changed: 40 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -30,35 +30,35 @@ uint32_t volatile m_common_rtc_overflows = 0;
3030
#if defined(TARGET_MCU_NRF51822)
3131
void common_rtc_irq_handler(void)
3232
#else
33-
void RTC1_IRQHandler(void)
33+
void COMMON_RTC_IRQ_HANDLER(void)
3434
#endif
3535
{
3636
nrf_rtc_event_t event;
3737
uint32_t int_mask;
3838

39-
event = NRF_RTC_EVENT_COMPARE_0;
40-
int_mask = NRF_RTC_INT_COMPARE0_MASK;
41-
if (nrf_rtc_event_pending(COMMON_RTC_INSTANCE, event))
42-
{
39+
event = US_TICKER_EVENT;
40+
int_mask = US_TICKER_INT_MASK;
41+
if (nrf_rtc_event_pending(COMMON_RTC_INSTANCE, event)) {
4342
nrf_rtc_event_clear(COMMON_RTC_INSTANCE, event);
4443
nrf_rtc_event_disable(COMMON_RTC_INSTANCE, int_mask);
44+
4545
us_ticker_irq_handler();
4646
}
4747

4848
#if DEVICE_LOWPOWERTIMER
49-
event = NRF_RTC_EVENT_COMPARE_2;
50-
int_mask = NRF_RTC_INT_COMPARE2_MASK;
51-
if (nrf_rtc_event_pending(COMMON_RTC_INSTANCE, event))
52-
{
49+
event = LP_TICKER_EVENT;
50+
int_mask = LP_TICKER_INT_MASK;
51+
if (nrf_rtc_event_pending(COMMON_RTC_INSTANCE, event)) {
5352
nrf_rtc_event_clear(COMMON_RTC_INSTANCE, event);
5453
nrf_rtc_event_disable(COMMON_RTC_INSTANCE, int_mask);
5554
}
5655
#endif
5756

5857
event = NRF_RTC_EVENT_OVERFLOW;
59-
if (nrf_rtc_event_pending(COMMON_RTC_INSTANCE, event))
60-
{
58+
if (nrf_rtc_event_pending(COMMON_RTC_INSTANCE, event)) {
6159
nrf_rtc_event_clear(COMMON_RTC_INSTANCE, event);
60+
// Don't disable this event. It shall occur periodically.
61+
6262
++m_common_rtc_overflows;
6363
}
6464
}
@@ -76,18 +76,41 @@ void common_rtc_init(void)
7676

7777
nrf_rtc_prescaler_set(COMMON_RTC_INSTANCE, 0);
7878

79+
nrf_rtc_event_clear(COMMON_RTC_INSTANCE, US_TICKER_EVENT);
80+
#if defined(TARGET_MCU_NRF51822)
81+
nrf_rtc_event_clear(COMMON_RTC_INSTANCE, OS_TICK_EVENT);
82+
#endif
83+
#if DEVICE_LOWPOWERTIMER
84+
nrf_rtc_event_clear(COMMON_RTC_INSTANCE, LP_TICKER_EVENT);
85+
#endif
7986
nrf_rtc_event_clear(COMMON_RTC_INSTANCE, NRF_RTC_EVENT_OVERFLOW);
80-
nrf_rtc_event_enable(COMMON_RTC_INSTANCE, NRF_RTC_INT_OVERFLOW_MASK);
87+
88+
// Interrupts on all related events are enabled permanently. Particular
89+
// events will be enabled or disabled as needed (such approach is more
90+
// energy efficient).
8191
nrf_rtc_int_enable(COMMON_RTC_INSTANCE,
82-
NRF_RTC_INT_COMPARE0_MASK |
8392
#if defined(TARGET_MCU_NRF51822)
84-
NRF_RTC_INT_COMPARE1_MASK |
93+
OS_TICK_INT_MASK |
8594
#endif
8695
#if DEVICE_LOWPOWERTIMER
87-
NRF_RTC_INT_COMPARE2_MASK |
96+
LP_TICKER_INT_MASK |
8897
#endif
98+
US_TICKER_INT_MASK |
8999
NRF_RTC_INT_OVERFLOW_MASK);
90100

101+
// This event is enabled permanently, since overflow indications are needed
102+
// continuously.
103+
nrf_rtc_event_enable(COMMON_RTC_INSTANCE, NRF_RTC_INT_OVERFLOW_MASK);
104+
// All other relevant events are initially disabled.
105+
nrf_rtc_event_disable(COMMON_RTC_INSTANCE,
106+
#if defined(TARGET_MCU_NRF51822)
107+
OS_TICK_INT_MASK |
108+
#endif
109+
#if DEVICE_LOWPOWERTIMER
110+
LP_TICKER_INT_MASK |
111+
#endif
112+
US_TICKER_INT_MASK);
113+
91114
nrf_drv_common_irq_enable(nrf_drv_get_IRQn(COMMON_RTC_INSTANCE),
92115
APP_IRQ_PRIORITY_LOW);
93116

@@ -161,13 +184,12 @@ void us_ticker_set_interrupt(timestamp_t timestamp)
161184

162185
nrf_rtc_cc_set(COMMON_RTC_INSTANCE, US_TICKER_CC_CHANNEL,
163186
RTC_WRAP(compare_value));
164-
nrf_rtc_event_clear(COMMON_RTC_INSTANCE, NRF_RTC_EVENT_COMPARE_0);
165-
nrf_rtc_event_enable(COMMON_RTC_INSTANCE, NRF_RTC_INT_COMPARE0_MASK);
187+
nrf_rtc_event_enable(COMMON_RTC_INSTANCE, US_TICKER_INT_MASK);
166188
}
167189

168190
void us_ticker_disable_interrupt(void)
169191
{
170-
nrf_rtc_event_disable(COMMON_RTC_INSTANCE, NRF_RTC_INT_COMPARE0_MASK);
192+
nrf_rtc_event_disable(COMMON_RTC_INSTANCE, US_TICKER_INT_MASK);
171193
}
172194

173195
void us_ticker_clear_interrupt(void)

0 commit comments

Comments
 (0)