Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit28898e3

Browse files
committed
[MP1] Add GPIO locking
1 parented24c12 commit28898e3

File tree

6 files changed

+180
-0
lines changed

6 files changed

+180
-0
lines changed

‎cores/arduino/stm32/hw_config.c‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,10 @@ void hw_config_init(void)
6666
USBD_CDC_init();
6767
#endif
6868

69+
#if defined (STM32MP1xx)
70+
__HAL_RCC_HSEM_CLK_ENABLE();
71+
#endif
72+
6973
}
7074
#ifdef__cplusplus
7175
}
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
/**
2+
******************************************************************************
3+
* @file lock_resource.c
4+
* @author MCD Application Team
5+
* @brief This sample code provides hardware semaphore using HSEM for
6+
* synchronization and mutual exclusion between heterogeneous processors
7+
* and those not operating under a single, shared operating system.
8+
******************************************************************************
9+
* @attention
10+
*
11+
* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
12+
* All rights reserved.</center></h2>
13+
*
14+
* This software component is licensed by ST under BSD 3-Clause license,
15+
* the "License"; You may not use this file except in compliance with the
16+
* License. You may obtain a copy of the License at:
17+
* opensource.org/licenses/BSD-3-Clause
18+
*
19+
******************************************************************************
20+
*/
21+
22+
/* Includes ------------------------------------------------------------------*/
23+
#include"lock_resource.h"
24+
25+
#if defined(HAL_HSEM_MODULE_ENABLED)
26+
27+
/* Private macro -------------------------------------------------------------*/
28+
29+
/*
30+
* This macro provides a semaphore id for a dedicated peripheral.
31+
* This macro shall be configured by user according its needs and aligned with remote processors
32+
* (e.g. same semaphore id shall be used between processors for a dedicated peripheral)
33+
*/
34+
#defineGET_HSEM_SEM_INDEX(__Peripheral__) (uint8_t)(((GPIO_TypeDef *)(__Peripheral__) == (GPIOA))? 0U :\
35+
((GPIO_TypeDef *)(__Peripheral__) == (GPIOB))? 0U :\
36+
((GPIO_TypeDef *)(__Peripheral__) == (GPIOC))? 0U :\
37+
((GPIO_TypeDef *)(__Peripheral__) == (GPIOD))? 0U :\
38+
((GPIO_TypeDef *)(__Peripheral__) == (GPIOE))? 0U :\
39+
((GPIO_TypeDef *)(__Peripheral__) == (GPIOF))? 0U :\
40+
((GPIO_TypeDef *)(__Peripheral__) == (GPIOG))? 0U :\
41+
((GPIO_TypeDef *)(__Peripheral__) == (GPIOH))? 0U :\
42+
((GPIO_TypeDef *)(__Peripheral__) == (GPIOI))? 0U :\
43+
((GPIO_TypeDef *)(__Peripheral__) == (GPIOJ))? 0U :\
44+
((GPIO_TypeDef *)(__Peripheral__) == (GPIOK))? 0U :\
45+
((GPIO_TypeDef *)(__Peripheral__) == (GPIOZ))? 0U :\
46+
((EXTI_TypeDef *)(__Peripheral__) == (EXTI))? 1U : HSEM_SEMID_MAX + 1U)
47+
48+
/* Private user code ---------------------------------------------------------*/
49+
50+
51+
/**
52+
* @brief Periph_Lock function is used for register protection of shared @Peripheral
53+
* and shall be called before accessing registers of this shared @Peripheral
54+
* If Semaphore id is already taken, the function will busy loop waiting for it to
55+
* be released, but give up after @Timeout msecs have elapsed.
56+
* @param Peripheral: used to identify which peripheral to protect.
57+
* Semaphore id deduced from this peripheral.
58+
* Timeout: timeout value in msecs
59+
* @retval Return Status
60+
*/
61+
LockResource_Status_tPeriph_Lock(void*Peripheral,uint32_tTimeout)
62+
{
63+
uint32_ttickstart=0U;
64+
LockResource_Status_tret=LOCK_RESOURCE_STATUS_OK;
65+
66+
/* Init tickstart for timeout management*/
67+
tickstart=HAL_GetTick();
68+
69+
/* Try to Take HSEM assigned to the Peripheral */
70+
while (HAL_HSEM_FastTake(GET_HSEM_SEM_INDEX(Peripheral))!=HAL_OK)
71+
{
72+
73+
if ((Timeout==0U)|| ((HAL_GetTick()-tickstart)>Timeout))
74+
{
75+
ret=LOCK_RESOURCE_STATUS_TIMEOUT;
76+
Error_Handler();
77+
}
78+
}
79+
80+
returnret;
81+
}
82+
83+
/**
84+
* @brief The Periph_Unlock released a previously-acquired semaphore which we want to unlock
85+
* @param Peripheral: used to identify which peripheral and the related semaphore
86+
* @retval None
87+
*/
88+
voidPeriph_Unlock(void*Peripheral)
89+
{
90+
/* Release HSEM */
91+
HAL_HSEM_Release(GET_HSEM_SEM_INDEX(Peripheral),0);
92+
93+
}
94+
95+
#endif// defined(HAL_HSEM_MODULE_ENABLED)
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
/**
2+
******************************************************************************
3+
* @file lock_resource.h
4+
* @author MCD Application Team
5+
* @brief Header for lock_resource.c
6+
******************************************************************************
7+
* @attention
8+
*
9+
* <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
10+
* All rights reserved.</center></h2>
11+
*
12+
* This software component is licensed by ST under BSD 3-Clause license,
13+
* the "License"; You may not use this file except in compliance with the
14+
* License. You may obtain a copy of the License at:
15+
* opensource.org/licenses/BSD-3-Clause
16+
*
17+
******************************************************************************
18+
*/
19+
/* Define to prevent recursive inclusion -------------------------------------*/
20+
#ifndef_LOCK_RESOURCE_H
21+
#define_LOCK_RESOURCE_H
22+
23+
/* Includes ------------------------------------------------------------------*/
24+
#include"stm32_def.h"
25+
26+
27+
/* Exported types ------------------------------------------------------------*/
28+
typedefenum
29+
{
30+
LOCK_RESOURCE_STATUS_OK=0x00U,
31+
LOCK_RESOURCE_STATUS_ERROR=0x01U,
32+
LOCK_RESOURCE_STATUS_TIMEOUT=0x02U
33+
}LockResource_Status_t;
34+
35+
/* Exported constants --------------------------------------------------------*/
36+
#defineLOCK_RESOURCE_TIMEOUT 100U/* timeout in ms */
37+
38+
/* Exported macro ------------------------------------------------------------*/
39+
#definePERIPH_LOCK(__Periph__) Periph_Lock(__Periph__, LOCK_RESOURCE_TIMEOUT)
40+
#definePERIPH_UNLOCK(__Periph__) Periph_Unlock(__Periph__)
41+
42+
/* Exported functions ------------------------------------------------------- */
43+
LockResource_Status_tPeriph_Lock(void*Peripheral,uint32_tTimeout);
44+
voidPeriph_Unlock(void*Peripheral);
45+
46+
47+
48+
49+
#endif/* _LOCK_RESOURCE_H */
50+
51+
52+
53+
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

