Skip to content

Commit 1198943

Browse files
jeromecoutantadbridge
authored andcommitted
STM32L5 : update generic STM files for L5
1 parent a495a6b commit 1198943

File tree

10 files changed

+232
-23
lines changed

10 files changed

+232
-23
lines changed

targets/TARGET_STM/README.md

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,18 @@ https://www.st.com/en/embedded-software/stm32cube-mcu-packages.html
1010

1111
This table summarizes the STM32Cube versions currently used :
1212

13-
| STM32 Serie | Cube version |
14-
|-------------|--------------|
15-
| F0 | 1.9.0 |
16-
| F1 | 1.6.1 |
17-
| F2 | 1.6.0 |
18-
| F3 | 1.9.0 |
19-
| F4 | 1.19.0 |
20-
| F7 | 1.10.0 |
21-
| H7 | 1.4.0 |
22-
| L0 | 1.10.0 |
23-
| L1 | 1.8.1 |
24-
| L4 | 1.11.0 |
25-
| WB | 1.0.0 |
13+
| STM32 Serie | Cube version | GitHub source |
14+
|-------------|--------------|---------------------------------------------------|
15+
| F0 | 1.9.0 | https://github.com/STMicroelectronics/STM32CubeF0 |
16+
| F1 | 1.6.1 | https://github.com/STMicroelectronics/STM32CubeF1 |
17+
| F2 | 1.6.0 | https://github.com/STMicroelectronics/STM32CubeF2 |
18+
| F3 | 1.9.0 | https://github.com/STMicroelectronics/STM32CubeF3 |
19+
| F4 | 1.19.0 | https://github.com/STMicroelectronics/STM32CubeF4 |
20+
| F7 | 1.10.0 | https://github.com/STMicroelectronics/STM32CubeF7 |
21+
| G0 | 1.3.0 | https://github.com/STMicroelectronics/STM32CubeG0 |
22+
| H7 | 1.4.0 | https://github.com/STMicroelectronics/STM32CubeH7 |
23+
| L0 | 1.10.0 | https://github.com/STMicroelectronics/STM32CubeL0 |
24+
| L1 | 1.8.1 | https://github.com/STMicroelectronics/STM32CubeL1 |
25+
| L4 | 1.11.0 | https://github.com/STMicroelectronics/STM32CubeL4 |
26+
| L5 | 1.1.0 | https://github.com/STMicroelectronics/STM32CubeL5 |
27+
| WB | 1.0.0 | https://github.com/STMicroelectronics/STM32CubeWB |

targets/TARGET_STM/gpio_api.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ GPIO_TypeDef *Set_GPIO_Clock(uint32_t port_idx)
7474
#endif
7575
#if defined GPIOG_BASE
7676
case PortG:
77-
#if defined TARGET_STM32L4
77+
#if defined PWR_CR2_IOSV /* TARGET_STM32L4 / TARGET_STM32L5 */
7878
__HAL_RCC_PWR_CLK_ENABLE();
7979
HAL_PWREx_EnableVddIO2();
8080
#endif

targets/TARGET_STM/gpio_irq_api.c

Lines changed: 170 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,34 @@ static gpio_channel_t channels[CHANNEL_NUM] = {
7373
{.pin_mask = 0},
7474
#endif
7575
#ifdef EXTI_IRQ6_NUM_LINES
76-
{.pin_mask = 0}
76+
{.pin_mask = 0},
77+
#endif
78+
#ifdef EXTI_IRQ7_NUM_LINES
79+
{.pin_mask = 0},
80+
#endif
81+
#ifdef EXTI_IRQ8_NUM_LINES
82+
{.pin_mask = 0},
83+
#endif
84+
#ifdef EXTI_IRQ9_NUM_LINES
85+
{.pin_mask = 0},
86+
#endif
87+
#ifdef EXTI_IRQ10_NUM_LINES
88+
{.pin_mask = 0},
89+
#endif
90+
#ifdef EXTI_IRQ11_NUM_LINES
91+
{.pin_mask = 0},
92+
#endif
93+
#ifdef EXTI_IRQ12_NUM_LINES
94+
{.pin_mask = 0},
95+
#endif
96+
#ifdef EXTI_IRQ13_NUM_LINES
97+
{.pin_mask = 0},
98+
#endif
99+
#ifdef EXTI_IRQ14_NUM_LINES
100+
{.pin_mask = 0},
101+
#endif
102+
#ifdef EXTI_IRQ15_NUM_LINES
103+
{.pin_mask = 0},
77104
#endif
78105
};
79106

@@ -90,6 +117,36 @@ static void handle_interrupt_in(uint32_t irq_index, uint32_t max_num_pin_line)
90117
GPIO_TypeDef *gpio = (GPIO_TypeDef *)(gpio_channel->channel_gpio[gpio_idx]);
91118
uint32_t pin = (uint32_t)(1 << (gpio_channel->channel_pin[gpio_idx]));
92119

120+
#if defined(TARGET_STM32L5)
121+
// Clear interrupt flag
122+
if (LL_EXTI_IsActiveRisingFlag_0_31(pin) != RESET) {
123+
LL_EXTI_ClearRisingFlag_0_31(pin);
124+
125+
if (gpio_channel->channel_ids[gpio_idx] == 0) {
126+
continue;
127+
}
128+
129+
gpio_irq_event event = IRQ_RISE;
130+
irq_handler(gpio_channel->channel_ids[gpio_idx], event);
131+
132+
return;
133+
}
134+
135+
if (LL_EXTI_IsActiveFallingFlag_0_31(pin) != RESET) {
136+
LL_EXTI_ClearFallingFlag_0_31(pin);
137+
138+
if (gpio_channel->channel_ids[gpio_idx] == 0) {
139+
continue;
140+
}
141+
142+
gpio_irq_event event = IRQ_FALL;
143+
irq_handler(gpio_channel->channel_ids[gpio_idx], event);
144+
145+
return;
146+
}
147+
148+
#else /* TARGET_STM32L5 */
149+
93150
// Clear interrupt flag
94151
if (__HAL_GPIO_EXTI_GET_FLAG(pin) != RESET) {
95152
__HAL_GPIO_EXTI_CLEAR_FLAG(pin);
@@ -124,6 +181,7 @@ static void handle_interrupt_in(uint32_t irq_index, uint32_t max_num_pin_line)
124181

125182
return;
126183
}
184+
#endif /* TARGET_STM32L5 */
127185
}
128186
}
129187
error("Unexpected Spurious interrupt index %" PRIu32 "\n", irq_index);
@@ -166,19 +224,82 @@ static void gpio_irq4(void)
166224
}
167225
#endif
168226
#ifdef EXTI_IRQ5_NUM_LINES
169-
// EXTI lines 5 to 9
227+
// EXTI lines 5 to 9, except for STM32L5 line 5 only
170228
static void gpio_irq5(void)
171229
{
172230
handle_interrupt_in(5, EXTI_IRQ5_NUM_LINES);
173231
}
174232
#endif
175233
#ifdef EXTI_IRQ6_NUM_LINES
176-
// EXTI lines 10 to 15
234+
// EXTI lines 10 to 15, except for STM32L5 line 6 only
177235
static void gpio_irq6(void)
178236
{
179237
handle_interrupt_in(6, EXTI_IRQ6_NUM_LINES);
180238
}
181239
#endif
240+
#ifdef EXTI_IRQ7_NUM_LINES
241+
// EXTI line 7 for STM32L5
242+
static void gpio_irq7(void)
243+
{
244+
handle_interrupt_in(7, EXTI_IRQ7_NUM_LINES);
245+
}
246+
#endif
247+
#ifdef EXTI_IRQ8_NUM_LINES
248+
// EXTI line 8 for STM32L5
249+
static void gpio_irq8(void)
250+
{
251+
handle_interrupt_in(8, EXTI_IRQ8_NUM_LINES);
252+
}
253+
#endif
254+
#ifdef EXTI_IRQ9_NUM_LINES
255+
// EXTI line 9 for STM32L5
256+
static void gpio_irq9(void)
257+
{
258+
handle_interrupt_in(9, EXTI_IRQ9_NUM_LINES);
259+
}
260+
#endif
261+
#ifdef EXTI_IRQ10_NUM_LINES
262+
// EXTI line 10 for STM32L5
263+
static void gpio_irq10(void)
264+
{
265+
handle_interrupt_in(10, EXTI_IRQ10_NUM_LINES);
266+
}
267+
#endif
268+
#ifdef EXTI_IRQ11_NUM_LINES
269+
// EXTI line 11 for STM32L5
270+
static void gpio_irq11(void)
271+
{
272+
handle_interrupt_in(11, EXTI_IRQ11_NUM_LINES);
273+
}
274+
#endif
275+
#ifdef EXTI_IRQ12_NUM_LINES
276+
// EXTI line 12 for STM32L5
277+
static void gpio_irq12(void)
278+
{
279+
handle_interrupt_in(12, EXTI_IRQ12_NUM_LINES);
280+
}
281+
#endif
282+
#ifdef EXTI_IRQ13_NUM_LINES
283+
// EXTI line 13 for STM32L5
284+
static void gpio_irq13(void)
285+
{
286+
handle_interrupt_in(13, EXTI_IRQ13_NUM_LINES);
287+
}
288+
#endif
289+
#ifdef EXTI_IRQ14_NUM_LINES
290+
// EXTI line 14 for STM32L5
291+
static void gpio_irq14(void)
292+
{
293+
handle_interrupt_in(14, EXTI_IRQ14_NUM_LINES);
294+
}
295+
#endif
296+
#ifdef EXTI_IRQ15_NUM_LINES
297+
// EXTI line 15 for STM32L5
298+
static void gpio_irq15(void)
299+
{
300+
handle_interrupt_in(15, EXTI_IRQ15_NUM_LINES);
301+
}
302+
#endif
182303

183304
extern GPIO_TypeDef *Set_GPIO_Clock(uint32_t port_idx);
184305
extern void pin_function_gpiomode(PinName pin, uint32_t gpiomode);
@@ -238,6 +359,51 @@ int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32
238359
case 6:
239360
vector = (uint32_t)&gpio_irq6;
240361
break;
362+
#endif
363+
#ifdef EXTI_IRQ7_NUM_LINES
364+
case 7:
365+
vector = (uint32_t)&gpio_irq7;
366+
break;
367+
#endif
368+
#ifdef EXTI_IRQ8_NUM_LINES
369+
case 8:
370+
vector = (uint32_t)&gpio_irq8;
371+
break;
372+
#endif
373+
#ifdef EXTI_IRQ9_NUM_LINES
374+
case 9:
375+
vector = (uint32_t)&gpio_irq9;
376+
break;
377+
#endif
378+
#ifdef EXTI_IRQ10_NUM_LINES
379+
case 10:
380+
vector = (uint32_t)&gpio_irq10;
381+
break;
382+
#endif
383+
#ifdef EXTI_IRQ11_NUM_LINES
384+
case 11:
385+
vector = (uint32_t)&gpio_irq11;
386+
break;
387+
#endif
388+
#ifdef EXTI_IRQ12_NUM_LINES
389+
case 12:
390+
vector = (uint32_t)&gpio_irq12;
391+
break;
392+
#endif
393+
#ifdef EXTI_IRQ13_NUM_LINES
394+
case 13:
395+
vector = (uint32_t)&gpio_irq13;
396+
break;
397+
#endif
398+
#ifdef EXTI_IRQ14_NUM_LINES
399+
case 14:
400+
vector = (uint32_t)&gpio_irq14;
401+
break;
402+
#endif
403+
#ifdef EXTI_IRQ15_NUM_LINES
404+
case 15:
405+
vector = (uint32_t)&gpio_irq15;
406+
break;
241407
#endif
242408
default:
243409
error("InterruptIn error: pin not supported.\n");
@@ -312,7 +478,7 @@ void gpio_irq_enable(gpio_irq_t *obj)
312478

313479
/* Select Source */
314480

315-
#if defined(STM32G0)
481+
#if defined(STM32G0) || defined(STM32L5)
316482
temp = EXTI->EXTICR[pin_index >> 2];
317483
CLEAR_BIT(temp, (0x0FU) << (8U * (pin_index & 0x03U)));
318484
SET_BIT(temp, port_index << (8U * (pin_index & 0x03U)));

targets/TARGET_STM/i2c_api.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -490,6 +490,9 @@ void i2c_frequency(i2c_t *obj, int hz)
490490
handle->Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
491491
handle->Init.OwnAddress1 = 0;
492492
handle->Init.OwnAddress2 = 0;
493+
#ifdef I2C_IP_VERSION_V2
494+
handle->Init.OwnAddress2Masks = I2C_OA2_NOMASK;
495+
#endif
493496
HAL_I2C_Init(handle);
494497

495498
/* store frequency for timeout computation */

targets/TARGET_STM/lp_ticker.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,14 +257,21 @@ void lp_ticker_init(void)
257257
LptimHandle.Init.Trigger.SampleTime = LPTIM_TRIGSAMPLETIME_DIRECTTRANSITION;
258258
#endif
259259

260+
LptimHandle.Init.UltraLowPowerClock.SampleTime = LPTIM_TRIGSAMPLETIME_DIRECTTRANSITION; // L5 ?
261+
260262
LptimHandle.Init.OutputPolarity = LPTIM_OUTPUTPOLARITY_HIGH;
261263
LptimHandle.Init.UpdateMode = LPTIM_UPDATE_IMMEDIATE;
262264
LptimHandle.Init.CounterSource = LPTIM_COUNTERSOURCE_INTERNAL;
263-
#if defined (LPTIM_INPUT1SOURCE_GPIO) /* STM32L4 */
265+
#if defined (LPTIM_INPUT1SOURCE_GPIO) /* STM32L4 / STM32L5 */
264266
LptimHandle.Init.Input1Source = LPTIM_INPUT1SOURCE_GPIO;
265267
LptimHandle.Init.Input2Source = LPTIM_INPUT2SOURCE_GPIO;
266268
#endif /* LPTIM_INPUT1SOURCE_GPIO */
267269

270+
#if defined(LPTIM_RCR_REP) /* STM32L4 / STM32L5 */
271+
LptimHandle.Init.RepetitionCounter = 0;
272+
#endif /* LPTIM_RCR_REP */
273+
274+
268275
if (HAL_LPTIM_Init(&LptimHandle) != HAL_OK) {
269276
error("HAL_LPTIM_Init ERROR\n");
270277
return;

targets/TARGET_STM/rtc_api.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ void rtc_init(void)
105105
// Enable RTC
106106
__HAL_RCC_RTC_ENABLE();
107107

108-
#if defined __HAL_RCC_RTCAPB_CLK_ENABLE /* part of STM32L4 */
108+
#if defined __HAL_RCC_RTCAPB_CLK_ENABLE /* part of STM32L4 / STM32L5 */
109109
__HAL_RCC_RTCAPB_CLK_ENABLE();
110110
#endif /* __HAL_RCC_RTCAPB_CLK_ENABLE */
111111

@@ -418,9 +418,15 @@ void rtc_set_wake_up_timer(timestamp_t timestamp)
418418

419419
RtcHandle.Instance = RTC;
420420
HAL_RTCEx_DeactivateWakeUpTimer(&RtcHandle);
421+
#if defined (RTC_WUTR_WUTOCLR) /* STM32L5 */
422+
if (HAL_RTCEx_SetWakeUpTimer_IT(&RtcHandle, WakeUpCounter, RTC_WAKEUPCLOCK_RTCCLK_DIV4, 0) != HAL_OK) {
423+
error("rtc_set_wake_up_timer init error\n");
424+
}
425+
#else /* RTC_WUTR_WUTOCLR */
421426
if (HAL_RTCEx_SetWakeUpTimer_IT(&RtcHandle, WakeUpCounter, WakeUpClock) != HAL_OK) {
422427
error("rtc_set_wake_up_timer init error\n");
423428
}
429+
#endif /* RTC_WUTR_WUTOCLR */
424430

425431
NVIC_SetVector(RTC_WKUP_IRQn, (uint32_t)RTC_IRQHandler);
426432
irq_handler = (void (*)(void))lp_ticker_irq_handler;

targets/TARGET_STM/serial_api.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -616,6 +616,18 @@ HAL_StatusTypeDef init_uart(serial_t *obj)
616616
huart->TxXferSize = 0;
617617
huart->RxXferCount = 0;
618618
huart->RxXferSize = 0;
619+
#if defined(UART_ONE_BIT_SAMPLE_DISABLE) // F0/F3/F7/G0/H7/L0/L4/L5/WB
620+
huart->Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
621+
#endif
622+
#if defined(UART_PRESCALER_DIV1) // G0/H7/L4/L5/WB
623+
huart->Init.ClockPrescaler = UART_PRESCALER_DIV1;
624+
#endif
625+
#if defined(UART_ADVFEATURE_NO_INIT) // F0/F3/F7/G0/H7/L0/L4//5/WB
626+
huart->AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
627+
#endif
628+
#if defined(UART_FIFOMODE_DISABLE) // G0/H7/L4/L5/WB
629+
huart->FifoMode = UART_FIFOMODE_DISABLE;
630+
#endif
619631

620632
if (obj_s->pin_rx == NC) {
621633
huart->Init.Mode = UART_MODE_TX;

targets/TARGET_STM/stm_spi_api.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,9 @@ static void _spi_init_direct(spi_t *obj, const spi_pinmap_t *pinmap)
208208
handle->Init.CLKPolarity = SPI_POLARITY_LOW;
209209
handle->Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
210210
handle->Init.CRCPolynomial = 7;
211+
#if defined(SPI_CRC_LENGTH_DATASIZE)
212+
handle->Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
213+
#endif
211214
handle->Init.DataSize = SPI_DATASIZE_8BIT;
212215
handle->Init.FirstBit = SPI_FIRSTBIT_MSB;
213216
handle->Init.TIMode = SPI_TIMODE_DISABLE;

targets/TARGET_STM/trng_api.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,9 @@ void trng_init(trng_t *obj)
8686
}
8787
}
8888

