2 ******************************************************************************
3 * @file stm32h7xx_hal_hsem.c
4 * @author MCD Application Team
5 * @brief HSEM HAL module driver.
6 * This file provides firmware functions to manage the following
7 * functionalities of the semaphore peripheral:
8 * + Semaphore Take function (2-Step Procedure) , non blocking
9 * + Semaphore FastTake function (1-Step Procedure) , non blocking
10 * + Semaphore Status check
11 * + Semaphore Clear Key Set and Get
12 * + Release and release all functions
13 * + Semaphore notification enabling and disabling and callnack functions
14 * + IRQ handler management
18 ==============================================================================
19 ##### How to use this driver #####
20 ==============================================================================
22 (#)Take a semaphore In 2-Step mode Using function HAL_HSEM_Take. This function takes as parameters :
23 (++) the semaphore ID from 0 to 31
24 (++) the process ID from 0 to 255
25 (#) Fast Take semaphore In 1-Step mode Using function HAL_HSEM_FastTake. This function takes as parameter :
26 (++) the semaphore ID from 0_ID to 31. Note that the process ID value is implicitly assumed as zero
27 (#) Check if a semaphore is Taken using function HAL_HSEM_IsSemTaken. This function takes as parameter :
28 (++) the semaphore ID from 0_ID to 31
29 (++) It returns 1 if the given semaphore is taken otherwise (Free) zero
30 (#)Release a semaphore using function with HAL_HSEM_Release. This function takes as parameters :
31 (++) the semaphore ID from 0 to 31
32 (++) the process ID from 0 to 255:
33 (++) Note: If ProcessID and MasterID match, semaphore is freed, and an interrupt
34 may be generated when enabled (notification activated). If ProcessID or MasterID does not match,
35 semaphore remains taken (locked)
37 (#)Release all semaphores at once taken by a given Master using function HAL_HSEM_Release_All
38 This function takes as parameters :
39 (++) the Release Key (value from 0 to 0xFFFF) can be Set or Get respectively by
40 HAL_HSEM_SetClearKey() or HAL_HSEM_GetClearKey functions
42 (++) Note: If the Key and MasterID match, all semaphores taken by the given CPU that corresponds
43 to MasterID will be freed, and an interrupt may be generated when enabled (notification activated). If the
44 Key or the MasterID doesn't match, semaphores remains taken (locked)
46 (#)Semaphores Release all key functions:
47 (++) HAL_HSEM_SetClearKey() to set semaphore release all Key
48 (++) HAL_HSEM_GetClearKey() to get release all Key
49 (#)Semaphores notification functions :
50 (++) HAL_HSEM_ActivateNotification to activate a notification callback on
51 a given semaphores Mask (bitfield). When one or more semaphores defined by the mask are released
52 the callback HAL_HSEM_FreeCallback will be asserted giving as parameters a mask of the released
53 semaphores (bitfield).
55 (++) HAL_HSEM_DeactivateNotification to deactivate the notification of a given semaphores Mask (bitfield).
56 (++) See the description of the macro __HAL_HSEM_SEMID_TO_MASK to check how to calculate a semaphore mask
57 Used by the notification functions
58 *** HSEM HAL driver macros list ***
59 =============================================
60 [..] Below the list of most used macros in HSEM HAL driver.
62 (+) __HAL_HSEM_SEMID_TO_MASK: Helper macro to convert a Semaphore ID to a Mask.
64 [..] mask = __HAL_HSEM_SEMID_TO_MASK(8) | __HAL_HSEM_SEMID_TO_MASK(21) | __HAL_HSEM_SEMID_TO_MASK(25).
65 [..] All next macros take as parameter a semaphore Mask (bitfiled) that can be constructed using __HAL_HSEM_SEMID_TO_MASK as the above example.
66 (+) __HAL_HSEM_ENABLE_IT: Enable the specified semaphores Mask interrupts.
67 (+) __HAL_HSEM_DISABLE_IT: Disable the specified semaphores Mask interrupts.
68 (+) __HAL_HSEM_GET_IT: Checks whether the specified semaphore interrupt has occurred or not.
69 (+) __HAL_HSEM_GET_FLAG: Get the semaphores status release flags.
70 (+) __HAL_HSEM_CLEAR_FLAG: Clear the semaphores status release flags.
73 ******************************************************************************
76 * <h2><center>© Copyright (c) 2017 STMicroelectronics.
77 * All rights reserved.</center></h2>
79 * This software component is licensed by ST under BSD 3-Clause license,
80 * the "License"; You may not use this file except in compliance with the
81 * License. You may obtain a copy of the License at:
82 * opensource.org/licenses/BSD-3-Clause
84 ******************************************************************************
87 /* Includes ------------------------------------------------------------------*/
88 #include "stm32h7xx_hal.h"
90 /** @addtogroup STM32H7xx_HAL_Driver
94 /** @defgroup HSEM HSEM
95 * @brief HSEM HAL module driver
99 #ifdef HAL_HSEM_MODULE_ENABLED
101 /* Private typedef -----------------------------------------------------------*/
102 /* Private define ------------------------------------------------------------*/
103 #if defined(DUAL_CORE)
104 #ifndef HSEM_R_MASTERID
105 #define HSEM_R_MASTERID HSEM_R_COREID
108 #ifndef HSEM_RLR_MASTERID
109 #define HSEM_RLR_MASTERID HSEM_RLR_COREID
112 #ifndef HSEM_CR_MASTERID
113 #define HSEM_CR_MASTERID HSEM_CR_COREID
115 #endif /* DUAL_CORE */
116 /* Private macro -------------------------------------------------------------*/
117 /* Private variables ---------------------------------------------------------*/
118 /* Private function prototypes -----------------------------------------------*/
119 /* Private functions ---------------------------------------------------------*/
120 /* Exported functions --------------------------------------------------------*/
122 /** @defgroup HSEM_Exported_Functions HSEM Exported Functions
126 /** @defgroup HSEM_Exported_Functions_Group1 Take and Release functions
127 * @brief HSEM Take and Release functions
130 ==============================================================================
131 ##### HSEM Take and Release functions #####
132 ==============================================================================
133 [..] This section provides functions allowing to:
134 (+) Take a semaphore with 2 Step method
135 (+) Fast Take a semaphore with 1 Step method
136 (+) Check semaphore state Taken or not
137 (+) Release a semaphore
138 (+) Release all semaphore at once
146 * @brief Take a semaphore in 2 Step mode.
147 * @param SemID: semaphore ID from 0 to 31
148 * @param ProcessID: Process ID from 0 to 255
151 HAL_StatusTypeDef
HAL_HSEM_Take(uint32_t SemID
, uint32_t ProcessID
)
153 /* Check the parameters */
154 assert_param(IS_HSEM_SEMID(SemID
));
155 assert_param(IS_HSEM_PROCESSID(ProcessID
));
157 #if USE_MULTI_CORE_SHARED_CODE != 0U
158 /* First step write R register with MasterID, processID and take bit=1*/
159 HSEM
->R
[SemID
] = ((ProcessID
& HSEM_R_PROCID
) | ((HAL_GetCurrentCPUID() << POSITION_VAL(HSEM_R_MASTERID
)) & HSEM_R_MASTERID
) | HSEM_R_LOCK
);
161 /* second step : read the R register . Take achieved if MasterID and processID match and take bit set to 1 */
162 if (HSEM
->R
[SemID
] == ((ProcessID
& HSEM_R_PROCID
) | ((HAL_GetCurrentCPUID() << POSITION_VAL(HSEM_R_MASTERID
)) & HSEM_R_MASTERID
) | HSEM_R_LOCK
))
164 /*take success when MasterID and ProcessID match and take bit set*/
168 /* First step write R register with MasterID, processID and take bit=1*/
169 HSEM
->R
[SemID
] = (ProcessID
| HSEM_CR_COREID_CURRENT
| HSEM_R_LOCK
);
171 /* second step : read the R register . Take achieved if MasterID and processID match and take bit set to 1 */
172 if (HSEM
->R
[SemID
] == (ProcessID
| HSEM_CR_COREID_CURRENT
| HSEM_R_LOCK
))
174 /*take success when MasterID and ProcessID match and take bit set*/
179 /* Semaphore take fails*/
184 * @brief Fast Take a semaphore with 1 Step mode.
185 * @param SemID: semaphore ID from 0 to 31
188 HAL_StatusTypeDef
HAL_HSEM_FastTake(uint32_t SemID
)
190 /* Check the parameters */
191 assert_param(IS_HSEM_SEMID(SemID
));
193 #if USE_MULTI_CORE_SHARED_CODE != 0U
194 /* Read the RLR register to take the semaphore */
195 if (HSEM
->RLR
[SemID
] == (((HAL_GetCurrentCPUID() << POSITION_VAL(HSEM_R_MASTERID
)) & HSEM_RLR_MASTERID
) | HSEM_RLR_LOCK
))
197 /*take success when MasterID match and take bit set*/
201 /* Read the RLR register to take the semaphore */
202 if (HSEM
->RLR
[SemID
] == (HSEM_CR_COREID_CURRENT
| HSEM_RLR_LOCK
))
204 /*take success when MasterID match and take bit set*/
209 /* Semaphore take fails */
213 * @brief Check semaphore state Taken or not.
214 * @param SemID: semaphore ID
215 * @retval HAL HSEM state
217 uint32_t HAL_HSEM_IsSemTaken(uint32_t SemID
)
219 return (((HSEM
->R
[SemID
] & HSEM_R_LOCK
) != 0U) ? 1UL : 0UL);
224 * @brief Release a semaphore.
225 * @param SemID: semaphore ID from 0 to 31
226 * @param ProcessID: Process ID from 0 to 255
229 void HAL_HSEM_Release(uint32_t SemID
, uint32_t ProcessID
)
231 /* Check the parameters */
232 assert_param(IS_HSEM_SEMID(SemID
));
233 assert_param(IS_HSEM_PROCESSID(ProcessID
));
235 /* Clear the semaphore by writing to the R register : the MasterID , the processID and take bit = 0 */
236 #if USE_MULTI_CORE_SHARED_CODE != 0U
237 HSEM
->R
[SemID
] = (ProcessID
| ((HAL_GetCurrentCPUID() << POSITION_VAL(HSEM_R_MASTERID
)) & HSEM_R_MASTERID
));
239 HSEM
->R
[SemID
] = (ProcessID
| HSEM_CR_COREID_CURRENT
);
245 * @brief Release All semaphore used by a given Master .
246 * @param Key: Semaphore Key , value from 0 to 0xFFFF
247 * @param CoreID: CoreID of the CPU that is using semaphores to be released
250 void HAL_HSEM_ReleaseAll(uint32_t Key
, uint32_t CoreID
)
252 assert_param(IS_HSEM_KEY(Key
));
253 assert_param(IS_HSEM_COREID(CoreID
));
255 HSEM
->CR
= ((Key
<< HSEM_CR_KEY_Pos
) | (CoreID
<< HSEM_CR_COREID_Pos
));
262 /** @defgroup HSEM_Exported_Functions_Group2 HSEM Set and Get Key functions
263 * @brief HSEM Set and Get Key functions.
266 ==============================================================================
267 ##### HSEM Set and Get Key functions #####
268 ==============================================================================
269 [..] This section provides functions allowing to:
270 (+) Set semaphore Key
271 (+) Get semaphore Key
278 * @brief Set semaphore Key .
279 * @param Key: Semaphore Key , value from 0 to 0xFFFF
282 void HAL_HSEM_SetClearKey(uint32_t Key
)
284 assert_param(IS_HSEM_KEY(Key
));
286 MODIFY_REG(HSEM
->KEYR
, HSEM_KEYR_KEY
, (Key
<< HSEM_KEYR_KEY_Pos
));
291 * @brief Get semaphore Key .
292 * @retval Semaphore Key , value from 0 to 0xFFFF
294 uint32_t HAL_HSEM_GetClearKey(void)
296 return (HSEM
->KEYR
>> HSEM_KEYR_KEY_Pos
);
303 /** @defgroup HSEM_Exported_Functions_Group3 HSEM IRQ handler management
304 * @brief HSEM Notification functions.
307 ==============================================================================
308 ##### HSEM IRQ handler management and Notification functions #####
309 ==============================================================================
310 [..] This section provides HSEM IRQ handler and Notification function.
317 * @brief Activate Semaphore release Notification for a given Semaphores Mask .
318 * @param SemMask: Mask of Released semaphores
319 * @retval Semaphore Key
321 void HAL_HSEM_ActivateNotification(uint32_t SemMask
)
323 #if USE_MULTI_CORE_SHARED_CODE != 0U
324 /*enable the semaphore mask interrupts */
325 if (HAL_GetCurrentCPUID() == HSEM_CPU1_COREID
)
327 /*Use interrupt line 0 for CPU1 Master */
328 HSEM
->C1IER
|= SemMask
;
330 else /* HSEM_CPU2_COREID */
332 /*Use interrupt line 1 for CPU2 Master*/
333 HSEM
->C2IER
|= SemMask
;
336 HSEM_COMMON
->IER
|= SemMask
;
341 * @brief Deactivate Semaphore release Notification for a given Semaphores Mask .
342 * @param SemMask: Mask of Released semaphores
343 * @retval Semaphore Key
345 void HAL_HSEM_DeactivateNotification(uint32_t SemMask
)
347 #if USE_MULTI_CORE_SHARED_CODE != 0U
348 /*enable the semaphore mask interrupts */
349 if (HAL_GetCurrentCPUID() == HSEM_CPU1_COREID
)
351 /*Use interrupt line 0 for CPU1 Master */
352 HSEM
->C1IER
&= ~SemMask
;
354 else /* HSEM_CPU2_COREID */
356 /*Use interrupt line 1 for CPU2 Master*/
357 HSEM
->C2IER
&= ~SemMask
;
360 HSEM_COMMON
->IER
&= ~SemMask
;
365 * @brief This function handles HSEM interrupt request
368 void HAL_HSEM_IRQHandler(void)
371 #if USE_MULTI_CORE_SHARED_CODE != 0U
372 if (HAL_GetCurrentCPUID() == HSEM_CPU1_COREID
)
374 /* Get the list of masked freed semaphores*/
375 statusreg
= HSEM
->C1MISR
; /*Use interrupt line 0 for CPU1 Master*/
377 /*Disable Interrupts*/
378 HSEM
->C1IER
&= ~((uint32_t)statusreg
);
381 HSEM
->C1ICR
= ((uint32_t)statusreg
);
383 else /* HSEM_CPU2_COREID */
385 /* Get the list of masked freed semaphores*/
386 statusreg
= HSEM
->C2MISR
;/*Use interrupt line 1 for CPU2 Master*/
388 /*Disable Interrupts*/
389 HSEM
->C2IER
&= ~((uint32_t)statusreg
);
392 HSEM
->C2ICR
= ((uint32_t)statusreg
);
395 /* Get the list of masked freed semaphores*/
396 statusreg
= HSEM_COMMON
->MISR
;
398 /*Disable Interrupts*/
399 HSEM_COMMON
->IER
&= ~((uint32_t)statusreg
);
402 HSEM_COMMON
->ICR
= ((uint32_t)statusreg
);
405 /* Call FreeCallback */
406 HAL_HSEM_FreeCallback(statusreg
);
410 * @brief Semaphore Released Callback.
411 * @param SemMask: Mask of Released semaphores
414 __weak
void HAL_HSEM_FreeCallback(uint32_t SemMask
)
416 /* Prevent unused argument(s) compilation warning */
419 /* NOTE : This function should not be modified, when the callback is needed,
420 the HAL_HSEM_FreeCallback can be implemented in the user file
432 #endif /* HAL_HSEM_MODULE_ENABLED */
441 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/