1 /**
2   ******************************************************************************
3   * @file    stm32wb0x_ll_radio_timer.h
4   * @author  GPM WBL Application Team
5   * @brief   Radio Timer LL module
6   ******************************************************************************
7   * @attention
8   *
9   * Copyright (c) 2024 STMicroelectronics.
10   * All rights reserved.
11   *
12   * This software is licensed under terms that can be found in the LICENSE file
13   * in the root directory of this software component.
14   * If no LICENSE file comes with this software, it is provided AS-IS.
15   *
16   ******************************************************************************
17   */
18 
19 /* Define to prevent recursive inclusion -------------------------------------*/
20 #ifndef STM32WB0x_LL_RADIO_TIMER_H
21 #define STM32WB0x_LL_RADIO_TIMER_H
22 
23 #ifdef __cplusplus
24 extern "C" {
25 #endif
26 
27 /* Includes ------------------------------------------------------------------*/
28 
29 /** @addtogroup STM32WB0x_LL_Driver
30   * @{
31   */
32 
33 /** @addtogroup RADIO_TIMER_LL
34   * @{
35   */
36 
37 /* Private types -------------------------------------------------------------*/
38 /* Private variables ---------------------------------------------------------*/
39 /* Private constants ---------------------------------------------------------*/
40 /* Private macros ------------------------------------------------------------*/
41 /* Exported types ------------------------------------------------------------*/
42 /* Exported constants --------------------------------------------------------*/
43 
44 /** @defgroup RADIO_TIMER_LL_TIMERS Radio & Wakeup Timer definitions
45   * @{
46   */
47 #define LL_RADIO_BLE_WAKEUP_TIMER    0x00000000U
48 #define LL_RADIO_CPU_WAKEUP_TIMER    0x00000001U
49 #define LL_RADIO_TIMER_1             0x00000002U
50 #define LL_RADIO_TIMER_2             0x00000003U
51 /**
52   * @}
53   */
54 
55 /** @defgroup RADIO_TIMER_LL_TIMERS_FLAG Flag Defines
56   * @{
57   */
58 #define LL_RADIO_TIMECAPTURETRIGF BLUE_STATUSREG_TIMECAPTURETRIG
59 /**
60   * @}
61   */
62 
63 /** @defgroup RADIO_TIMER_LL_TIMERS_INT Interrupt Defines
64   * @{
65   */
66 #define LL_RADIO_BLE_WAKEUP_IT WAKEUP_WAKEUP_BLE_IRQ_ENABLE_WAKEUP_IT
67 #define LL_RADIO_CPU_WAKEUP_IT WAKEUP_WAKEUP_CM0_IRQ_ENABLE_WAKEUP_IT
68 /**
69   * @}
70   */
71 
72 /* Exported macro ------------------------------------------------------------*/
73 /* Exported functions --------------------------------------------------------*/
74 /** @defgroup RADIO_TIMER_LL_Exported_Functions Radio Timer Exported Functions
75   * @{
76   */
77 
78 /** @defgroup RADIO_TIMER_LL_EF_Radio_Timer_Configuration Radio Timer configuration
79   * @{
80   */
81 
82 /**
83   * @brief  Enable Radio Timer1.
84   * @rmtoll TIMEOUTDESTREG    DESTINATION   LL_RADIO_TIMER_EnableTimer1
85   * @param  BLUEx Radio Timer instance
86   * @retval None
87   */
LL_RADIO_TIMER_EnableTimer1(BLUE_TypeDef * BLUEx)88 __STATIC_INLINE void LL_RADIO_TIMER_EnableTimer1(BLUE_TypeDef *BLUEx)
89 {
90   MODIFY_REG_FIELD(BLUEx->TIMEOUTDESTREG, BLUE_TIMEOUTDESTREG_DESTINATION, LL_RADIO_TIMER_1);
91 }
92 
93 /**
94   * @brief  Disable Radio Timer1.
95   * @rmtoll TIMEOUTDESTREG   DESTINATION   LL_RADIO_TIMER_DisableTimer1
96   * @param  BLUEx Radio Timer instance
97   * @retval None
98   */
LL_RADIO_TIMER_DisableTimer1(BLUE_TypeDef * BLUEx)99 __STATIC_INLINE void LL_RADIO_TIMER_DisableTimer1(BLUE_TypeDef *BLUEx)
100 {
101   MODIFY_REG_FIELD(BLUEx->TIMEOUTDESTREG, BLUE_TIMEOUTDESTREG_DESTINATION, 0);
102 }
103 
104 /**
105   * @brief  Indicates if Radio Timer1 is enabled.
106   * @rmtoll TIMEOUTDESTREG   DESTINATION   LL_RADIO_TIMER_IsEnabledTimer1
107   * @param  BLUEx Radio Timer instance
108   * @retval State of bit (1 or 0).
109   */
LL_RADIO_TIMER_IsEnabledTimer1(BLUE_TypeDef * BLUEx)110 __STATIC_INLINE uint32_t LL_RADIO_TIMER_IsEnabledTimer1(BLUE_TypeDef *BLUEx)
111 {
112   return ((READ_BIT(BLUEx->TIMEOUTDESTREG, BLUE_TIMEOUTDESTREG_DESTINATION) == (LL_RADIO_TIMER_1)) ? 1UL : 0UL);
113 }
114 
115 /**
116   * @brief  Enable Radio Timer2.
117   * @rmtoll TIMEOUTDESTREG    DESTINATION   LL_RADIO_TIMER_EnableTimer2
118   * @param  BLUEx Radio Timer instance
119   * @retval None
120   */
LL_RADIO_TIMER_EnableTimer2(BLUE_TypeDef * BLUEx)121 __STATIC_INLINE void LL_RADIO_TIMER_EnableTimer2(BLUE_TypeDef *BLUEx)
122 {
123   MODIFY_REG_FIELD(BLUEx->TIMEOUTDESTREG, BLUE_TIMEOUTDESTREG_DESTINATION, LL_RADIO_TIMER_2);
124 }
125 
126 /**
127   * @brief  Disable Radio Timer2.
128   * @rmtoll TIMEOUTDESTREG   DESTINATION   LL_RADIO_TIMER_DisableTimer2
129   * @param  BLUEx Radio Timer instance
130   * @retval None
131   */
LL_RADIO_TIMER_DisableTimer2(BLUE_TypeDef * BLUEx)132 __STATIC_INLINE void LL_RADIO_TIMER_DisableTimer2(BLUE_TypeDef *BLUEx)
133 {
134   MODIFY_REG_FIELD(BLUEx->TIMEOUTDESTREG, BLUE_TIMEOUTDESTREG_DESTINATION, 0);
135 }
136 
137 /**
138   * @brief  Indicates if Radio Timer2 is enabled.
139   * @rmtoll TIMEOUTDESTREG   DESTINATION   LL_RADIO_TIMER_IsEnabledTimer2
140   * @param  BLUEx Radio Timer instance
141   * @retval State of bit (1 or 0).
142   */
LL_RADIO_TIMER_IsEnabledTimer2(BLUE_TypeDef * BLUEx)143 __STATIC_INLINE uint32_t LL_RADIO_TIMER_IsEnabledTimer2(BLUE_TypeDef *BLUEx)
144 {
145   return ((READ_BIT(BLUEx->TIMEOUTDESTREG, BLUE_TIMEOUTDESTREG_DESTINATION) == (LL_RADIO_TIMER_2)) ? 1UL : 0UL);
146 }
147 
148 /**
149   * @brief  Set the Radio Timer Timeout. Time units in microseconds for Timer2
150   *         or in periods of 512 kHz clock for Timer1 (Interpolated Time).
151   * @param  BLUEx Radio Timer instance
152   * @param  timeout
153   * @retval None
154   */
LL_RADIO_TIMER_SetTimeout(BLUE_TypeDef * BLUEx,uint32_t timeout)155 __STATIC_INLINE void LL_RADIO_TIMER_SetTimeout(BLUE_TypeDef *BLUEx, uint32_t timeout)
156 {
157   WRITE_REG(BLUEx->TIMEOUTREG, timeout);
158 }
159 
160 /**
161   * @brief  Get the Radio Timer Timeout. Time units in microseconds for Timer2
162   *         or in periods of 512 kHz clock for Timer1 (Interpolated Time).
163   * @param  BLUEx Radio Timer instance
164   * @retval Timeout configured
165   */
LL_RADIO_TIMER_GetTimeout(BLUE_TypeDef * BLUEx)166 __STATIC_INLINE uint32_t LL_RADIO_TIMER_GetTimeout(BLUE_TypeDef *BLUEx)
167 {
168   return (uint32_t)(READ_REG(BLUEx->TIMEOUTREG));
169 }
170 
171 /**
172   * @brief  Get the Radio Timer value from the beginning of a new Bluetooth LE sequence.
173   *         The granularity is the interpolated absolute time.
174   * @param  BLUEx Radio Timer instance
175   * @retval Time from the beginning of a new BLE sequence
176   */
LL_RADIO_TIMER_GetTimerCapture(BLUE_TypeDef * BLUEx)177 __STATIC_INLINE uint32_t LL_RADIO_TIMER_GetTimerCapture(BLUE_TypeDef *BLUEx)
178 {
179   return (uint32_t)(READ_REG(BLUEx->TIMERCAPTUREREG));
180 }
181 
182 /**
183   * @}
184   */
185 
186 /** @defgroup RADIO_TIMER_LL_EF_Wakeup_Timer_Configuration Radio Wakeup Timer configuration
187   * @{
188   */
189 
190 /**
191   * @brief  Enable Radio BLE Wakeup Timer.
192   * @rmtoll BLUE_SLEEP_REQUEST_MODE    BLE_WAKEUP_EN   LL_RADIO_TIMER_EnableBLEWakeupTimer
193   * @param  WAKEUPx Radio Timer instance
194   * @retval None
195   */
LL_RADIO_TIMER_EnableBLEWakeupTimer(WAKEUP_TypeDef * WAKEUPx)196 __STATIC_INLINE void LL_RADIO_TIMER_EnableBLEWakeupTimer(WAKEUP_TypeDef *WAKEUPx)
197 {
198   SET_BIT(WAKEUPx->BLUE_SLEEP_REQUEST_MODE, WAKEUP_BLUE_SLEEP_REQUEST_MODE_BLE_WAKEUP_EN);
199 }
200 
201 /**
202   * @brief  Disable Radio BLE Wakeup Timer.
203   * @rmtoll BLUE_SLEEP_REQUEST_MODE    BLE_WAKEUP_EN   LL_RADIO_TIMER_DisableBLEWakeupTimer
204   * @param  WAKEUPx Radio Timer instance
205   * @retval None
206   */
LL_RADIO_TIMER_DisableBLEWakeupTimer(WAKEUP_TypeDef * WAKEUPx)207 __STATIC_INLINE void LL_RADIO_TIMER_DisableBLEWakeupTimer(WAKEUP_TypeDef *WAKEUPx)
208 {
209   CLEAR_BIT(WAKEUPx->BLUE_SLEEP_REQUEST_MODE, WAKEUP_BLUE_SLEEP_REQUEST_MODE_BLE_WAKEUP_EN);
210 }
211 
212 /**
213   * @brief  Indicates if BLE Wakeup Timer is enabled.
214   * @rmtoll BLUE_SLEEP_REQUEST_MODE    BLE_WAKEUP_EN   LL_RADIO_TIMER_IsEnabledBLEWakeupTimer
215   * @param  WAKEUPx Radio Timer instance
216   * @retval State of bit (1 or 0).
217   */
LL_RADIO_TIMER_IsEnabledBLEWakeupTimer(WAKEUP_TypeDef * WAKEUPx)218 __STATIC_INLINE uint32_t LL_RADIO_TIMER_IsEnabledBLEWakeupTimer(WAKEUP_TypeDef *WAKEUPx)
219 {
220   return ((READ_BIT(WAKEUPx->BLUE_SLEEP_REQUEST_MODE, WAKEUP_BLUE_SLEEP_REQUEST_MODE_BLE_WAKEUP_EN) == (WAKEUP_BLUE_SLEEP_REQUEST_MODE_BLE_WAKEUP_EN)) ? 1UL : 0UL);
221 }
222 
223 /**
224   * @brief  Enable Radio CPU Wakeup Timer.
225   * @rmtoll CM0_SLEEP_REQUEST_MODE    CPU_WAKEUP_EN   LL_RADIO_TIMER_EnableCPUWakeupTimer
226   * @param  WAKEUPx Radio Timer instance
227   * @retval None
228   */
LL_RADIO_TIMER_EnableCPUWakeupTimer(WAKEUP_TypeDef * WAKEUPx)229 __STATIC_INLINE void LL_RADIO_TIMER_EnableCPUWakeupTimer(WAKEUP_TypeDef *WAKEUPx)
230 {
231   SET_BIT(WAKEUPx->CM0_SLEEP_REQUEST_MODE, WAKEUP_CM0_SLEEP_REQUEST_MODE_CPU_WAKEUP_EN);
232 }
233 
234 /**
235   * @brief  Disable Radio CPU Wakeup Timer.
236   * @rmtoll CM0_SLEEP_REQUEST_MODE    CPU_WAKEUP_EN   LL_RADIO_TIMER_DisableCPUWakeupTimer
237   * @param  WAKEUPx Radio Timer instance
238   * @retval None
239   */
LL_RADIO_TIMER_DisableCPUWakeupTimer(WAKEUP_TypeDef * WAKEUPx)240 __STATIC_INLINE void LL_RADIO_TIMER_DisableCPUWakeupTimer(WAKEUP_TypeDef *WAKEUPx)
241 {
242   CLEAR_BIT(WAKEUPx->CM0_SLEEP_REQUEST_MODE, WAKEUP_CM0_SLEEP_REQUEST_MODE_CPU_WAKEUP_EN);
243 }
244 
245 /**
246   * @brief  Indicates if CPU Wakeup Timer is enabled.
247   * @rmtoll CM0_SLEEP_REQUEST_MODE    CPU_WAKEUP_EN   LL_RADIO_TIMER_IsEnabledCPUWakeupTimer
248   * @param  WAKEUPx Radio Timer instance
249   * @retval State of bit (1 or 0).
250   */
LL_RADIO_TIMER_IsEnabledCPUWakeupTimer(WAKEUP_TypeDef * WAKEUPx)251 __STATIC_INLINE uint32_t LL_RADIO_TIMER_IsEnabledCPUWakeupTimer(WAKEUP_TypeDef *WAKEUPx)
252 {
253   return ((READ_BIT(WAKEUPx->CM0_SLEEP_REQUEST_MODE, WAKEUP_CM0_SLEEP_REQUEST_MODE_CPU_WAKEUP_EN) == (WAKEUP_CM0_SLEEP_REQUEST_MODE_CPU_WAKEUP_EN)) ? 1UL : 0UL);
254 }
255 
256 /**
257   * @brief  Set the Wakeup Offset to let time to power and clocks to settle (Granularity slow clock period).
258   * @param  WAKEUPx Radio Timer instance
259   * @param  Time Time in slow clock period
260   * @retval None
261   */
LL_RADIO_TIMER_SetWakeupOffset(WAKEUP_TypeDef * WAKEUPx,uint8_t Time)262 __STATIC_INLINE void LL_RADIO_TIMER_SetWakeupOffset(WAKEUP_TypeDef *WAKEUPx, uint8_t Time)
263 {
264   WRITE_REG(WAKEUPx->WAKEUP_OFFSET[0], (Time & 0xFF));
265 }
266 
267 /**
268   * @brief  Get the Wakeup Offset (Granularity slow clock period).
269   * @param  WAKEUPx Radio Timer instance
270   * @retval Wakeup Time Offset (Granulary slow clock period, size 8 bit)
271   */
LL_RADIO_TIMER_GetWakeupOffset(WAKEUP_TypeDef * WAKEUPx)272 __STATIC_INLINE uint32_t LL_RADIO_TIMER_GetWakeupOffset(WAKEUP_TypeDef *WAKEUPx)
273 {
274   return (uint32_t)(READ_REG(WAKEUPx->WAKEUP_OFFSET[0] & 0xFF));
275 }
276 
277 /**
278   * @brief  Set the BLE Wakeup Time (Granularity unit is in 16 x slow clock period).
279   * @param  WAKEUPx Radio Timer instance
280   * @param  Time in 16 x slow clock period
281   * @retval None
282   */
LL_RADIO_TIMER_SetBLEWakeupTime(WAKEUP_TypeDef * WAKEUPx,uint32_t Time)283 __STATIC_INLINE void LL_RADIO_TIMER_SetBLEWakeupTime(WAKEUP_TypeDef *WAKEUPx, uint32_t Time)
284 {
285   WRITE_REG(WAKEUPx->BLUE_WAKEUP_TIME, Time);
286 }
287 
288 /**
289   * @brief  Get the BLE Wakeup Time (Granularity unit is 16 x slow clock period).
290   * @param  WAKEUPx Radio Timer instance
291   * @retval BLE Wakeup Time
292   */
LL_RADIO_TIMER_GetBLEWakeupTime(WAKEUP_TypeDef * WAKEUPx)293 __STATIC_INLINE uint32_t LL_RADIO_TIMER_GetBLEWakeupTime(WAKEUP_TypeDef *WAKEUPx)
294 {
295   return (uint32_t)(READ_REG(WAKEUPx->BLUE_WAKEUP_TIME));
296 }
297 
298 /**
299   * @brief  Set the CPU Wakeup Time (Granularity unit is slow clock period).
300   *         Only the first 28 MSB bit are considered.
301   * @param  WAKEUPx Radio Timer instance
302   * @param  Time in slow clock period
303   * @retval None
304   */
LL_RADIO_TIMER_SetCPUWakeupTime(WAKEUP_TypeDef * WAKEUPx,uint32_t Time)305 __STATIC_INLINE void LL_RADIO_TIMER_SetCPUWakeupTime(WAKEUP_TypeDef *WAKEUPx, uint32_t Time)
306 {
307   WRITE_REG(WAKEUPx->CM0_WAKEUP_TIME, Time);
308 }
309 
310 /**
311   * @brief  Get the CPU Wakeup Time (Granularity unit is slow clock period).
312   * @param  WAKEUPx Radio Timer instance
313   * @retval CPU Wakeup Time
314   */
LL_RADIO_TIMER_GetCPUWakeupTime(WAKEUP_TypeDef * WAKEUPx)315 __STATIC_INLINE uint32_t LL_RADIO_TIMER_GetCPUWakeupTime(WAKEUP_TypeDef *WAKEUPx)
316 {
317   return (uint32_t)(READ_REG(WAKEUPx->CM0_WAKEUP_TIME));
318 }
319 
320 /**
321   * @brief  Get the Absolute Time of the wakeup timer (Granularity unit is 16 x slow clock period).
322   * @param  WAKEUPx Radio Timer instance
323   * @retval Absolute Time of Wakeup Timer
324   */
LL_RADIO_TIMER_GetAbsoluteTime(WAKEUP_TypeDef * WAKEUPx)325 __STATIC_INLINE uint32_t LL_RADIO_TIMER_GetAbsoluteTime(WAKEUP_TypeDef *WAKEUPx)
326 {
327   return (uint32_t)(READ_REG(WAKEUPx->ABSOLUTE_TIME));
328 }
329 
330 /**
331   * @}
332   */
333 
334 
335 /** @defgroup RADIO_TIMER_LL_EF_Low_Power_Timer_Configuration Radio Timer Low Power configuration
336   * @{
337   */
338 
339 /**
340   * @brief  Enable the Low Power Mode for the Wakeup Radio Timers.
341   * @rmtoll BLUE_SLEEP_REQUEST_MODE    SLEEP_EN   LL_RADIO_TIMER_EnableWakeupTimerLowPowerMode
342   * @param  WAKEUPx Radio Timer instance
343   * @retval None
344   */
LL_RADIO_TIMER_EnableWakeupTimerLowPowerMode(WAKEUP_TypeDef * WAKEUPx)345 __STATIC_INLINE void LL_RADIO_TIMER_EnableWakeupTimerLowPowerMode(WAKEUP_TypeDef *WAKEUPx)
346 {
347   SET_BIT(WAKEUPx->BLUE_SLEEP_REQUEST_MODE, WAKEUP_BLUE_SLEEP_REQUEST_MODE_SLEEP_EN);
348 }
349 
350 /**
351   * @brief  Disable the Low Power Mode for the Wakeup Radio Timers.
352   * @rmtoll BLUE_SLEEP_REQUEST_MODE    SLEEP_EN   LL_RADIO_TIMER_DisableWakeupTimerLowPowerMode
353   * @param  WAKEUPx Radio Timer instance
354   * @retval None
355   */
LL_RADIO_TIMER_DisableWakeupTimerLowPowerMode(WAKEUP_TypeDef * WAKEUPx)356 __STATIC_INLINE void LL_RADIO_TIMER_DisableWakeupTimerLowPowerMode(WAKEUP_TypeDef *WAKEUPx)
357 {
358   CLEAR_BIT(WAKEUPx->BLUE_SLEEP_REQUEST_MODE, WAKEUP_BLUE_SLEEP_REQUEST_MODE_SLEEP_EN);
359 }
360 
361 /**
362   * @brief  Indicates if Wakeup Radio Timer Low Power Mode is enabled.
363   * @rmtoll BLUE_SLEEP_REQUEST_MODE    SLEEP_EN   LL_RADIO_TIMER_IsEnabledWakeupTimerLowPowerMode
364   * @param  WAKEUPx Radio Timer instance
365   * @retval State of bit (1 or 0).
366   */
LL_RADIO_TIMER_IsEnabledWakeupTimerLowPowerMode(WAKEUP_TypeDef * WAKEUPx)367 __STATIC_INLINE uint32_t LL_RADIO_TIMER_IsEnabledWakeupTimerLowPowerMode(WAKEUP_TypeDef *WAKEUPx)
368 {
369   return ((READ_BIT(WAKEUPx->BLUE_SLEEP_REQUEST_MODE, WAKEUP_BLUE_SLEEP_REQUEST_MODE_SLEEP_EN) == (WAKEUP_BLUE_SLEEP_REQUEST_MODE_SLEEP_EN)) ? 1UL : 0UL);
370 }
371 
372 /**
373   * @brief  Enable the SoC to go in low power mode always whatever is the radio status.
374   * @rmtoll BLUE_SLEEP_REQUEST_MODE    FORCE_SLEEPING   LL_RADIO_TIMER_EnableBLEWakeupTimerForceSleeping
375   * @param  WAKEUPx Radio Timer instance
376   * @retval None
377   */
LL_RADIO_TIMER_EnableBLEWakeupTimerForceSleeping(WAKEUP_TypeDef * WAKEUPx)378 __STATIC_INLINE void LL_RADIO_TIMER_EnableBLEWakeupTimerForceSleeping(WAKEUP_TypeDef *WAKEUPx)
379 {
380   SET_BIT(WAKEUPx->BLUE_SLEEP_REQUEST_MODE, WAKEUP_BLUE_SLEEP_REQUEST_MODE_FORCE_SLEEPING);
381 }
382 
383 /**
384   * @brief  Disable the SoC to go in low power mode always.
385   * @rmtoll BLUE_SLEEP_REQUEST_MODE    FORCE_SLEEPING   LL_RADIO_TIMER_DisableBLEWakeupTimerForceSleeping
386   * @param  WAKEUPx Radio Timer instance
387   * @retval None
388   */
LL_RADIO_TIMER_DisableBLEWakeupTimerForceSleeping(WAKEUP_TypeDef * WAKEUPx)389 __STATIC_INLINE void LL_RADIO_TIMER_DisableBLEWakeupTimerForceSleeping(WAKEUP_TypeDef *WAKEUPx)
390 {
391   CLEAR_BIT(WAKEUPx->BLUE_SLEEP_REQUEST_MODE, WAKEUP_BLUE_SLEEP_REQUEST_MODE_FORCE_SLEEPING);
392 }
393 
394 /**
395   * @brief  Indicates if BLUE Wakeup Radio Timer Force Sleeping Mode is enabled.
396   * @rmtoll BLUE_SLEEP_REQUEST_MODE    FORCE_SLEEPING   LL_RADIO_TIMER_IsEnabledBLEWakeupTimerForceSleeping
397   * @param  WAKEUPx Radio Timer instance
398   * @retval State of bit (1 or 0).
399   */
LL_RADIO_TIMER_IsEnabledBLEWakeupTimerForceSleeping(WAKEUP_TypeDef * WAKEUPx)400 __STATIC_INLINE uint32_t LL_RADIO_TIMER_IsEnabledBLEWakeupTimerForceSleeping(WAKEUP_TypeDef *WAKEUPx)
401 {
402   return ((READ_BIT(WAKEUPx->BLUE_SLEEP_REQUEST_MODE, WAKEUP_BLUE_SLEEP_REQUEST_MODE_FORCE_SLEEPING) == (WAKEUP_BLUE_SLEEP_REQUEST_MODE_FORCE_SLEEPING)) ? 1UL : 0UL);
403 }
404 
405 /**
406   * @brief  Enable the CPU to be considered always as sleeping by the wakeup block.
407   * @rmtoll CM0_SLEEP_REQUEST_MODE    FORCE_SLEEPING   LL_RADIO_TIMER_EnableCPUWakeupTimerForceSleeping
408   * @param  WAKEUPx Radio Timer instance
409   * @retval None
410   */
LL_RADIO_TIMER_EnableCPUWakeupTimerForceSleeping(WAKEUP_TypeDef * WAKEUPx)411 __STATIC_INLINE void LL_RADIO_TIMER_EnableCPUWakeupTimerForceSleeping(WAKEUP_TypeDef *WAKEUPx)
412 {
413   SET_BIT(WAKEUPx->CM0_SLEEP_REQUEST_MODE, WAKEUP_CM0_SLEEP_REQUEST_MODE_FORCE_SLEEPING);
414 }
415 
416 /**
417   * @brief  Disable the CPU to be considered always as sleeping by the wakeup block.
418   * @rmtoll CM0_SLEEP_REQUEST_MODE    FORCE_SLEEPING   LL_RADIO_TIMER_DisableCPUWakeupTimerForceSleeping
419   * @param  WAKEUPx Radio Timer instance
420   * @retval None
421   */
LL_RADIO_TIMER_DisableCPUWakeupTimerForceSleeping(WAKEUP_TypeDef * WAKEUPx)422 __STATIC_INLINE void LL_RADIO_TIMER_DisableCPUWakeupTimerForceSleeping(WAKEUP_TypeDef *WAKEUPx)
423 {
424   CLEAR_BIT(WAKEUPx->CM0_SLEEP_REQUEST_MODE, WAKEUP_CM0_SLEEP_REQUEST_MODE_FORCE_SLEEPING);
425 }
426 
427 /**
428   * @brief  Indicates if CPU Wakeup Radio Timer Force Sleeping Mode is enabled.
429   * @rmtoll CM0_SLEEP_REQUEST_MODE    FORCE_SLEEPING   LL_RADIO_TIMER_IsEnabledCPUWakeupTimerForceSleeping
430   * @param  WAKEUPx Radio Timer instance
431   * @retval State of bit (1 or 0).
432   */
LL_RADIO_TIMER_IsEnabledCPUWakeupTimerForceSleeping(WAKEUP_TypeDef * WAKEUPx)433 __STATIC_INLINE uint32_t LL_RADIO_TIMER_IsEnabledCPUWakeupTimerForceSleeping(WAKEUP_TypeDef *WAKEUPx)
434 {
435   return ((READ_BIT(WAKEUPx->CM0_SLEEP_REQUEST_MODE, WAKEUP_CM0_SLEEP_REQUEST_MODE_FORCE_SLEEPING) == (WAKEUP_CM0_SLEEP_REQUEST_MODE_FORCE_SLEEPING)) ? 1UL : 0UL);
436 }
437 
438 /**
439   * @brief  Set the sleep request mode.
440   * @rmtoll CM0_SLEEP_REQUEST_MODE    SLEEP_REQ_MODE   LL_RADIO_TIMER_SetSleepRequestMode
441   * @param  WAKEUPx Radio Timer instance
442   * @param  mode Sleep mode value in range 0-7
443   * @retval None.
444   */
LL_RADIO_TIMER_SetSleepRequestMode(WAKEUP_TypeDef * WAKEUPx,uint8_t mode)445 __STATIC_INLINE void LL_RADIO_TIMER_SetSleepRequestMode(WAKEUP_TypeDef *WAKEUPx, uint8_t mode)
446 {
447 #if defined(STM32WB09)
448   return;
449 #else
450   MODIFY_REG_FIELD(WAKEUP->BLUE_SLEEP_REQUEST_MODE, WAKEUP_BLUE_SLEEP_REQUEST_MODE_SLEEP_REQ_MODE, (mode & 0x7));
451 #endif
452 }
453 
454 /**
455   * @brief  Get the sleep request mode.
456   * @rmtoll CM0_SLEEP_REQUEST_MODE    SLEEP_REQ_MODE   LL_RADIO_TIMER_GetSleepRequestMode
457   * @param  WAKEUPx Radio Timer instance
458   * @retval Sleep mode value in range 0-7
459   */
LL_RADIO_TIMER_GetSleepRequestMode(WAKEUP_TypeDef * WAKEUPx)460 __STATIC_INLINE uint32_t LL_RADIO_TIMER_GetSleepRequestMode(WAKEUP_TypeDef *WAKEUPx)
461 {
462 #if defined(STM32WB09)
463   return 0;
464 #else
465   return (uint32_t)(READ_REG(WAKEUP->BLUE_SLEEP_REQUEST_MODE) & WAKEUP_BLUE_SLEEP_REQUEST_MODE_SLEEP_REQ_MODE);
466 #endif
467 }
468 
469 /**
470   * @}
471   */
472 
473 /** @defgroup RADIO_TIMER_LL_EF_IT_Management IT-Management
474   * @{
475   */
476 
477 /**
478   * @brief  Enable the BLE wakeup interrupt towards the CPU.
479   * @rmtoll WAKEUP_BLE_IRQ_ENABLE    WAKEUP_IT   LL_RADIO_TIMER_EnableBLEWakeupIT
480   * @param  WAKEUPx Radio Timer instance
481   * @retval None
482   */
LL_RADIO_TIMER_EnableBLEWakeupIT(WAKEUP_TypeDef * WAKEUPx)483 __STATIC_INLINE void LL_RADIO_TIMER_EnableBLEWakeupIT(WAKEUP_TypeDef *WAKEUPx)
484 {
485   SET_BIT(WAKEUPx->WAKEUP_BLE_IRQ_ENABLE, WAKEUP_WAKEUP_BLE_IRQ_ENABLE_WAKEUP_IT);
486 }
487 
488 /**
489   * @brief  Disable the BLE wakeup interrupt towards the CPU.
490   * @rmtoll WAKEUP_BLE_IRQ_ENABLE    WAKEUP_IT   LL_RADIO_TIMER_DisableBLEWakeupIT
491   * @param  WAKEUPx Radio Timer instance
492   * @retval None
493   */
LL_RADIO_TIMER_DisableBLEWakeupIT(WAKEUP_TypeDef * WAKEUPx)494 __STATIC_INLINE void LL_RADIO_TIMER_DisableBLEWakeupIT(WAKEUP_TypeDef *WAKEUPx)
495 {
496   CLEAR_BIT(WAKEUPx->WAKEUP_BLE_IRQ_ENABLE, WAKEUP_WAKEUP_BLE_IRQ_ENABLE_WAKEUP_IT);
497 }
498 
499 /**
500   * @brief  Indicates if BLE wakeup interrupt towards the CPU is enabled.
501   * @rmtoll WAKEUP_BLE_IRQ_ENABLE    WAKEUP_IT   LL_RADIO_TIMER_IsEnabledBLEWakeupIT
502   * @param  WAKEUPx Radio Timer instance
503   * @retval State of bit (1 or 0).
504   */
LL_RADIO_TIMER_IsEnabledBLEWakeupIT(WAKEUP_TypeDef * WAKEUPx)505 __STATIC_INLINE uint32_t LL_RADIO_TIMER_IsEnabledBLEWakeupIT(WAKEUP_TypeDef *WAKEUPx)
506 {
507   return ((READ_BIT(WAKEUPx->WAKEUP_BLE_IRQ_ENABLE, WAKEUP_WAKEUP_BLE_IRQ_ENABLE_WAKEUP_IT) == (WAKEUP_WAKEUP_BLE_IRQ_ENABLE_WAKEUP_IT)) ? 1UL : 0UL);
508 }
509 
510 /**
511   * @brief  Enable the CPU wakeup interrupt towards the CPU.
512   * @rmtoll WAKEUP_CM0_IRQ_ENABLE    WAKEUP_IT   LL_RADIO_TIMER_EnableCPUWakeupIT
513   * @param  WAKEUPx Radio Timer instance
514   * @retval None
515   */
LL_RADIO_TIMER_EnableCPUWakeupIT(WAKEUP_TypeDef * WAKEUPx)516 __STATIC_INLINE void LL_RADIO_TIMER_EnableCPUWakeupIT(WAKEUP_TypeDef *WAKEUPx)
517 {
518   SET_BIT(WAKEUPx->WAKEUP_CM0_IRQ_ENABLE, WAKEUP_WAKEUP_CM0_IRQ_ENABLE_WAKEUP_IT);
519 }
520 
521 /**
522   * @brief  Disable the CPU wakeup interrupt towards the CPU.
523   * @rmtoll WAKEUP_CM0_IRQ_ENABLE    WAKEUP_IT   LL_RADIO_TIMER_DisableCPUWakeupIT
524   * @param  WAKEUPx Radio Timer instance
525   * @retval None
526   */
LL_RADIO_TIMER_DisableCPUWakeupIT(WAKEUP_TypeDef * WAKEUPx)527 __STATIC_INLINE void LL_RADIO_TIMER_DisableCPUWakeupIT(WAKEUP_TypeDef *WAKEUPx)
528 {
529   CLEAR_BIT(WAKEUPx->WAKEUP_CM0_IRQ_ENABLE, WAKEUP_WAKEUP_CM0_IRQ_ENABLE_WAKEUP_IT);
530 }
531 
532 /**
533   * @brief  Indicates if CPU wakeup interrupt towards the CPU is enabled.
534   * @rmtoll WAKEUP_CPU_IRQ_ENABLE    WAKEUP_IT   LL_RADIO_TIMER_IsEnabledCPUWakeupIT
535   * @param  WAKEUPx Radio Timer instance
536   * @retval State of bit (1 or 0).
537   */
LL_RADIO_TIMER_IsEnabledCPUWakeupIT(WAKEUP_TypeDef * WAKEUPx)538 __STATIC_INLINE uint32_t LL_RADIO_TIMER_IsEnabledCPUWakeupIT(WAKEUP_TypeDef *WAKEUPx)
539 {
540   return ((READ_BIT(WAKEUPx->WAKEUP_CM0_IRQ_ENABLE, WAKEUP_WAKEUP_CM0_IRQ_ENABLE_WAKEUP_IT) == (WAKEUP_WAKEUP_CM0_IRQ_ENABLE_WAKEUP_IT)) ? 1UL : 0UL);
541 }
542 
543 /**
544   * @}
545   */
546 
547 /** @defgroup RADIO_TIMER_LL_EF_FLAG_Management FLAG_Management
548   * @{
549   */
550 
551 /**
552   * @brief  Check if the Radio Timer Time Capture Triggert Flag is set or not
553   * @rmtoll STATUSREG    TIMECAPTURETRIG    LL_RADIO_TIMER_IsActiveFlag_TIMECAPTURETRIG
554   * @param  BLEx BLE Instance
555   * @retval State of bit (1 or 0).
556   */
LL_RADIO_TIMER_IsActiveFlag_TIMECAPTURETRIG(BLUE_TypeDef * BLEx)557 __STATIC_INLINE uint32_t LL_RADIO_TIMER_IsActiveFlag_TIMECAPTURETRIG(BLUE_TypeDef *BLEx)
558 {
559   return ((READ_BIT(BLEx->STATUSREG, BLUE_STATUSREG_TIMECAPTURETRIG) == (BLUE_STATUSREG_TIMECAPTURETRIG)) ? 1UL : 0UL);
560 }
561 
562 /**
563   * @brief  Clear the BLE Wakeup interrupt flag.
564   * @rmtoll WAKEUP_BLE_IRQ_STATUS   WAKEUP_IT   LL_RADIO_TIMER_ClearFlag_BLEWakeup
565   * @param  WAKEUPx Radio Timer instance
566   * @retval None
567   */
LL_RADIO_TIMER_ClearFlag_BLEWakeup(WAKEUP_TypeDef * WAKEUPx)568 __STATIC_INLINE void LL_RADIO_TIMER_ClearFlag_BLEWakeup(WAKEUP_TypeDef *WAKEUPx)
569 {
570   SET_BIT(WAKEUPx->WAKEUP_BLE_IRQ_STATUS, WAKEUP_WAKEUP_BLE_IRQ_STATUS_WAKEUP_IT);
571 }
572 
573 /**
574   * @brief  Indicate whether the BLE Wakeup interrupt flag is set
575   * @rmtoll WAKEUP_BLE_IRQ_STATUS   WAKEUP_IT   LL_RADIO_TIMER_IsActiveFlag_BLEWakeup
576   * @param  WAKEUPx Radio Timer instance
577   * @retval State of bit (1 or 0).
578   */
LL_RADIO_TIMER_IsActiveFlag_BLEWakeup(WAKEUP_TypeDef * WAKEUPx)579 __STATIC_INLINE uint32_t LL_RADIO_TIMER_IsActiveFlag_BLEWakeup(WAKEUP_TypeDef *WAKEUPx)
580 {
581   return ((READ_BIT(WAKEUPx->WAKEUP_BLE_IRQ_STATUS, WAKEUP_WAKEUP_BLE_IRQ_STATUS_WAKEUP_IT) == (WAKEUP_WAKEUP_BLE_IRQ_STATUS_WAKEUP_IT)) ? 1UL : 0UL);
582 }
583 
584 /**
585   * @brief  Clear the CPU Wakeup interrupt flag.
586   * @rmtoll WAKEUP_CM0_IRQ_STATUS   WAKEUP_IT   LL_RADIO_TIMER_ClearFlag_CPUWakeup
587   * @param  WAKEUPx Radio Timer instance
588   * @retval None
589   */
LL_RADIO_TIMER_ClearFlag_CPUWakeup(WAKEUP_TypeDef * WAKEUPx)590 __STATIC_INLINE void LL_RADIO_TIMER_ClearFlag_CPUWakeup(WAKEUP_TypeDef *WAKEUPx)
591 {
592   SET_BIT(WAKEUPx->WAKEUP_CM0_IRQ_STATUS, WAKEUP_WAKEUP_CM0_IRQ_STATUS_WAKEUP_IT);
593 }
594 
595 /**
596   * @brief  Indicate whether the CPU Wakeup interrupt flag is set
597   * @rmtoll WAKEUP_CM0_IRQ_STATUS   WAKEUP_IT   LL_RADIO_TIMER_IsActiveFlag_CPUWakeup
598   * @param  WAKEUPx Radio Timer instance
599   * @retval State of bit (1 or 0).
600   */
LL_RADIO_TIMER_IsActiveFlag_CPUWakeup(WAKEUP_TypeDef * WAKEUPx)601 __STATIC_INLINE uint32_t LL_RADIO_TIMER_IsActiveFlag_CPUWakeup(WAKEUP_TypeDef *WAKEUPx)
602 {
603   return ((READ_BIT(WAKEUPx->WAKEUP_CM0_IRQ_STATUS, WAKEUP_WAKEUP_CM0_IRQ_STATUS_WAKEUP_IT) == (WAKEUP_WAKEUP_CM0_IRQ_STATUS_WAKEUP_IT)) ? 1UL : 0UL);
604 }
605 
606 /**
607   * @}
608   */
609 
610 /** @defgroup RADIO_TIMER_LL_EF_LSI_CALIBRATION Radio Timer LSI calibration APIs
611   * @{
612   */
613 
614 /**
615   * @brief  Set the window length (in slow clock period) for slow clock measurement.
616   * @param RADIO_CTRLx: Radio Control instance
617   * @param  Count Slow clock is measured in a window of SLOW_COUNT+1 slow clock cycles
618   * @retval None
619   */
LL_RADIO_TIMER_SetLSIWindowCalibrationLength(RADIO_CTRL_TypeDef * RADIO_CTRLx,uint32_t Count)620 __STATIC_INLINE void LL_RADIO_TIMER_SetLSIWindowCalibrationLength(RADIO_CTRL_TypeDef *RADIO_CTRLx, uint32_t Count)
621 {
622   WRITE_REG(RADIO_CTRLx->CLK32COUNT_REG, Count);
623 }
624 
625 /**
626   * @brief  Get the window length (in slow clock period) for slow clock measurement.
627   * @param RADIO_CTRLx: Radio Control instance
628   * @retval The LSI Window Length used for the LSI calibration procedure
629   */
LL_RADIO_TIMER_GetLSIWindowCalibrationLength(RADIO_CTRL_TypeDef * RADIO_CTRLx)630 __STATIC_INLINE uint32_t LL_RADIO_TIMER_GetLSIWindowCalibrationLength(RADIO_CTRL_TypeDef *RADIO_CTRLx)
631 {
632   return (uint32_t)(READ_REG(RADIO_CTRLx->CLK32COUNT_REG));
633 }
634 
635 /**
636   * @brief  Start the LSI calibration procedure.
637   * @param RADIO_CTRLx: Radio Control instance
638   * @retval None
639   */
LL_RADIO_TIMER_StartLSICalibration(RADIO_CTRL_TypeDef * RADIO_CTRLx)640 __STATIC_INLINE void LL_RADIO_TIMER_StartLSICalibration(RADIO_CTRL_TypeDef *RADIO_CTRLx)
641 {
642   WRITE_REG(RADIO_CTRLx->CLK32PERIOD_REG, 0);
643 }
644 
645 /**
646   * @brief  Get the LSI clock Period calibrated.
647   * @param RADIO_CTRLx: Radio Control instance
648   * @retval The LSI clock period calibrated
649   */
LL_RADIO_TIMER_GetLSIPeriod(RADIO_CTRL_TypeDef * RADIO_CTRLx)650 __STATIC_INLINE uint32_t LL_RADIO_TIMER_GetLSIPeriod(RADIO_CTRL_TypeDef *RADIO_CTRLx)
651 {
652   return (uint32_t)(READ_REG(RADIO_CTRLx->CLK32PERIOD_REG));
653 }
654 
655 /**
656   * @brief  Get the LSI clock Frequency calibrated.
657   * @param RADIO_CTRLx: Radio Control instance
658   * @retval The LSI clock frequency calibrated
659   */
LL_RADIO_TIMER_GetLSIFrequency(RADIO_CTRL_TypeDef * RADIO_CTRLx)660 __STATIC_INLINE uint32_t LL_RADIO_TIMER_GetLSIFrequency(RADIO_CTRL_TypeDef *RADIO_CTRLx)
661 {
662   return (uint32_t)(READ_REG(RADIO_CTRLx->CLK32FREQUENCY_REG));
663 }
664 
665 /**
666   * @brief  Enable the LSI calibration ended interrupt.
667   * @param RADIO_CTRLx: Radio Control instance
668   * @retval None
669   */
LL_RADIO_TIMER_EnableLSICalibrationIT(RADIO_CTRL_TypeDef * RADIO_CTRLx)670 __STATIC_INLINE void LL_RADIO_TIMER_EnableLSICalibrationIT(RADIO_CTRL_TypeDef *RADIO_CTRLx)
671 {
672   SET_BIT(RADIO_CTRLx->RADIO_CONTROL_IRQ_ENABLE, RADIO_CTRL_RADIO_CONTROL_IRQ_ENABLE_SLOW_CLK_IRQ_MASK);
673 }
674 
675 /**
676   * @brief  Disable the LSI calibration ended interrupt.
677   * @param RADIO_CTRLx: Radio Control instance
678   * @retval None
679   */
LL_RADIO_TIMER_DisableLSICalibrationEndedIT(RADIO_CTRL_TypeDef * RADIO_CTRLx)680 __STATIC_INLINE void LL_RADIO_TIMER_DisableLSICalibrationEndedIT(RADIO_CTRL_TypeDef *RADIO_CTRLx)
681 {
682   CLEAR_BIT(RADIO_CTRLx->RADIO_CONTROL_IRQ_ENABLE, RADIO_CTRL_RADIO_CONTROL_IRQ_ENABLE_SLOW_CLK_IRQ_MASK);
683 }
684 
685 /**
686   * @brief  Indicates if the LSI calibration ended interrupt is enabled.
687   * @param RADIO_CTRLx: Radio Control instance
688   * @retval State of bit (1 or 0).
689   */
LL_RADIO_TIMER_IsEnabledLSICalibrationEndedIT(RADIO_CTRL_TypeDef * RADIO_CTRLx)690 __STATIC_INLINE uint32_t LL_RADIO_TIMER_IsEnabledLSICalibrationEndedIT(RADIO_CTRL_TypeDef *RADIO_CTRLx)
691 {
692   return ((READ_BIT(RADIO_CTRLx->RADIO_CONTROL_IRQ_ENABLE, RADIO_CTRL_RADIO_CONTROL_IRQ_ENABLE_SLOW_CLK_IRQ_MASK) == (RADIO_CTRL_RADIO_CONTROL_IRQ_ENABLE_SLOW_CLK_IRQ_MASK)) ? 1UL : 0UL);
693 }
694 
695 /**
696   * @brief  Clear the LSI calibration ended flag.
697   * @param RADIO_CTRLx: Radio Control instance
698   * @retval None
699   */
LL_RADIO_TIMER_ClearFlag_LSICalibrationEnded(RADIO_CTRL_TypeDef * RADIO_CTRLx)700 __STATIC_INLINE void LL_RADIO_TIMER_ClearFlag_LSICalibrationEnded(RADIO_CTRL_TypeDef *RADIO_CTRLx)
701 {
702   SET_BIT(RADIO_CTRLx->RADIO_CONTROL_IRQ_STATUS, RADIO_CTRL_RADIO_CONTROL_IRQ_STATUS_SLOW_CLK_IRQ);
703 }
704 
705 /**
706   * @brief  Check if the LSI calibration ended flag is set or not.
707   * @param RADIO_CTRLx: Radio Control instance
708   * @retval State of bit (1 or 0).
709   */
LL_RADIO_TIMER_IsActiveFlag_LSICalibrationEnded(RADIO_CTRL_TypeDef * RADIO_CTRLx)710 __STATIC_INLINE uint32_t LL_RADIO_TIMER_IsActiveFlag_LSICalibrationEnded(RADIO_CTRL_TypeDef *RADIO_CTRLx)
711 {
712   return ((READ_BIT(RADIO_CTRLx->RADIO_CONTROL_IRQ_STATUS, RADIO_CTRL_RADIO_CONTROL_IRQ_STATUS_SLOW_CLK_IRQ) == (RADIO_CTRL_RADIO_CONTROL_IRQ_STATUS_SLOW_CLK_IRQ)) ? 1UL : 0UL);
713 }
714 
715 /**
716   * @}
717   */
718 
719 /**
720   * @}
721   */
722 
723 /**
724   * @}
725   */
726 
727 /**
728   * @}
729   */
730 
731 #ifdef __cplusplus
732 }
733 #endif
734 
735 #endif /* STM32WB0x_LL_RADIO_TIMER_H */
736