diff --git a/build-number.txt b/build-number.txt index e828e5d..18e1dd6 100644 --- a/build-number.txt +++ b/build-number.txt @@ -1 +1 @@ -434 +442 diff --git a/src/animation.c b/src/animation.c index 7761c31..3da8329 100644 --- a/src/animation.c +++ b/src/animation.c @@ -4,12 +4,21 @@ volatile bool Animation_FrameFlag = false; +#if LED_COLUMNS == 12 const unsigned int Animation_LEDOrder[LED_COUNT] = { 19, 27, 21, 13, 0, 4, 24, 8, 12, 15, 6, 5, 28, 29, 17, 3, 18, 26, 22, 10, 16, 20, 30, 1, 25, 2, 14, 31, 7, 11, 9, 23 }; +#elif LED_COLUMNS == 9 +const unsigned int Animation_LEDOrder[LED_COUNT] = +{ + 19, 21, 13, 0, 4, 8, 12, 15, 6, 5, + 17, 3, 18, 22, 10, 16, 20, 1, + 2, 14, 7, 11, 9, 23 +}; +#endif LED_Colour_t Animation_GetColour(unsigned int step, unsigned int brightness) { diff --git a/src/led.c b/src/led.c index 365545b..b7dea1f 100644 --- a/src/led.c +++ b/src/led.c @@ -6,6 +6,7 @@ volatile bool LED_FrameFlag = false; volatile bool LED_SuspendFlag = false; bool LED_Suspended = false; +#if LED_COLUMNS == 12 #define LED_ODR_MASK ((1 << PIN_LED_R_0) | (1 << PIN_LED_G_0) \ | (1 << PIN_LED_B_0) | (1 << PIN_LED_R_1) \ | (1 << PIN_LED_G_1) | (1 << PIN_LED_B_1) \ @@ -26,6 +27,27 @@ bool LED_Suspended = false; | (1 << PIN_LED_R_2 * 2) | (1 << PIN_LED_G_2 * 2) \ | (1 << PIN_LED_B_2 * 2) | (1 << PIN_LED_R_3 * 2) \ | (1 << PIN_LED_G_3 * 2) | (1 << PIN_LED_B_3 * 2)) +#elif LED_COLUMNS == 9 +#define LED_ODR_MASK ((1 << PIN_LED_R_0) | (1 << PIN_LED_G_0) \ + | (1 << PIN_LED_B_0) | (1 << PIN_LED_R_1) \ + | (1 << PIN_LED_G_1) | (1 << PIN_LED_B_1) \ + | (1 << PIN_LED_R_2) | (1 << PIN_LED_G_2) \ + | (1 << PIN_LED_B_2)) + +#define LED_MODER_MASK ((3 << PIN_LED_R_0 * 2) | (3 << PIN_LED_G_0 * 2) \ + | (3 << PIN_LED_B_0 * 2) | (3 << PIN_LED_R_1 * 2) \ + | (3 << PIN_LED_G_1 * 2) | (3 << PIN_LED_B_1 * 2) \ + | (3 << PIN_LED_R_2 * 2) | (3 << PIN_LED_G_2 * 2) \ + | (3 << PIN_LED_B_2 * 2)) + +#define LED_MODER ((1 << PIN_LED_R_0 * 2) | (1 << PIN_LED_G_0 * 2) \ + | (1 << PIN_LED_B_0 * 2) | (1 << PIN_LED_R_1 * 2) \ + | (1 << PIN_LED_G_1 * 2) | (1 << PIN_LED_B_1 * 2) \ + | (1 << PIN_LED_R_2 * 2) | (1 << PIN_LED_G_2 * 2) \ + | (1 << PIN_LED_B_2 * 2)) +#else +#error Unsupported LED column count +#endif // TIM3 is clocked by APB1 and thus receives only half the system clock. The 4 // LSBs have bit lengths 2, 4, 8, and 16 cycles and are generated blocking from @@ -35,6 +57,7 @@ static const uint16_t LED_BitLengths[LED_BITS - 4] = 16, 32, 64, 128, 256, 512, 1024, 2048 }; +#if LED_COLUMNS == 12 static const int LED_Pins[LED_COLUMNS] = { PIN_LED_R_0, PIN_LED_G_0, PIN_LED_B_0, @@ -42,6 +65,14 @@ static const int LED_Pins[LED_COLUMNS] = PIN_LED_R_2, PIN_LED_G_2, PIN_LED_B_2, PIN_LED_R_3, PIN_LED_G_3, PIN_LED_B_3 }; +#elif LED_COLUMNS == 9 +static const int LED_Pins[LED_COLUMNS] = +{ + PIN_LED_R_0, PIN_LED_G_0, PIN_LED_B_0, + PIN_LED_R_1, PIN_LED_G_1, PIN_LED_B_1, + PIN_LED_R_2, PIN_LED_G_2, PIN_LED_B_2 +}; +#endif // Number of 16-bit values to be transferred to the GPIO's output register via // DMA. Each value contains output values for all columns. For each row, a diff --git a/src/led.h b/src/led.h index cb9f8ea..0d35897 100644 --- a/src/led.h +++ b/src/led.h @@ -5,9 +5,11 @@ #include "stm32f030x6.h" #include "pinning.h" -#define LED_BITS 12 +#define LED_BITS 12 // BCM resolution in bits #define LED_ROWS 8 // Rows are driven by a shift register -#define LED_COLUMNS 12 // Columns are driven by the MCU directly +#define LED_COLUMNS 12 // Columns are driven by the MCU directly. + // Set to 9 to free the SWD pins and enable + // debugging. #define LED_COUNT (LED_ROWS * LED_COLUMNS / 3) typedef struct