Skip to content

Commit 7b06ce5

Browse files
authored
Merge pull request #11368 from ua1arn/master
Add pin speed controlling interface
2 parents 753917d + afc79cf commit 7b06ce5

File tree

2 files changed

+45
-23
lines changed

2 files changed

+45
-23
lines changed

targets/TARGET_STM/PinNamesTypes.h

Lines changed: 33 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,12 @@ extern "C" {
4040
* [2:0] Function (like in MODER reg) : Input / Output / Alt / Analog
4141
* [3] Output Push-Pull / Open Drain (as in OTYPER reg)
4242
* [5:4] as in PUPDR reg: No Pull, Pull-up, Pull-Donc
43-
* [7:6] Reserved for speed config (as in OSPEEDR), but not used yet
44-
* [11:8] Alternate Num (as in AFRL/AFRG reg)
45-
* [16:12] Channel (Analog/Timer specific)
46-
* [17] Inverted (Analog/Timer specific)
47-
* [18] Analog ADC control - Only valid for specific families
48-
* [32:19] Reserved
43+
* [9:6] speed config (as in OSPEEDR)
44+
* [13:10] Alternate Num (as in AFRL/AFRG reg)
45+
* [17:14] Channel (Analog/Timer specific)
46+
* [18] Inverted (Analog/Timer specific)
47+
* [19] Analog ADC control - Only valid for specific families
48+
* [32:21] Reserved
4949
*/
5050

5151
#define STM_PIN_FUNCTION_MASK 0x07
@@ -60,24 +60,24 @@ extern "C" {
6060
#define STM_PIN_PUPD_SHIFT 4
6161
#define STM_PIN_PUPD_BITS (STM_PIN_PUPD_MASK << STM_PIN_PUPD_SHIFT)
6262

63-
#define STM_PIN_SPEED_MASK 0x03
63+
#define STM_PIN_SPEED_MASK 0x0F
6464
#define STM_PIN_SPEED_SHIFT 6
6565
#define STM_PIN_SPEED_BITS (STM_PIN_SPEED_MASK << STM_PIN_SPEED_SHIFT)
6666

6767
#define STM_PIN_AFNUM_MASK 0x0F
68-
#define STM_PIN_AFNUM_SHIFT 8
68+
#define STM_PIN_AFNUM_SHIFT 10
6969
#define STM_PIN_AFNUM_BITS (STM_PIN_AFNUM_MASK << STM_PIN_AFNUM_SHIFT)
7070

7171
#define STM_PIN_CHAN_MASK 0x1F
72-
#define STM_PIN_CHAN_SHIFT 12
72+
#define STM_PIN_CHAN_SHIFT 14
7373
#define STM_PIN_CHANNEL_BIT (STM_PIN_CHAN_MASK << STM_PIN_CHAN_SHIFT)
7474

7575
#define STM_PIN_INV_MASK 0x01
76-
#define STM_PIN_INV_SHIFT 17
76+
#define STM_PIN_INV_SHIFT 19
7777
#define STM_PIN_INV_BIT (STM_PIN_INV_MASK << STM_PIN_INV_SHIFT)
7878

7979
#define STM_PIN_AN_CTRL_MASK 0x01
80-
#define STM_PIN_AN_CTRL_SHIFT 18
80+
#define STM_PIN_AN_CTRL_SHIFT 20
8181
#define STM_PIN_ANALOG_CONTROL_BIT (STM_PIN_AN_CTRL_MASK << STM_PIN_AN_CTRL_SHIFT)
8282

8383
#define STM_PIN_FUNCTION(X) (((X) >> STM_PIN_FUNCTION_SHIFT) & STM_PIN_FUNCTION_MASK)
@@ -90,15 +90,30 @@ extern "C" {
9090
#define STM_PIN_ANALOG_CONTROL(X) (((X) >> STM_PIN_AN_CTRL_SHIFT) & STM_PIN_AN_CTRL_MASK)
9191

9292
#define STM_PIN_DEFINE(FUNC_OD, PUPD, AFNUM) ((int)(FUNC_OD) |\
93-
((PUPD & STM_PIN_PUPD_MASK) << STM_PIN_PUPD_SHIFT) |\
94-
((AFNUM & STM_PIN_AFNUM_MASK) << STM_PIN_AFNUM_SHIFT))
93+
((STM_PIN_SPEED_MASK & STM_PIN_SPEED_MASK) << STM_PIN_SPEED_SHIFT) |\
94+
(((PUPD) & STM_PIN_PUPD_MASK) << STM_PIN_PUPD_SHIFT) |\
95+
(((AFNUM) & STM_PIN_AFNUM_MASK) << STM_PIN_AFNUM_SHIFT))
96+
97+
#define STM_PIN_DEFINE_SPEED(FUNC_OD, PUPD, AFNUM, SPEEDV) ((int)(FUNC_OD) |\
98+
(((SPEEDV) & STM_PIN_SPEED_MASK) << STM_PIN_SPEED_SHIFT) |\
99+
(((PUPD) & STM_PIN_PUPD_MASK) << STM_PIN_PUPD_SHIFT) |\
100+
(((AFNUM) & STM_PIN_AFNUM_MASK) << STM_PIN_AFNUM_SHIFT))
95101

