Browse Source

test: add interrupt based demo

closes #8
Dmitry 8 years ago
parent
commit
f911521140
1 changed files with 36 additions and 1 deletions
  1. 36 1
      demo/cdc_loop.c

+ 36 - 1
demo/cdc_loop.c

@@ -16,6 +16,7 @@
 #include <stdint.h>
 #include <stdbool.h>
 #include <string.h>
+#include "stm32.h"
 #include "usb.h"
 #include "usb_cdc.h"
 
@@ -27,6 +28,8 @@
 #define CDC_NTF_SZ      0x08
 #define CDC_LOOPBACK
 
+//#define CDC_USE_IRQ   /* uncomment to build interrupt-based demo */
+
 struct cdc_config {
     struct usb_config_descriptor        config;
     struct usb_interface_descriptor     comm;
@@ -281,11 +284,43 @@ static void cdc_init_usbd(void) {
     usbd_reg_descr(&udev, cdc_getdesc);
 }
 
+#if defined(CDC_USE_IRQ)
+#if defined(STM32L052xx)
+    #define USB_HANDLER     USB_IRQHandler
+    #define USB_NVIC_IRQ    USB_IRQn
+#elif defined(STM32L100xC)
+    #define USB_HANDLER     USB_LP_IRQHandler
+    #define USB_NVIC_IRQ    USB_LP_IRQn
+#elif defined(STM32L476xx)
+    #define USB_HANDLER     OTG_FS_IRQHandler
+    #define USB_NVIC_IRQ    OTG_FS_IRQn
+#elif defined(STM32F103x6)
+    #define USB_HANDLER     USB_LP_CAN1_RX0_IRQHandler
+    #define USB_NVIC_IRQ    USB_LP_CAN1_RX0_IRQn
+#else
+    #error Not supported
+#endif
+
+void USB_HANDLER(void) {
+    usbd_poll(&udev);
+}
+
 void main(void) {
     cdc_init_usbd();
+    NVIC_EnableIRQ(USB_NVIC_IRQ);
     usbd_enable(&udev, true);
     usbd_connect(&udev, true);
     while(1) {
-    usbd_poll(&udev);
+        __WFI();
     }
 }
+#else
+void main(void) {
+    cdc_init_usbd();
+    usbd_enable(&udev, true);
+    usbd_connect(&udev, true);
+    while(1) {
+        usbd_poll(&udev);
+    }
+}
+#endif