150 lines
4.2 KiB
C
150 lines
4.2 KiB
C
/*
|
|
* "Flames"
|
|
* Boeing-inspired GAT Addon Firmware
|
|
* by true
|
|
*
|
|
* version 0.0.1
|
|
*
|
|
* code was made for different random addons I designed for dc32,
|
|
* then adapted to each one. so things might be a mess.
|
|
*
|
|
* I had only a few hours on and off over a week to get the code done.
|
|
* lots of shit was copied from demo code and adapted to work. certainly
|
|
* isn't the best way to get this done.
|
|
*
|
|
* I know I could save some power, but seeing as all the badges burn it in
|
|
* LEDs and almost nobody else power optimizes their badge code, who cares?
|
|
*
|
|
* sorry. wasn't procrastination I swear. all the ideas were last minute.
|
|
*
|
|
* notes:
|
|
*
|
|
* - last 2K of flash memory is reserved for configuration storage
|
|
*/
|
|
|
|
#include <ch32v20x.h>
|
|
#include <stdint.h>
|
|
|
|
#include "src/adc.h"
|
|
#include "src/btn.h"
|
|
#include "src/config.h"
|
|
#include "src/i2c.h"
|
|
#include "src/led.h"
|
|
#include "src/rand.h"
|
|
#include "src/touch.h"
|
|
#include "src/ui.h"
|
|
|
|
|
|
void systick_init(void)
|
|
{
|
|
SysTick->CMP = (SystemCoreClock / 1024) - 1; // we want a 1024Hz interrupt
|
|
SysTick->CNT = 0; // clear counter
|
|
SysTick->CTLR = 0xF; // start counter in /1 mode, enable interrupts, auto-reset counter
|
|
SysTick->SR = 0; // clear count comparison flag
|
|
|
|
NVIC_EnableIRQ(SysTicK_IRQn); // enable interrupt
|
|
}
|
|
|
|
void gpio_init()
|
|
{
|
|
GPIO_InitTypeDef gpio = {0};
|
|
|
|
gpio.GPIO_Speed = GPIO_Speed_2MHz;
|
|
|
|
// unused pins (PD0=SWI2C_SDA, PD1=NC)
|
|
gpio.GPIO_Mode = GPIO_Mode_IPD;
|
|
gpio.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
|
|
GPIO_Init(GPIOD, &gpio);
|
|
|
|
// unused PORTA pins (PA0=NC, PA1=NC, PA5=NC, PA9=NC, PA15=NC)
|
|
gpio.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_5 | GPIO_Pin_9 | GPIO_Pin_15;
|
|
GPIO_Init(GPIOA, &gpio);
|
|
|
|
// unused PORTB pins (PB3=NC, PB4=SWI2C_SCL)
|
|
gpio.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4;
|
|
GPIO_Init(GPIOB, &gpio);
|
|
|
|
// buttons (PA2=BTN_UP, PA3=BTN_DN)
|
|
gpio.GPIO_Mode = GPIO_Mode_IPU;
|
|
gpio.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
|
|
GPIO_Init(GPIOA, &gpio);
|
|
|
|
// lightsense cathode (PA4=LSENS_K)
|
|
gpio.GPIO_Mode = GPIO_Mode_Out_PP;
|
|
gpio.GPIO_Pin = GPIO_Pin_4;
|
|
GPIO_Init(GPIOA, &gpio);
|
|
|
|
// lightsense anode (PB4=LSENS_A)
|
|
gpio.GPIO_Mode = GPIO_Mode_Out_PP;
|
|
gpio.GPIO_Pin = GPIO_Pin_5;
|
|
GPIO_Init(GPIOA, &gpio);
|
|
|
|
// rear LED (6=T3C1, 7=T3C2)
|
|
gpio.GPIO_Mode = GPIO_Mode_AF_PP;
|
|
gpio.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
|
|
GPIO_Init(GPIOA, &gpio);
|
|
|
|
// rear LED (0=T3C3, 1=T3C4)
|
|
gpio.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
|
|
GPIO_Init(GPIOB, &gpio);
|
|
|
|
// I2C SCL, SCA for on-board devices
|
|
gpio.GPIO_Mode = GPIO_Mode_AF_OD;
|
|
gpio.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
|
|
GPIO_Init(GPIOB, &gpio);
|
|
}
|
|
|
|
int main(void)
|
|
{
|
|
// configure core
|
|
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
|
|
SystemCoreClockUpdate();
|
|
|
|
// enable peripheral clocks
|
|
RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3 | RCC_APB1Periph_I2C1 |
|
|
RCC_APB1Periph_PWR, ENABLE);
|
|
RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA |
|
|
RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOD |
|
|
RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC2, ENABLE);
|
|
|
|
// configure gpio pins
|
|
gpio_init();
|
|
|
|
// get saved settings
|
|
i2c_init();
|
|
userconf_load();
|
|
|
|
// configure hardware
|
|
adc_init(); // configure ADC1 for lightsense, also configures ADC clock divider
|
|
btn_init(); // configures hardware physical buttons
|
|
led_init(); // configure matrix IC as well as boeing PWM
|
|
|
|
// by default, top LED is in light sense mode
|
|
adc_set_mode_lsens(LSENS_READING_IDLE);
|
|
|
|
// configure random
|
|
tinymt32_init(&tinymt32_s, DBGMCU_GetCHIPID() | userconf.checksum);
|
|
|
|
// configure UI
|
|
ui_init();
|
|
|
|
// initialize led programs
|
|
ledprog_top_init();
|
|
ledprog_bot_init();
|
|
|
|
// configure systick interrupt
|
|
systick_init();
|
|
|
|
|
|
// do system shit
|
|
while(1) {
|
|
__WFI();
|
|
|
|
// after sending LEDs, run our program
|
|
// to update the LED buffer for next time
|
|
if ((ticnt & 0x7) == 0) {
|
|
ui_render();
|
|
}
|
|
}
|
|
}
|