USBDevice with support for STM32F3

Fork of F042K6_USBDevice by Norimasa Okamoto

Revision:
67:6099ce7e71c9
Parent:
66:b129e98ab7a0
Child:
69:f8305faf7917
diff -r b129e98ab7a0 -r 6099ce7e71c9 USBDevice/USBHAL_STM32L1.cpp
--- a/USBDevice/USBHAL_STM32L1.cpp	Wed Sep 21 20:28:24 2016 +0100
+++ b/USBDevice/USBHAL_STM32L1.cpp	Mon Oct 24 17:40:10 2016 +0100
@@ -80,12 +80,11 @@
 void HAL_PCD_MspInit(PCD_HandleTypeDef* hpcd) {
     __USB_CLK_ENABLE();
     HAL_NVIC_SetPriority(USB_LP_IRQn, 0, 0);
-    HAL_NVIC_EnableIRQ(USB_LP_IRQn);
 }
 
 void HAL_PCD_MspDeInit(PCD_HandleTypeDef* hpcd) {
+    HAL_NVIC_DisableIRQ(USB_LP_IRQn); // Peripheral interrupt Deinit
     __USB_CLK_DISABLE(); // Peripheral clock disable
-    HAL_NVIC_DisableIRQ(USB_LP_IRQn); // Peripheral interrupt Deinit
 }
 
 USBHAL::~USBHAL(void) {
@@ -93,11 +92,13 @@
 }
 
 void USBHAL::connect(void) {
+    HAL_NVIC_EnableIRQ(USB_LP_IRQn);
     HAL_PCD_DevConnect(&hpcd_USB_FS);
 }
 
 void USBHAL::disconnect(void) {
     HAL_PCD_DevDisconnect(&hpcd_USB_FS);
+    HAL_NVIC_DisableIRQ(USB_LP_IRQn);
 }
 
 void USBHAL::configureDevice(void) {
@@ -254,8 +255,10 @@
 }
 
 EP_STATUS USBHAL::endpointRead(uint8_t endpoint, uint32_t maximumSize) {
+    core_util_critical_section_enter();
     HAL_PCD_EP_Receive(&hpcd_USB_FS, endpoint>>1, rxtmp.ptr(endpoint, maximumSize), maximumSize);
     epComplete &= ~(1 << endpoint);
+    core_util_critical_section_exit();
     return EP_PENDING;
 }
 
@@ -270,14 +273,18 @@
 }
 
 EP_STATUS USBHAL::endpointWrite(uint8_t endpoint, uint8_t *data, uint32_t size) {
+    core_util_critical_section_enter();
     HAL_PCD_EP_Transmit(&hpcd_USB_FS, endpoint>>1, data, size);
     epComplete &= ~(1 << endpoint);
+    core_util_critical_section_exit();
     return EP_PENDING;
 }
 
 EP_STATUS USBHAL::endpointWriteResult(uint8_t endpoint) {
     if (epComplete & (1 << endpoint)) {
+        core_util_critical_section_enter();
         epComplete &= ~(1 << endpoint);
+        core_util_critical_section_exit();
         return EP_COMPLETED;
     }
     return EP_PENDING;