1 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
2 // ==== OS Tick API ====
4 \addtogroup CMSIS_RTOS_TickAPI OS Tick API
5 \brief System tick timer interface for periodic RTOS Kernel Ticks defined in <b>%os_tick.h</b>
8 The <b>OS Tick API</b> is an interface to a system timer that generates the Kernel Ticks.
10 All Cortex-M processors provide an unified System Tick Timer that is typically used to generate the RTOS Kernel Tick.
13 The Cortex-A processors do not implement an unified system timer and required a device specific implementation.
16 CMSIS-RTOS2 provides in the directory \ref directory "CMSIS/RTOS2/Source" several OS Tick implementations that can be used by any RTOS kernel.
18 Filename | OS Tick Implementation for...
19 :------------------------|:-----------------------------------------------------------------------
20 \b %os_systick.c | Cortex-M SysTick timer
22 \b %os_tick_gtim.c | Cortex-A Generic Timer (available in some devices)
23 \b %os_tick_ptim.c | Cortex-A Private Timer (available in some devices)
26 \note The above OS Tick source files implement \c weak functions which may be overwritten by user-specific implementations.
31 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
33 \fn int32_t OS_Tick_Setup (uint32_t freq, IRQHandler_t handler)
36 Setup OS Tick timer to generate periodic RTOS Kernel Ticks.
38 The timer should be configured to generate periodic interrupts at frequency specified by \em freq.
39 The parameter \em handler defines the interrupt handler function that is called.
41 The timer should only be initialized and configured but must not be started to create interrupts.
42 The RTOS kernel calls the function \ref OS_Tick_Enable to start the timer interrupts.
44 <b>Cortex-M SysTick implementation:</b>
46 #ifndef SYSTICK_IRQ_PRIORITY
47 #define SYSTICK_IRQ_PRIORITY 0xFFU
50 static uint8_t PendST;
52 int32_t OS_Tick_Setup (uint32_t freq, IRQHandler_t handler) {
60 load = (SystemCoreClock / freq) - 1U;
61 if (load > 0x00FFFFFFU) {
65 NVIC_SetPriority(SysTick_IRQn, SYSTICK_IRQ_PRIORITY);
67 SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk;
78 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
80 \fn void OS_Tick_Enable (void)
82 Enable OS Tick timer interrupt.
84 Enable and start the OS Tick timer to generate periodic RTOS Kernel Tick interrupts.
86 <b>Cortex-M SysTick implementation:</b>
88 void OS_Tick_Enable (void) {
92 SCB->ICSR = SCB_ICSR_PENDSTSET_Msk;
95 SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
101 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
103 \fn void OS_Tick_Disable (void)
105 Disable OS Tick timer interrupt.
107 Stop the OS Tick timer and disable generation of RTOS Kernel Tick interrupts.
109 <b>Cortex-M SysTick implementation:</b>
111 void OS_Tick_Disable (void) {
113 SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
115 if ((SCB->ICSR & SCB_ICSR_PENDSTSET_Msk) != 0U) {
116 SCB->ICSR = SCB_ICSR_PENDSTCLR_Msk;
124 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
126 \fn void OS_Tick_AcknowledgeIRQ (void)
128 Acknowledge execution of OS Tick timer interrupt.
130 Acknowledge the execution of the OS Tick timer interrupt function, for example clear the pending flag.
132 <b>Cortex-M SysTick implementation:</b>
135 void OS_Tick_AcknowledgeIRQ (void) {
143 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
145 \fn int32_t OS_Tick_GetIRQn (void)
147 Get OS Tick timer IRQ number.
149 Return the numeric value that identifies the interrupt called by the OS Tick timer.
151 <b>Cortex-M SysTick implementation:</b>
154 int32_t OS_Tick_GetIRQn (void) {
155 return ((int32_t)SysTick_IRQn);
160 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
162 \fn uint32_t OS_Tick_GetClock (void)
164 Get OS Tick timer clock frequency.
166 Return the input clock frequency of the OS Tick timer. This is the increment rate of the counter value returned by the function \ref OS_Tick_GetCount.
167 This function is used to by the function \ref osKernelGetSysTimerFreq.
169 <b>Cortex-M SysTick implementation:</b>
172 uint32_t OS_Tick_GetClock (void) {
173 return (SystemCoreClock);
178 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
180 \fn uint32_t OS_Tick_GetInterval (void)
182 Get OS Tick timer interval reload value.
184 Return the number of counter ticks between to periodic OS Tick timer interrupts.
186 <b>Cortex-M SysTick implementation:</b>
189 uint32_t OS_Tick_GetInterval (void) {
190 return (SysTick->LOAD + 1U);
195 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
197 \fn uint32_t OS_Tick_GetCount (void)
200 Get OS Tick timer counter value.
202 Return the current value of the OS Tick counter: 0 ... (reload value -1). The reload value is returned by the function \ref OS_Tick_GetInterval.
203 The OS Tick timer counter value is used to by the function \ref osKernelGetSysTimerCount.
205 <b>Cortex-M SysTick implementation:</b>
208 uint32_t OS_Tick_GetCount (void) {
214 count = (SysTick->LOAD - val) + 1U;
224 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
226 \fn OS_Tick_GetOverflow (void)
228 Get OS Tick timer overflow status.
230 Return the state of OS Tick timer interrupt pending bit that indicates timer overflows to adjust SysTimer calculations.
232 <b>Cortex-M SysTick implementation:</b>
235 uint32_t OS_Tick_GetOverflow (void) {
236 return ((SCB->ICSR & SCB_ICSR_PENDSTSET_Msk) >> SCB_ICSR_PENDSTSET_Pos);
241 /** @} */ /* group CMSIS_RTOS_TickAPI */