Browse Source

8 state implementation, still not working

Greg Steiert 5 years ago
parent
commit
f44c588dd7
1 changed files with 14 additions and 13 deletions
  1. 14 13
      hw/bsp/double_m33_express/double_m33_express.c

+ 14 - 13
hw/bsp/double_m33_express/double_m33_express.c

@@ -93,19 +93,22 @@ void USB1_IRQHandler(void)
 #define NEO_EVENT_NEXT    3
 #define NEO_EVENT_START   4
 #define NEO_SCT_OUTPUT    6
-#define NEO_STATE_IDLE    24
+#define NEO_STATE_IDLE    8
+#define NEO_ARRAY_SIZE    (3 * NEOPIXEL_NUMBER)
 
-volatile uint32_t _neopixel_array[NEOPIXEL_NUMBER] = {0x202020, 0x101010};
+volatile uint32_t _neopixel_array[NEO_ARRAY_SIZE] = {0x10, 0x20, 0x30, 0x40, 0x50, 0x60};
 volatile uint32_t _neopixel_count = 0;
 
 void neopixel_int_handler(void){
   uint32_t eventFlag = NEO_SCT->EVFLAG;
-  if ((eventFlag == (1 << NEO_EVENT_NEXT)) && (_neopixel_count < (NEOPIXEL_NUMBER))) {
-    NEO_SCT->EV[NEO_EVENT_FALL_0].STATE = 0xFFFFFF & (~_neopixel_array[_neopixel_count]);
+  if ((eventFlag == (1 << NEO_EVENT_NEXT)) && (_neopixel_count < (NEO_ARRAY_SIZE))) {
+    NEO_SCT->EV[NEO_EVENT_FALL_0].STATE = 0xFF & (~_neopixel_array[_neopixel_count]);
     _neopixel_count += 1;
+    NEO_SCT->EVFLAG = eventFlag;
+    NEO_SCT->CTRL &= ~(SCT_CTRL_HALT_L_MASK);
+  } else {
+    NEO_SCT->EVFLAG = eventFlag;
   }
-  NEO_SCT->EVFLAG = eventFlag;
-  NEO_SCT->CTRL &= ~(SCT_CTRL_HALT_L_MASK);
 }
 
 void SCT0_DriverIRQHandler(void){
@@ -115,15 +118,13 @@ void SCT0_DriverIRQHandler(void){
 
 void neopixel_update(uint32_t pixel, uint32_t color){
   if (pixel < NEOPIXEL_NUMBER) { 
-/*
     uint32_t index = 3*pixel;
     _neopixel_array[index++] = color>>8; // green first
     _neopixel_array[index++] = color>>16; // red
     _neopixel_array[index] = color; // blue
-*/
-    _neopixel_array[pixel] = color;
+//    _neopixel_array[pixel] = color;
     _neopixel_count = 0;
-    NEO_SCT->EV[NEO_EVENT_FALL_0].STATE = 0xFFFFFF & (~_neopixel_array[0]);
+    NEO_SCT->EV[NEO_EVENT_FALL_0].STATE = 0xFF & (~_neopixel_array[0]);
     NEO_SCT->CTRL &= ~(SCT_CTRL_HALT_L_MASK);
   }
 }
@@ -146,8 +147,8 @@ void neopixel_init(void) {
   NEO_SCT->EV[NEO_EVENT_START].STATE = (1 << NEO_STATE_IDLE);
   NEO_SCT->EV[NEO_EVENT_START].CTRL = (
     kSCTIMER_OutputLowEvent | SCT_EV_CTRL_IOSEL(NEO_SCT_OUTPUT) | 
-    SCT_EV_CTRL_STATELD(1) | SCT_EV_CTRL_STATEV(23));
-  NEO_SCT->EV[NEO_EVENT_RISE].STATE = 0xFFFFFE;
+    SCT_EV_CTRL_STATELD(1) | SCT_EV_CTRL_STATEV(7));
+  NEO_SCT->EV[NEO_EVENT_RISE].STATE = 0xFE;
   NEO_SCT->EV[NEO_EVENT_RISE].CTRL = (
     kSCTIMER_MatchEventOnly | SCT_EV_CTRL_MATCHSEL(NEO_MATCH_PERIOD) | 
     SCT_EV_CTRL_STATELD(0) | SCT_EV_CTRL_STATEV(31));
@@ -155,7 +156,7 @@ void neopixel_init(void) {
   NEO_SCT->EV[NEO_EVENT_FALL_0].CTRL = (
     kSCTIMER_MatchEventOnly | SCT_EV_CTRL_MATCHSEL(NEO_MATCH_0) | 
     SCT_EV_CTRL_STATELD(0) | SCT_EV_CTRL_STATEV(31));
-  NEO_SCT->EV[NEO_EVENT_FALL_1].STATE = 0xFFFFFF;
+  NEO_SCT->EV[NEO_EVENT_FALL_1].STATE = 0xFF;
   NEO_SCT->EV[NEO_EVENT_FALL_1].CTRL = (
     kSCTIMER_MatchEventOnly | SCT_EV_CTRL_MATCHSEL(NEO_MATCH_1) | 
     SCT_EV_CTRL_STATELD(0) | SCT_EV_CTRL_STATEV(31));