From fec02919c34a00e8829fed788fea33debaae6884 Mon Sep 17 00:00:00 2001 From: jaseg Date: Thu, 25 May 2023 22:23:09 +0200 Subject: Driver Filter WIP --- center_fw/Makefile | 13 +--- center_fw/main.c | 194 ++++------------------------------------------------- 2 files changed, 15 insertions(+), 192 deletions(-) (limited to 'center_fw') diff --git a/center_fw/Makefile b/center_fw/Makefile index 5987b9f..98c0f5b 100644 --- a/center_fw/Makefile +++ b/center_fw/Makefile @@ -14,7 +14,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -CUBE_PATH ?= $(wildcard ~)/ref/stm32cube/STM32CubeF0 +CUBE_PATH ?= $(wildcard ~)/ref/STM32CubeF0 CMSIS_PATH ?= $(CUBE_PATH)/Drivers/CMSIS CMSIS_DEV_PATH ?= $(CMSIS_PATH)/Device/ST/STM32F0xx HAL_PATH ?= $(CUBE_PATH)/Drivers/STM32F0xx_HAL_Driver @@ -79,7 +79,7 @@ sources.tar.xz.zip: sources.tar.xz sources.c: sources.tar.xz.zip xxd -i $< | head -n -1 | sed 's/=/__attribute__((section(".source_tarball"))) =/' > $@ -main.elf: main.c startup_stm32f030x6.s system_stm32f0xx.c $(HAL_PATH)/Src/stm32f0xx_ll_utils.c base.c cmsis_exports.c ../common/8b10b.c adc.c protocol.c 8seg_protocol.c transmit.c +main.elf: main.c startup_stm32f030x6.s system_stm32f0xx.c base.c $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS) $(OBJCOPY) -O ihex $@ $(@:.elf=.hex) $(OBJCOPY) -O binary $@ $(@:.elf=.bin) @@ -89,15 +89,6 @@ main.elf: main.c startup_stm32f030x6.s system_stm32f0xx.c $(HAL_PATH)/Src/stm32f program: main.elf openocd.cfg openocd -f openocd.cfg -c "program $< verify reset exit" -8b10b_test_encode: 8b10b_test_encode.c 8b10b.c - gcc -o $@ $^ - -8b10b_test_decode: 8b10b_test_decode.c 8b10b.c - gcc -o $@ $^ - -protocol_test: protocol.c protocol_test.c - gcc -o $@ -O0 -Wall -Wextra -g -I../common $^ - clean: rm -f **.o rm -f main.elf main.hex main.bin main.map main.lst diff --git a/center_fw/main.c b/center_fw/main.c index 71d3f00..3008dd2 100644 --- a/center_fw/main.c +++ b/center_fw/main.c @@ -17,113 +17,6 @@ #include "global.h" -#include "adc.h" -#include "8seg_protocol.h" -#include "transmit.h" - -volatile unsigned int sys_time = 0; -volatile unsigned int sys_time_seconds = 0; -uint16_t jitter_meas_avg_ns = 0; - -void TIM1_BRK_UP_TRG_COM_Handler() { - TIM1->SR &= ~TIM_SR_UIF_Msk; -} - -void set_drv_gpios(uint8_t val) { - val = ~val; - int a=!(val&1), b=!(val&2), c=!(val&4), d=!(val&8); - GPIOA->BSRR = (((!a)<<3 | (!b)<<7 | (!c)<<6 | (!d)<<4)<<16) | ((a<<3) | (b<<7) | (c<<6) | (d<<4)); -} - -uint8_t out_state = 0x0f; -void set_outputs(uint8_t val[8]) { - /* TODO implement BCM for digital brightness control */ - int x = 0; - for (int i=0; i<8; i++) - if (val[i] > 127) - x |= 1<BSRR = (1<<2) << (load ? 0 : 16); -} - -void blank(void) { - GPIOA->BRR = (1<<9) | (1<<10); - set_drv_gpios(0); -} - -bool has_sync = 0; -void unblank_low(int bit) { - if (backchannel_frame) { /* Set from protocol.c */ - if (tx_next_bit() == 1) - set_load(1); - else /* 0; but also TX_IDLE */ - set_load(0); - - } else if (has_sync) { - if (bit) { - //GPIOA->BSRR = (1<<10); - set_drv_gpios(out_state & 0xf); - - } else { - //GPIOA->BSRR = (1<<9); - set_drv_gpios(out_state >> 4); - } - } -} - -int sync_ctr = 0xffff; -void TIM3_IRQHandler(void) { - if (TIM3->SR & TIM_SR_CC2IF) { - if (sync_ctr > 10) - has_sync = 0; - else - sync_ctr += 1; - EXTI->IMR = (1<<0); - GPIOB->BSRR = (1<<1); - GPIOA->BRR = (1<<9) | (1<<10); - - } else if (TIM3->SR & TIM_SR_CC3IF) { - int bit = GPIOA->IDR & (1<<5); /* Sample current polarity */ - unblank_low(!bit); - - } else { - blank(); - } - - TIM3->SR = 0; -} - -void EXTI0_1_IRQHandler(void) { - static uint32_t jitter_meas_sum = 0, jitter_meas_cnt = 0; - EXTI->PR = (1<<0); - - /* Store old counter value for jitter measurement. Let it overflow to handle negative offsets. */ - int16_t cnt = (int16_t)TIM3->CNT; - /* Re-initialize the counter to align it with the signal edge */ - TIM3->EGR |= TIM_EGR_UG; - - /* Don't handle overflow of _sum here since this value is only for monitoring anyway */ - jitter_meas_sum += (cnt >= 0) ? cnt : -cnt; - if (++jitter_meas_cnt == 1000) { /* One measurement roughly every 800ms */ - jitter_meas_avg_ns = jitter_meas_sum; - } - - EXTI->IMR = 0; - GPIOB->BRR = (1<<1); - has_sync = 1; - sync_ctr = 0; -} - int main(void) { //RCC->CR |= RCC_CR_HSEON; //while (!(RCC->CR&RCC_CR_HSERDY)); @@ -133,82 +26,30 @@ int main(void) { while (!(RCC->CR&RCC_CR_PLLRDY)); RCC->CFGR |= (2<AHBENR |= RCC_AHBENR_DMAEN | RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN | RCC_AHBENR_FLITFEN; - RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN | RCC_APB2ENR_ADCEN| RCC_APB2ENR_DBGMCUEN | RCC_APB2ENR_TIM1EN | RCC_APB2ENR_TIM1EN;; - RCC->APB1ENR |= RCC_APB1ENR_TIM3EN; - - /* TIM3 foo */ - TIM3->CCMR2 = (6<CCER = TIM_CCER_CC4E; /* Enable capture/compare unit 4 connected to ADC */ - TIM3->CCER = TIM_CCER_CC3E; /* Enable capture/compare unit 3 for unblank interrupt */ - TIM3->CCER = TIM_CCER_CC2E; - - TIM3->PSC = 48-1; /* 48MHz -> 1MHz */ - TIM3->CCR2 = 800-1-1; - TIM3->CCR3 = 100-1; /* CC3 is used for unblanking in the ISR, fires 30us after beginning of cycle. */ - TIM3->CCR4 = 800-100-1; /* CC4 is ADC trigger, fire 30us before end of cycle. */ - TIM3->ARR = 800-1; /* 1MHz -> 5kHz */ - - TIM3->DIER |= TIM_DIER_CC2IE | TIM_DIER_CC3IE | TIM_DIER_CC4IE | TIM_DIER_UIE; - - TIM3->CR1 |= TIM_CR1_CEN; - NVIC_EnableIRQ(TIM3_IRQn); - NVIC_SetPriority(TIM3_IRQn, 3<<5); - - GPIOB->MODER |= (1<OSPEEDR |= (2<IMR = (1<<0); /* PA0 Vmeas_A for sync */ - EXTI->RTSR |= (1<<0); - NVIC_EnableIRQ(EXTI0_1_IRQn); - NVIC_SetPriority(EXTI0_1_IRQn, 4<<5); + RCC->AHBENR |= RCC_AHBENR_GPIOAEN; GPIOA->MODER |= - (0<PUPDR |= (2<OSPEEDR |= - (2< 10000) { + if (cnt > 5000) { cnt = 0; - seg_c += 1; - if (seg_c == 8) - seg_c = 0; - set_outputs_binary(1<ODR = 1; break; + case 1: GPIOA->ODR = 3; break; + case 2: GPIOA->ODR = 2; break; + case 3: GPIOA->ODR = 0; break; + } } } @@ -230,12 +71,3 @@ void PendSV_Handler(void) { asm volatile ("bkpt"); } -void SysTick_Handler(void) { - static int n = 0; - sys_time++; - if (n++ == 1000) { - n = 0; - sys_time_seconds++; - } -} - -- cgit