2323 #include "lock_resource.h"
2424#endif
2525
26+ typedef struct {
27+ PinName pin ;
28+ uint32_t LL_AnalogSwitch ;
29+ } PinAnalogSwitch ;
30+
31+ #if defined(STM32H7xx )
32+ #define DUALPAD_ANALOG_SWITCH
33+ const PinAnalogSwitch PinMapAnalogSwitch [] = {
34+ {PA_0 , LL_SYSCFG_ANALOG_SWITCH_PA0 },
35+ {PA_1 , LL_SYSCFG_ANALOG_SWITCH_PA1 },
36+ {PC_2 , LL_SYSCFG_ANALOG_SWITCH_PC2 },
37+ {PC_3 , LL_SYSCFG_ANALOG_SWITCH_PC3 },
38+ {NC , 0 }
39+ };
40+ #else
41+ /**
42+ * Even if MP1 support some dual pad (analog switch), we don't consider it
43+ * because its behavior is different from H7 and almost useless.
44+ * Switches remains open all the time. No need to configure it */
45+ #undef DUALPAD_ANALOG_SWITCH
46+ #endif
47+
2648/* Map STM_PIN to LL */
2749const uint32_t pin_map_ll [16 ] = {
2850 LL_GPIO_PIN_0 ,
@@ -43,6 +65,41 @@ const uint32_t pin_map_ll[16] = {
4365 LL_GPIO_PIN_15
4466};
4567
68+ #if defined(DUALPAD_ANALOG_SWITCH )
69+ /**
70+ * Configure Analog dualpad switch if necessary
71+ */
72+ void configure_dualpad_switch (PinName pin , int function )
73+ {
74+ PinAnalogSwitch * AnalogSwitch = (PinAnalogSwitch * ) PinMapAnalogSwitch ;
75+
76+ /* Read through PinMapAnalogSwitch array */
77+ while (AnalogSwitch -> pin != NC ) {
78+ /* Check whether pin is or is associated to dualpad Analog Input */
79+ if ((AnalogSwitch -> pin | PDUAL ) == (pin | PDUAL )) {
80+ if (((function & STM_MODE_ANALOG ) != STM_MODE_ANALOG )
81+ && ((pin & PDUAL ) == PDUAL )) {
82+ /**
83+ * We don't configure an analog function but the pin is an analog pad
84+ * (Pxy_C, ANA0 ...) In this cases Analog switch should be closed
85+ */
86+ LL_SYSCFG_CloseAnalogSwitch (AnalogSwitch -> LL_AnalogSwitch );
87+ return ;
88+ } else {
89+ /**
90+ * Either we configure an analog function,
91+ * or it is not an analog function but it is not an analog pad
92+ * (not Pxy_C, ANA0 ...). In both cases Analog switch should be opened
93+ */
94+ LL_SYSCFG_OpenAnalogSwitch (AnalogSwitch -> LL_AnalogSwitch );
95+ return ;
96+ }
97+ }
98+ AnalogSwitch ++ ;
99+ }
100+ }
101+ #endif /* DUALPAD_ANALOG_SWITCH */
102+
46103bool pin_in_pinmap (PinName pin , const PinMap * map )
47104{
48105 if (pin != (PinName )NC ) {
@@ -177,6 +234,10 @@ void pin_function(PinName pin, int function)
177234
178235 pin_PullConfig (gpio , ll_pin , STM_PIN_PUPD (function ));
179236
237+ #if defined(DUALPAD_ANALOG_SWITCH )
238+ configure_dualpad_switch (pin , function );
239+ #endif /* DUALPAD_ANALOG_SWITCH */
240+
180241 pin_DisconnectDebug (pin );
181242
182243 hsem_unlock (CFG_HW_GPIO_SEMID );
0 commit comments