]> begriffs open source - cmsis-freertos/blob - CMSIS/RTOS2/FreeRTOS/Source/os_systick.c
Update cmsis_os2.c
[cmsis-freertos] / CMSIS / RTOS2 / FreeRTOS / Source / os_systick.c
1 /**************************************************************************//**
2  * @file     os_systick.c
3  * @brief    CMSIS OS Tick SysTick implementation
4  * @version  V1.0.0
5  * @date     05. June 2017
6  ******************************************************************************/
7 /*
8  * Copyright (c) 2017-2017 ARM Limited. All rights reserved.
9  *
10  * SPDX-License-Identifier: Apache-2.0
11  *
12  * Licensed under the Apache License, Version 2.0 (the License); you may
13  * not use this file except in compliance with the License.
14  * You may obtain a copy of the License at
15  *
16  * www.apache.org/licenses/LICENSE-2.0
17  *
18  * Unless required by applicable law or agreed to in writing, software
19  * distributed under the License is distributed on an AS IS BASIS, WITHOUT
20  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21  * See the License for the specific language governing permissions and
22  * limitations under the License.
23  */
24
25 #include "os_tick.h"
26
27 #include "RTE_Components.h"
28 #include CMSIS_device_header
29
30 #ifdef  SysTick
31
32 #ifndef SYSTICK_IRQ_PRIORITY
33 #define SYSTICK_IRQ_PRIORITY    0xFFU
34 #endif
35
36 static uint8_t PendST;
37
38 // Setup OS Tick.
39 __WEAK int32_t  OS_Tick_Setup (uint32_t freq, IRQHandler_t handler) {
40   uint32_t load;
41   (void)handler;
42
43   if (freq == 0U) {
44     return (-1);
45   }
46
47   load = (SystemCoreClock / freq) - 1U;
48   if (load > 0x00FFFFFFU) {
49     return (-1);
50   }
51
52   NVIC_SetPriority(SysTick_IRQn, SYSTICK_IRQ_PRIORITY);
53
54   SysTick->CTRL =  SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk;
55   SysTick->LOAD =  load;
56   SysTick->VAL  =  0U;
57
58   PendST = 0U;
59
60   return (0);
61 }
62
63 /// Enable OS Tick.
64 __WEAK int32_t  OS_Tick_Enable (void) {
65
66   if (PendST != 0U) {
67     PendST = 0U;
68     SCB->ICSR = SCB_ICSR_PENDSTSET_Msk;
69   }
70
71   SysTick->CTRL |=  SysTick_CTRL_ENABLE_Msk;
72
73   return (0);
74 }
75
76 /// Disable OS Tick.
77 __WEAK int32_t  OS_Tick_Disable (void) {
78
79   SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
80
81   if ((SCB->ICSR & SCB_ICSR_PENDSTSET_Msk) != 0U) {
82     SCB->ICSR = SCB_ICSR_PENDSTCLR_Msk;
83     PendST = 1U;
84   }
85
86   return (0);
87 }
88
89 // Acknowledge OS Tick IRQ.
90 __WEAK int32_t  OS_Tick_AcknowledgeIRQ (void) {
91   (void)SysTick->CTRL;
92   return (0);
93 }
94
95 // Get OS Tick IRQ number.
96 __WEAK int32_t  OS_Tick_GetIRQn (void) {
97   return (SysTick_IRQn);
98 }
99
100 // Get OS Tick clock.
101 __WEAK uint32_t OS_Tick_GetClock (void) {
102   return (SystemCoreClock);
103 }
104
105 // Get OS Tick interval.
106 __WEAK uint32_t OS_Tick_GetInterval (void) {
107   return (SysTick->LOAD + 1U);
108 }
109
110 // Get OS Tick count value.
111 __WEAK uint32_t OS_Tick_GetCount (void) {
112   uint32_t load = SysTick->LOAD;
113   return  (load - SysTick->VAL);
114 }
115
116 // Get OS Tick overflow status.
117 __WEAK uint32_t OS_Tick_GetOverflow (void) {
118   return ((SysTick->CTRL >> 16) & 1U);
119 }
120
121 #endif  // SysTick