1 /***************************************************************************//**
2 * \file cy_systick.c
3 * \version 1.80
4 *
5 * Provides the API definitions of the SisTick driver.
6 *
7 ********************************************************************************
8 * \copyright
9 * Copyright (c) (2016-2022), Cypress Semiconductor Corporation (an Infineon company) or
10 * an affiliate of Cypress Semiconductor Corporation.
11 * SPDX-License-Identifier: Apache-2.0
12 *
13 * Licensed under the Apache License, Version 2.0 (the "License");
14 * you may not use this file except in compliance with the License.
15 * You may obtain a copy of the License at
16 *
17 *     http://www.apache.org/licenses/LICENSE-2.0
18 *
19 * Unless required by applicable law or agreed to in writing, software
20 * distributed under the License is distributed on an "AS IS" BASIS,
21 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
22 * See the License for the specific language governing permissions and
23 * limitations under the License.
24 *******************************************************************************/
25 
26 #include "cy_device.h"
27 
28 #if defined (CY_IP_M33SYSCPUSS) || defined(CY_IP_M55APPCPUSS)
29 
30 #include <stddef.h>     /* for NULL */
31 #include "cy_systick.h"
32 #include "cy_sysint.h"
33 
34 static Cy_SysTick_Callback Cy_SysTick_Callbacks[CY_SYS_SYST_NUM_OF_CALLBACKS];
35 static void Cy_SysTick_ServiceCallbacks(void);
36 
Cy_SysTick_EnableInterrupt(void)37 void Cy_SysTick_EnableInterrupt(void)
38 {
39     SYSTICK_CTRL = SYSTICK_CTRL | SysTick_CTRL_TICKINT_Msk;
40 }
41 
Cy_SysTick_DisableInterrupt(void)42 void Cy_SysTick_DisableInterrupt(void)
43 {
44     SYSTICK_CTRL = SYSTICK_CTRL & ~SysTick_CTRL_TICKINT_Msk;
45 }
46 
Cy_SysTick_SetReload(uint32_t value)47 void Cy_SysTick_SetReload(uint32_t value)
48 {
49     CY_ASSERT_L1(CY_SYSTICK_IS_RELOAD_VALID(value));
50 
51     SYSTICK_LOAD = (value & SysTick_LOAD_RELOAD_Msk);
52 }
53 
Cy_SysTick_GetReload(void)54 uint32_t Cy_SysTick_GetReload(void)
55 {
56     return (SYSTICK_LOAD);
57 }
58 
Cy_SysTick_GetValue(void)59 uint32_t Cy_SysTick_GetValue(void)
60 {
61     return (SYSTICK_VAL);
62 }
63 
Cy_SysTick_Clear(void)64 void Cy_SysTick_Clear(void)
65 {
66     SYSTICK_VAL = 0u;
67 }
68 
Cy_SysTick_GetCountFlag(void)69 uint32_t Cy_SysTick_GetCountFlag(void)
70 {
71     return (SYSTICK_CTRL & SysTick_CTRL_COUNTFLAG_Msk);
72 }
73 
Cy_SysTick_Init(cy_en_systick_clock_source_t clockSource,uint32_t interval)74 void Cy_SysTick_Init(cy_en_systick_clock_source_t clockSource, uint32_t interval)
75 {
76     CY_ASSERT_L1(CY_SYSTICK_IS_RELOAD_VALID(interval));
77     CY_ASSERT_L1(CY_SYSTICK_IS_CLK_SRC_VALID(clockSource));
78 
79     uint32_t i;
80 
81     for (i = 0u; i<CY_SYS_SYST_NUM_OF_CALLBACKS; i++)
82     {
83         Cy_SysTick_Callbacks[i] = NULL;
84     }
85 
86     (void)Cy_SysInt_SetVector(CY_SYSTICK_IRQ_NUM, Cy_SysTick_ServiceCallbacks); /* Suppress a compiler warning about unused return value */
87     Cy_SysTick_SetClockSource(clockSource);
88 
89     Cy_SysTick_SetReload(interval);
90     Cy_SysTick_Clear();
91     Cy_SysTick_Enable();
92 }
93 
Cy_SysTick_Enable(void)94 void Cy_SysTick_Enable(void)
95 {
96     Cy_SysTick_EnableInterrupt();
97     SYSTICK_CTRL |= SysTick_CTRL_ENABLE_Msk;
98 }
99 
Cy_SysTick_Disable(void)100 void Cy_SysTick_Disable(void)
101 {
102     Cy_SysTick_DisableInterrupt();
103     SYSTICK_CTRL &= ~SysTick_CTRL_ENABLE_Msk;
104 }
105 
106 
107 #if defined(CY_PDL_TZ_ENABLED) && (defined(__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1))
108 
Cy_NsSysTick_EnableInterrupt(void)109 void Cy_NsSysTick_EnableInterrupt(void)
110 {
111     SYSTICK_NS_CTRL = SYSTICK_NS_CTRL | SysTick_CTRL_TICKINT_Msk;
112 }
113 
114 
Cy_NsSysTick_DisableInterrupt(void)115 void Cy_NsSysTick_DisableInterrupt(void)
116 {
117     SYSTICK_NS_CTRL = SYSTICK_NS_CTRL & ~SysTick_CTRL_TICKINT_Msk;
118 }
119 
Cy_NsSysTick_Enable(void)120 void Cy_NsSysTick_Enable(void)
121 {
122     Cy_NsSysTick_EnableInterrupt();
123     SYSTICK_NS_CTRL |= SysTick_CTRL_ENABLE_Msk;
124 }
125 
Cy_NsSysTick_Disable(void)126 void Cy_NsSysTick_Disable(void)
127 {
128     Cy_NsSysTick_DisableInterrupt();
129     SYSTICK_NS_CTRL &= ~SysTick_CTRL_ENABLE_Msk;
130 }
131 #endif
132 
Cy_SysTick_SetClockSource(cy_en_systick_clock_source_t clockSource)133 void Cy_SysTick_SetClockSource(cy_en_systick_clock_source_t clockSource)
134 {
135     CY_ASSERT_L1(CY_SYSTICK_IS_CLK_SRC_VALID(clockSource));
136 
137     if (clockSource == CY_SYSTICK_CLOCK_SOURCE_CLK_CPU)
138     {
139         SYSTICK_CTRL |= SysTick_CTRL_CLKSOURCE_Msk;
140     }
141     else
142     {
143 #ifdef CY_PDL_TZ_ENABLED
144         CPUSS_SYSTICK_S_CTL = _VAL2FLD(CPUSS_SYSTICK_S_CTL_CLOCK_SOURCE, (uint32_t) clockSource);
145 #else
146         CPUSS_SYSTICK_NS_CTL = _VAL2FLD(CPUSS_SYSTICK_NS_CTL_CLOCK_SOURCE, (uint32_t) clockSource);
147 #endif
148 
149         SYSTICK_CTRL &= ~SysTick_CTRL_CLKSOURCE_Msk;
150     }
151 }
152 
Cy_SysTick_GetClockSource(void)153 cy_en_systick_clock_source_t Cy_SysTick_GetClockSource(void)
154 {
155     cy_en_systick_clock_source_t returnValue;
156 
157     if ((SYSTICK_CTRL & SysTick_CTRL_CLKSOURCE_Msk) != 0u)
158     {
159         returnValue = CY_SYSTICK_CLOCK_SOURCE_CLK_CPU;
160     }
161     else
162     {
163 #ifdef CY_PDL_TZ_ENABLED
164         returnValue =  (cy_en_systick_clock_source_t) ((uint32_t) _FLD2VAL(CPUSS_SYSTICK_S_CTL_CLOCK_SOURCE, CPUSS_SYSTICK_S_CTL));
165 #else
166         returnValue =  (cy_en_systick_clock_source_t) ((uint32_t) _FLD2VAL(CPUSS_SYSTICK_NS_CTL_CLOCK_SOURCE, CPUSS_SYSTICK_NS_CTL));
167 #endif
168 
169     }
170 
171     return(returnValue);
172 }
173 
Cy_SysTick_SetCallback(uint32_t number,Cy_SysTick_Callback function)174 Cy_SysTick_Callback Cy_SysTick_SetCallback(uint32_t number, Cy_SysTick_Callback function)
175 {
176     Cy_SysTick_Callback retVal;
177 
178     if (number < CY_SYS_SYST_NUM_OF_CALLBACKS)
179     {
180         retVal = Cy_SysTick_Callbacks[number];
181         Cy_SysTick_Callbacks[number] = function;
182     }
183     else
184     {
185         retVal = NULL;
186     }
187 
188     return (retVal);
189 }
190 
Cy_SysTick_GetCallback(uint32_t number)191 Cy_SysTick_Callback Cy_SysTick_GetCallback(uint32_t number)
192 {
193     Cy_SysTick_Callback retVal;
194 
195     if (number < CY_SYS_SYST_NUM_OF_CALLBACKS)
196     {
197         retVal = Cy_SysTick_Callbacks[number];
198     }
199     else
200     {
201         retVal = NULL;
202     }
203 
204     return (retVal);
205 }
206 
Cy_SysTick_ServiceCallbacks(void)207 static void Cy_SysTick_ServiceCallbacks(void)
208 {
209     uint32_t i;
210 
211     /* Verify that tick timer flag was set */
212     if (0u != Cy_SysTick_GetCountFlag())
213     {
214         for (i=0u; i < CY_SYS_SYST_NUM_OF_CALLBACKS; i++)
215         {
216             if (Cy_SysTick_Callbacks[i] != NULL)
217             {
218                 (void)(Cy_SysTick_Callbacks[i])();
219             }
220         }
221     }
222 }
223 
224 #endif
225 
226 /* [] END OF FILE */
227