This is an automated email from the ASF dual-hosted git repository.
acassis pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new a13ebe5 arch/arm/stm32: Make SysTick as a Tickless clock source option
a13ebe5 is described below
commit a13ebe5975db7abb048e2a68b60a656e09640ffb
Author: Huang Qi <[email protected]>
AuthorDate: Sat Jun 20 11:54:51 2020 +0800
arch/arm/stm32: Make SysTick as a Tickless clock source option
Signed-off-by: Huang Qi <[email protected]>
---
arch/arm/src/stm32/Kconfig | 8 ++++++++
arch/arm/src/stm32/Make.defs | 16 ++++++++++++----
arch/arm/src/stm32/stm32_timerisr.c | 8 ++++++++
3 files changed, 28 insertions(+), 4 deletions(-)
diff --git a/arch/arm/src/stm32/Kconfig b/arch/arm/src/stm32/Kconfig
index 4af6394..2ea5e37 100644
--- a/arch/arm/src/stm32/Kconfig
+++ b/arch/arm/src/stm32/Kconfig
@@ -3421,6 +3421,13 @@ config STM32_EXTERNAL_RAM
---help---
In addition to internal SRAM, external RAM may be available
through the FSMC/FMC.
+config STM32_TICKLESS_SYSTICK
+ bool "Tickless via SysTick"
+ default n
+ depends on SCHED_TICKLESS
+ ---help---
+ Use SysTick as Tickless clock.
+
menu "Timer Configuration"
depends on STM32_TIM
@@ -3430,6 +3437,7 @@ config STM32_TICKLESS_TIMER
int "Tickless hardware timer"
default 2
range 1 14
+ depends on !STM32_TICKLESS_SYSTICK
---help---
If the Tickless OS feature is enabled, then one clock must be
assigned to provided the timer needed by the OS.
diff --git a/arch/arm/src/stm32/Make.defs b/arch/arm/src/stm32/Make.defs
index 59e75f0..0e843bd 100644
--- a/arch/arm/src/stm32/Make.defs
+++ b/arch/arm/src/stm32/Make.defs
@@ -44,13 +44,21 @@ endif
CMN_CSRCS = arm_assert.c arm_blocktask.c arm_copyfullstate.c arm_createstack.c
CMN_CSRCS += arm_exit.c arm_hardfault.c arm_initialize.c arm_initialstate.c
-CMN_CSRCS += arm_interruptcontext.c arm_mdelay.c arm_memfault.c
arm_modifyreg8.c
+CMN_CSRCS += arm_interruptcontext.c arm_memfault.c arm_modifyreg8.c
CMN_CSRCS += arm_modifyreg16.c arm_modifyreg32.c arm_releasepending.c
CMN_CSRCS += arm_releasestack.c arm_reprioritizertr.c arm_schedulesigaction.c
CMN_CSRCS += arm_sigdeliver.c arm_stackframe.c arm_svcall.c arm_systemreset.c
CMN_CSRCS += arm_trigger_irq.c arm_unblocktask.c arm_udelay.c arm_usestack.c
CMN_CSRCS += arm_doirq.c arm_vfork.c
+ifeq ($(CONFIG_STM32_TICKLESS_SYSTICK),y)
+CMN_CSRCS += arm_systick.c
+endif
+
+ifneq ($(CONFIG_TIMER_ARCH),y)
+CMN_CSRCS += arm_mdelay.c
+endif
+
ifeq ($(CONFIG_ARMV7M_STACKCHECK),y)
CMN_CSRCS += arm_stackcheck.c
endif
@@ -104,10 +112,10 @@ ifeq ($(CONFIG_TIMER),y)
CHIP_CSRCS += stm32_tim_lowerhalf.c
endif
-ifneq ($(CONFIG_SCHED_TICKLESS),y)
-CHIP_CSRCS += stm32_timerisr.c
-else
+ifdef CONFIG_STM32_TICKLESS_TIMER
CHIP_CSRCS += stm32_tickless.c
+else
+CHIP_CSRCS += stm32_timerisr.c
endif
ifeq ($(CONFIG_STM32_ONESHOT),y)
diff --git a/arch/arm/src/stm32/stm32_timerisr.c
b/arch/arm/src/stm32/stm32_timerisr.c
index f70202d..7d4d2e9 100644
--- a/arch/arm/src/stm32/stm32_timerisr.c
+++ b/arch/arm/src/stm32/stm32_timerisr.c
@@ -43,12 +43,14 @@
#include <time.h>
#include <debug.h>
#include <nuttx/arch.h>
+#include <nuttx/timers/arch_timer.h>
#include <arch/board/board.h>
#include "nvic.h"
#include "clock/clock.h"
#include "arm_internal.h"
#include "arm_arch.h"
+#include "systick.h"
#include "chip.h"
#include "stm32.h"
@@ -98,6 +100,7 @@
*
****************************************************************************/
+#if !defined(CONFIG_ARMV7M_SYSTICK) && !defined(CONFIG_TIMER_ARCH)
static int stm32_timerisr(int irq, uint32_t *regs, void *arg)
{
/* Process timer interrupt */
@@ -105,6 +108,7 @@ static int stm32_timerisr(int irq, uint32_t *regs, void
*arg)
nxsched_process_timer();
return 0;
}
+#endif
/****************************************************************************
* Public Functions
@@ -142,6 +146,9 @@ void up_timer_initialize(void)
putreg32(regval, NVIC_SYSTICK_CTRL);
#endif
+#if defined(CONFIG_ARMV7M_SYSTICK) && defined(CONFIG_TIMER_ARCH)
+ up_timer_set_lowerhalf(systick_initialize(true, STM32_HCLK_FREQUENCY, -1));
+#else
/* Configure SysTick to interrupt at the requested rate */
putreg32(SYSTICK_RELOAD, NVIC_SYSTICK_RELOAD);
@@ -158,4 +165,5 @@ void up_timer_initialize(void)
/* And enable the timer interrupt */
up_enable_irq(STM32_IRQ_SYSTICK);
+#endif
}