‎cores/arduino/stm32/pinconfig.h‎

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@
3434
#include"PinAF_STM32F1.h"
3535
#include"stm32yyxx_ll_gpio.h"
3636

37+
#if defined(STM32MP1xx)
38+
#include"lock_resource.h"
39+
#endif
40+
3741
staticinlinevoidpin_DisconnectDebug(PinNamepin)
3842
{
3943
#ifdefSTM32F1xx
@@ -45,6 +49,9 @@ static inline void pin_DisconnectDebug(PinName pin)
4549

4650
staticinlinevoidpin_PullConfig(GPIO_TypeDef*gpio,uint32_tll_pin,uint32_tpull_config)
4751
{
52+
#if defined(STM32MP1xx)
53+
PERIPH_LOCK(gpio);
54+
#endif
4855
#ifdefSTM32F1xx
4956
uint32_tfunction=LL_GPIO_GetPinMode(gpio,ll_pin);
5057
#endif
@@ -77,10 +84,16 @@ static inline void pin_PullConfig(GPIO_TypeDef *gpio, uint32_t ll_pin, uint32_t
7784
#endif
7885
break;
7986
}
87+
#if defined(STM32MP1xx)
88+
PERIPH_UNLOCK(gpio);
89+
#endif
8090
}
8191

8292
staticinlinevoidpin_SetAFPin(GPIO_TypeDef*gpio,PinNamepin,uint32_tafnum)
8393
{
94+
#if defined(STM32MP1xx)
95+
PERIPH_LOCK(gpio);
96+
#endif
8497
#ifdefSTM32F1xx
8598
UNUSED(gpio);
8699
UNUSED(pin);
@@ -94,6 +107,9 @@ static inline void pin_SetAFPin(GPIO_TypeDef *gpio, PinName pin, uint32_t afnum)
94107
LL_GPIO_SetAFPin_0_7(gpio,ll_pin,afnum);
95108
}
96109
#endif
110+
#if defined(STM32MP1xx)
111+
PERIPH_UNLOCK(gpio);
112+
#endif
97113
}
98114

99115
#endif

‎cores/arduino/stm32/pinmap.c‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@
1818
#include"pinconfig.h"
1919
#include"stm32yyxx_ll_gpio.h"
2020

21+
#if defined(STM32MP1xx)
22+
#include"lock_resource.h"
23+
#endif
24+
2125
/* Map STM_PIN to LL */
2226
constuint32_tpin_map_ll[16]= {
2327
LL_GPIO_PIN_0,
@@ -70,6 +74,9 @@ void pin_function(PinName pin, int function)
7074
/* Enable GPIO clock */
7175
GPIO_TypeDef*gpio=set_GPIO_Port_Clock(port);
7276

77+
#if defined(STM32MP1xx)
78+
PERIPH_LOCK(gpio);
79+
#endif
7380
/* Set default speed to high.
7481
* For most families there are dedicated registers so it is
7582
* not so important, register can be set at any time.
@@ -128,6 +135,10 @@ void pin_function(PinName pin, int function)
128135
pin_PullConfig(gpio,ll_pin,STM_PIN_PUPD(function));
129136

130137
pin_DisconnectDebug(pin);
138+
139+
#if defined(STM32MP1xx)
140+
PERIPH_UNLOCK(gpio);
141+
#endif
131142
}
132143

133144
voidpinmap_pinout(PinNamepin,constPinMap*map)

‎system/STM32MP1xx/stm32mp1xx_hal_conf_default.h‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
#defineHAL_RTC_MODULE_DISABLED/* RTC MODULE on Cortex-M side is not supported.
4242
Linux on Cortex-A will handle this. */
4343
#defineHAL_ETH_MODULE_DISABLED/* ETH module is also not intended to be used */
44+
#defineHAL_HSEM_MODULE_ENABLED
4445
#defineHAL_MDMA_MODULE_ENABLED/* Some other modules (e.g. USART) require this */
4546

4647
#if defined(ARDUINO_STM32MP157A_DK1)|| defined(ARDUINO_STM32MP157A_DK2)

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp