Skip to content

Commit c1386cf

Browse files
committed
STM32L5 : update generic STM files for L5
1 parent bee5d44 commit c1386cf

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
@@ -74,7 +74,34 @@ static gpio_channel_t channels[CHANNEL_NUM] = {
7474
{.pin_mask = 0},
7575
#endif
7676
#ifdef EXTI_IRQ6_NUM_LINES
77-
{.pin_mask = 0}
77+
{.pin_mask = 0},
78+
#endif
79+
#ifdef EXTI_IRQ7_NUM_LINES
80+
{.pin_mask = 0},
81+
#endif
82+
#ifdef EXTI_IRQ8_NUM_LINES
83+
{.pin_mask = 0},
84+
#endif
85+
#ifdef EXTI_IRQ9_NUM_LINES
86+
{.pin_mask = 0},
87+
#endif
88+
#ifdef EXTI_IRQ10_NUM_LINES
89+
{.pin_mask = 0},
90+
#endif
91+
#ifdef EXTI_IRQ11_NUM_LINES
92+
{.pin_mask = 0},
93+
#endif
94+
#ifdef EXTI_IRQ12_NUM_LINES
95+
{.pin_mask = 0},
96+
#endif
97+
#ifdef EXTI_IRQ13_NUM_LINES
98+
{.pin_mask = 0},
99+
#endif
100+
#ifdef EXTI_IRQ14_NUM_LINES
101+
{.pin_mask = 0},
102+
#endif
103+
#ifdef EXTI_IRQ15_NUM_LINES
104+
{.pin_mask = 0},
78105
#endif
79106
};
80107

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

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

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

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

322488
/* Select Source */
323489

324-
#if defined(STM32G0)
490+
#if defined(STM32G0) || defined(STM32L5)
325491
temp = EXTI->EXTICR[pin_index >> 2];
326492
CLEAR_BIT(temp, (0x0FU) << (8U * (pin_index & 0x03U)));
327493
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
@@ -620,6 +620,18 @@ HAL_StatusTypeDef init_uart(serial_t *obj)
620620
huart->TxXferSize = 0;
621621
huart->RxXferCount = 0;
622622
huart->RxXferSize = 0;
623+
#if defined(UART_ONE_BIT_SAMPLE_DISABLE) // F0/F3/F7/G0/H7/L0/L4/L5/WB
624+
huart->Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
625+
#endif
626+
#if defined(UART_PRESCALER_DIV1) // G0/H7/L4/L5/WB
627+
huart->Init.ClockPrescaler = UART_PRESCALER_DIV1;
628+
#endif
629+
#if defined(UART_ADVFEATURE_NO_INIT) // F0/F3/F7/G0/H7/L0/L4//5/WB
630+
huart->AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
631+
#endif
632+
#if defined(UART_FIFOMODE_DISABLE) // G0/H7/L4/L5/WB
633+
huart->FifoMode = UART_FIFOMODE_DISABLE;
634+
#endif
623635

624636
if (obj_s->pin_rx == NC) {
625637
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)