96102
#define STM_PIN_DEFINE_EXT(FUNC_OD, PUPD, AFNUM, CHAN, INV) \
97-
((int)(FUNC_OD) |\
98-
((PUPD & STM_PIN_PUPD_MASK) << STM_PIN_PUPD_SHIFT) |\
99-
((AFNUM & STM_PIN_AFNUM_MASK) << STM_PIN_AFNUM_SHIFT) |\
100-
((CHAN & STM_PIN_CHAN_MASK) << STM_PIN_CHAN_SHIFT) |\
101-
((INV & STM_PIN_INV_MASK) << STM_PIN_INV_SHIFT))
103+
((int)(FUNC_OD) |\
104+
((STM_PIN_SPEED_MASK & STM_PIN_SPEED_MASK) << STM_PIN_SPEED_SHIFT) |\
105+
(((PUPD) & STM_PIN_PUPD_MASK) << STM_PIN_PUPD_SHIFT) |\
106+
(((AFNUM) & STM_PIN_AFNUM_MASK) << STM_PIN_AFNUM_SHIFT) |\
107+
(((CHAN) & STM_PIN_CHAN_MASK) << STM_PIN_CHAN_SHIFT) |\
108+
(((INV) & STM_PIN_INV_MASK) << STM_PIN_INV_SHIFT))
109+
110+
#define STM_PIN_DEFINE_SPEED_EXT(FUNC_OD, PUPD, AFNUM, CHAN, INV, SPEEDV) \
111+
((int)(FUNC_OD) |\
112+
(((SPEEDV) & STM_PIN_SPEED_MASK) << STM_PIN_SPEED_SHIFT) |\
113+
(((PUPD) & STM_PIN_PUPD_MASK) << STM_PIN_PUPD_SHIFT) |\
114+
(((AFNUM) & STM_PIN_AFNUM_MASK) << STM_PIN_AFNUM_SHIFT) |\
115+
(((CHAN) & STM_PIN_CHAN_MASK) << STM_PIN_CHAN_SHIFT) |\
116+
(((INV) & STM_PIN_INV_MASK) << STM_PIN_INV_SHIFT))
102117

103118
/*
104119
* MACROS to support the legacy definition of PIN formats

targets/TARGET_STM/pinmap.c

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,13 @@ void pin_function(PinName pin, int data)
6464
// Get the pin informations
6565
uint32_t mode = STM_PIN_FUNCTION(data);
6666
uint32_t afnum = STM_PIN_AFNUM(data);
67+
uint32_t speed = STM_PIN_SPEED(data);
6768
uint32_t port = STM_PORT(pin);
6869
uint32_t ll_pin = ll_pin_defines[STM_PIN(pin)];
6970
uint32_t ll_mode = 0;
7071

7172
// Enable GPIO clock
72-
GPIO_TypeDef *gpio = Set_GPIO_Clock(port);
73+
GPIO_TypeDef * const gpio = Set_GPIO_Clock(port);
7374

7475
/* Set default speed to high.
7576
* For most families there are dedicated registers so it is
@@ -79,13 +80,19 @@ void pin_function(PinName pin, int data)
7980
#if defined (TARGET_STM32F1)
8081
if (mode == STM_PIN_OUTPUT) {
8182
#endif
82-
83+
switch (speed) {
84+
/* Default value for backward compatibility */
85+
case STM_PIN_SPEED_MASK:
8386
#if defined (LL_GPIO_SPEED_FREQ_VERY_HIGH)
84-
LL_GPIO_SetPinSpeed(gpio, ll_pin, LL_GPIO_SPEED_FREQ_VERY_HIGH);
87+
LL_GPIO_SetPinSpeed(gpio, ll_pin, LL_GPIO_SPEED_FREQ_VERY_HIGH);
8588
#else
86-
LL_GPIO_SetPinSpeed(gpio, ll_pin, LL_GPIO_SPEED_FREQ_HIGH);
89+
LL_GPIO_SetPinSpeed(gpio, ll_pin, LL_GPIO_SPEED_FREQ_HIGH);
8790
#endif
88-
91+
break;
92+
default:
93+
LL_GPIO_SetPinSpeed(gpio, ll_pin, speed);
94+
break;
95+
}
8996
#if defined (TARGET_STM32F1)
9097
}
9198
#endif

0 commit comments

Comments
 (0)