@@ -198,9 +198,6 @@ bool USBD_Initialize(uint16_t vid, uint16_t pid, const uint8_t *manufacturer, co
198
198
USBD_ProductString = product ;
199
199
USBD_ClassInitialize = initialize ;
200
200
201
- usbd_pin_vbus = pin_vbus ;
202
- usbd_mask_vbus = 1 << ((pin_vbus & STM32L0_GPIO_PIN_INDEX_MASK ) >> STM32L0_GPIO_PIN_INDEX_SHIFT );
203
-
204
201
/* Set USB Interrupt priority */
205
202
NVIC_SetPriority (USB_IRQn , priority );
206
203
@@ -209,19 +206,29 @@ bool USBD_Initialize(uint16_t vid, uint16_t pid, const uint8_t *manufacturer, co
209
206
usbd_suspend_callback = suspend_callback ;
210
207
usbd_resume_callback = resume_callback ;
211
208
212
- stm32l0_lptim_timeout_create (& USBD_VBUSTimeout );
213
-
214
209
/* Configure USB FS GPIOs */
215
- stm32l0_gpio_pin_configure (usbd_pin_vbus , (STM32L0_GPIO_PARK_HIZ | STM32L0_GPIO_PUPD_PULLDOWN | STM32L0_GPIO_OSPEED_LOW | STM32L0_GPIO_OTYPE_PUSHPULL | STM32L0_GPIO_MODE_INPUT ));
210
+ usbd_pin_vbus = pin_vbus ;
211
+ if (pin_vbus != STM32L0_GPIO_PIN_NONE ) {
212
+ usbd_mask_vbus = 1 << ((pin_vbus & STM32L0_GPIO_PIN_INDEX_MASK ) >> STM32L0_GPIO_PIN_INDEX_SHIFT );
216
213
217
- if (stm32l0_gpio_pin_read (usbd_pin_vbus ))
218
- {
219
- stm32l0_lptim_timeout_start (& USBD_VBUSTimeout , stm32l0_lptim_millis_to_ticks (40 ), (stm32l0_lptim_callback_t )USBD_VBUSTimeoutIrq ); /* 40ms */
214
+ stm32l0_lptim_timeout_create (& USBD_VBUSTimeout );
215
+
216
+ stm32l0_gpio_pin_configure (usbd_pin_vbus , (STM32L0_GPIO_PARK_HIZ | STM32L0_GPIO_PUPD_PULLDOWN | STM32L0_GPIO_OSPEED_LOW | STM32L0_GPIO_OTYPE_PUSHPULL | STM32L0_GPIO_MODE_INPUT ));
217
+
218
+ if (stm32l0_gpio_pin_read (usbd_pin_vbus ))
219
+ {
220
+ stm32l0_lptim_timeout_start (& USBD_VBUSTimeout , stm32l0_lptim_millis_to_ticks (40 ), (stm32l0_lptim_callback_t )USBD_VBUSTimeoutIrq ); /* 40ms */
221
+ }
222
+
223
+ stm32l0_exti_attach (usbd_pin_vbus ,
224
+ (STM32L0_EXTI_CONTROL_NOWAKEUP | STM32L0_EXTI_CONTROL_PRIORITY_LOW | STM32L0_EXTI_CONTROL_EDGE_RISING | STM32L0_EXTI_CONTROL_EDGE_FALLING ),
225
+ (stm32l0_exti_callback_t )USBD_VBUSChangedIrq , NULL );
226
+ } else {
227
+ // No VBUS pin, assume VBUS is always present
228
+ usbd_attached = true;
229
+ usbd_mask_vbus = 0 ;
220
230
}
221
-
222
- stm32l0_exti_attach (usbd_pin_vbus ,
223
- (STM32L0_EXTI_CONTROL_NOWAKEUP | STM32L0_EXTI_CONTROL_PRIORITY_LOW | STM32L0_EXTI_CONTROL_EDGE_RISING | STM32L0_EXTI_CONTROL_EDGE_FALLING ),
224
- (stm32l0_exti_callback_t )USBD_VBUSChangedIrq , NULL );
231
+
225
232
226
233
return true;
227
234
}
@@ -230,11 +237,13 @@ void USBD_Teardown()
230
237
{
231
238
USBD_Detach ();
232
239
233
- stm32l0_exti_detach (usbd_pin_vbus );
240
+ if (usbd_pin_vbus != STM32L0_GPIO_PIN_NONE ) {
241
+ stm32l0_exti_detach (usbd_pin_vbus );
234
242
235
- stm32l0_lptim_timeout_stop (& USBD_VBUSTimeout );
243
+ stm32l0_lptim_timeout_stop (& USBD_VBUSTimeout );
236
244
237
- stm32l0_gpio_pin_configure (usbd_pin_vbus , STM32L0_GPIO_MODE_ANALOG );
245
+ stm32l0_gpio_pin_configure (usbd_pin_vbus , STM32L0_GPIO_MODE_ANALOG );
246
+ }
238
247
239
248
usbd_wakeup = false;
240
249
usbd_enabled = false;
@@ -370,16 +379,18 @@ void USBD_SetupVBUS(bool wakeup)
370
379
{
371
380
usbd_wakeup = wakeup ;
372
381
373
- stm32l0_exti_detach (usbd_pin_vbus );
374
-
375
- stm32l0_gpio_pin_configure (usbd_pin_vbus ,
376
- (usbd_wakeup ? STM32L0_GPIO_PARK_NONE : STM32L0_GPIO_PARK_HIZ ) |
377
- (STM32L0_GPIO_PUPD_PULLDOWN | STM32L0_GPIO_OSPEED_LOW | STM32L0_GPIO_OTYPE_PUSHPULL | STM32L0_GPIO_MODE_INPUT ));
378
-
379
- stm32l0_exti_attach (usbd_pin_vbus ,
380
- ((usbd_wakeup ? 0 : STM32L0_EXTI_CONTROL_NOWAKEUP ) |
381
- (STM32L0_EXTI_CONTROL_PRIORITY_LOW | STM32L0_EXTI_CONTROL_EDGE_RISING | STM32L0_EXTI_CONTROL_EDGE_FALLING )),
382
- (stm32l0_exti_callback_t )USBD_VBUSChangedIrq , NULL );
382
+ if (usbd_pin_vbus != STM32L0_GPIO_PIN_NONE ) {
383
+ stm32l0_exti_detach (usbd_pin_vbus );
384
+
385
+ stm32l0_gpio_pin_configure (usbd_pin_vbus ,
386
+ (usbd_wakeup ? STM32L0_GPIO_PARK_NONE : STM32L0_GPIO_PARK_HIZ ) |
387
+ (STM32L0_GPIO_PUPD_PULLDOWN | STM32L0_GPIO_OSPEED_LOW | STM32L0_GPIO_OTYPE_PUSHPULL | STM32L0_GPIO_MODE_INPUT ));
388
+
389
+ stm32l0_exti_attach (usbd_pin_vbus ,
390
+ ((usbd_wakeup ? 0 : STM32L0_EXTI_CONTROL_NOWAKEUP ) |
391
+ (STM32L0_EXTI_CONTROL_PRIORITY_LOW | STM32L0_EXTI_CONTROL_EDGE_RISING | STM32L0_EXTI_CONTROL_EDGE_FALLING )),
392
+ (stm32l0_exti_callback_t )USBD_VBUSChangedIrq , NULL );
393
+ }
383
394
}
384
395
}
385
396
0 commit comments