89+
#elif defined(TARGET_STM32L5)
90+
/* No need to reconfigure RngClockSelection as alreday done in SetSysClock */
91+
8992
#else
9093
#error("RNG clock not configured");
9194
#endif
@@ -98,15 +101,22 @@ void trng_init(trng_t *obj)
98101
obj->handle.Instance = RNG;
99102
obj->handle.State = HAL_RNG_STATE_RESET;
100103
obj->handle.Lock = HAL_UNLOCKED;
104+
#if defined(RNG_CR_CED)
105+
obj->handle.Init.ClockErrorDetection = RNG_CED_ENABLE;
106+
#endif
101107

102108
#if defined(CFG_HW_RNG_SEMID)
103109
/* In case RNG is a shared ressource, get the HW semaphore first */
104110
while (LL_HSEM_1StepLock(HSEM, CFG_HW_RNG_SEMID));
105111
#endif
106-
HAL_RNG_Init(&obj->handle);
112+
if (HAL_RNG_Init(&obj->handle) != HAL_OK) {
113+
error("trng_init: HAL_RNG_Init\n");
114+
}
107115

108116
/* first random number generated after setting the RNGEN bit should not be used */
109-
HAL_RNG_GenerateRandomNumber(&obj->handle, &dummy);
117+
if (HAL_RNG_GenerateRandomNumber(&obj->handle, &dummy) != HAL_OK) {
118+
error("trng_init: HAL_RNG_GenerateRandomNumber\n");
119+
}
110120

111121
#if defined(CFG_HW_RNG_SEMID)
112122
LL_HSEM_ReleaseLock(HSEM, CFG_HW_RNG_SEMID, 0);

targets/TARGET_STM/watchdog_api.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ watchdog_features_t hal_watchdog_get_platform_features(void)
138138
features.clock_max_frequency = 50000;
139139
#elif defined(STM32H7) || defined(STM32L4) || defined(STM32WB)
140140
features.clock_max_frequency = 33600;
141-
#elif defined(STM32G0)
141+
#elif defined(STM32G0) || defined(STM32L5)
142142
features.clock_max_frequency = 34000;
143143
#else
144144
#error "unsupported target"

0 commit comments

Comments
 (0)