Skip to content

Commit fd7b57d

Browse files
robert-hhdpgeorge
authored andcommitted
samd/mphalport: Use CYCCNT for SAMD51's mp_hal_ticks_cpu().
And use mp_hal_ticks_us() for SAM21's mp_hal_ticks_cpu(). The SAMD21 has no CYCCNT register, and the SysTick register has only a 1 ms span (== 48000 count range).
1 parent a9304af commit fd7b57d

File tree

2 files changed

+17
-3
lines changed

2 files changed

+17
-3
lines changed

ports/samd/mphalport.h

+13-3
Original file line numberDiff line numberDiff line change
@@ -71,11 +71,21 @@ static inline mp_uint_t mp_hal_ticks_us(void) {
7171
#endif
7272
}
7373

74-
// ticks_cpu is limited to a 1 ms period, since the CPU SysTick counter
75-
// is used for the 1 ms SysTick_Handler interrupt.
74+
#if defined (MCU_SAMD21)
75+
76+
#define mp_hal_ticks_cpu mp_hal_ticks_us
77+
78+
#elif defined (MCU_SAMD51)
79+
static inline void mp_hal_ticks_cpu_enable(void) {
80+
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
81+
DWT->CYCCNT = 0;
82+
DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
83+
}
84+
7685
static inline mp_uint_t mp_hal_ticks_cpu(void) {
77-
return (system_time_t)SysTick->VAL;
86+
return (system_time_t)DWT->CYCCNT;
7887
}
88+
#endif
7989

8090
static inline uint64_t mp_hal_time_ns(void) {
8191
return mp_hal_ticks_ms_64() * 1000000;

ports/samd/samd_soc.c

+4
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
#include "samd_soc.h"
3737
#include "sam.h"
3838
#include "tusb.h"
39+
#include "mphalport.h"
3940

4041
static void usb_init(void) {
4142
// Init USB clock
@@ -110,4 +111,7 @@ void samd_init(void) {
110111
SysTick_Config(get_cpu_freq() / 1000);
111112
init_us_counter();
112113
usb_init();
114+
#if defined (MCU_SAMD51)
115+
mp_hal_ticks_cpu_enable();
116+
#endif
113117
}

0 commit comments

Comments
 (0)