Waveform interleaving seems to work

This commit is contained in:
jaseg 2023-08-28 20:53:10 +02:00
parent e54c5479c3
commit bf9e310360
4 changed files with 13586 additions and 7346 deletions

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -30,7 +30,7 @@ DEVICE := STM32G070RB
ASM_SOURCES := startup.s
C_SOURCES := src/main.c
C_SOURCES := src/main.c $(BUILDDIR)/generated/waveform_tables.c
CPP_SOURCES := # - none -
@ -93,6 +93,8 @@ COMMON_CFLAGS += -O$(OPT) -std=gnu2x -g
COMMON_CFLAGS += $(DEVICE_DEFINES)
COMMON_CFLAGS += -DDEBUG=$(DEBUG)
GEN_HEADERS := $(BUILDDIR)/generated/waveform_tables.h
HOST_CFLAGS += $(COMMON_CFLAGS)
# for musl
@ -152,7 +154,7 @@ $(BUILDDIR)/src/%.o: src/%.s
mkdir -p $(@D)
$(CC) $(COMMON_CFLAGS) $(CFLAGS) $(INT_CFLAGS) -o $@ -c $<
$(BUILDDIR)/src/%.o: src/%.c
$(BUILDDIR)/src/%.o: src/%.c $(GEN_HEADERS)
mkdir -p $(@D)
$(CC) $(COMMON_CFLAGS) $(CFLAGS) $(INT_CFLAGS) -o $@ -c $<
@ -168,21 +170,26 @@ $(BUILDDIR)/%.o: %.s
mkdir -p $(@D)
$(CC) $(COMMON_CFLAGS) $(CFLAGS) $(EXT_CFLAGS) -o $@ -c $<
$(BUILDDIR)/generated/waveform_tables.c: tools/template_wave_tables.py $(BUILDDIR)/generated/waveform_tables.h
mkdir -p $(@D)
python $< $@
$(BUILDDIR)/generated/waveform_tables.h: tools/template_wave_tables.py
mkdir -p $(@D)
python $< --header $@
venv:
test -d venv || python3 -m venv --system-site-packages venv
source venv/bin/activate && pip install cxxfilt pyelftools libarchive matplotlib
clean:
rm -rf $(BUILDDIR)/src
rm -rf $(BUILDDIR)/generated
rm -f $(BUILDDIR)/**.o
rm -f $(BUILDDIR)/$(BINARY)
rm -f $(BUILDDIR)/$(BINARY:.elf=.map)
rm -f $(BUILDDIR)/$(BINARY:.elf=-symbol-sizes.dot)
rm -f $(BUILDDIR)/$(BINARY:.elf=-symbol-sizes.pdf)
rm -f $(BUILDDIR)/crc32_test
rm -f $(BUILDDIR)/microcobs_test_sg
rm -f $(BUILDDIR)/microcobs_test
rm -f $(BUILDDIR)/microcobs_decode_test
mrproper: clean
rm -rf build

View file

@ -1,271 +1,25 @@
#include <global.h>
#include <string.h>
#include "generated/waveform_tables.h"
volatile uint64_t sys_time_us;
uint32_t read_fuse_monitor(void);
void set_rj45_leds(uint32_t leds);
void set_status_leds(uint32_t leds);
static uint32_t read_fuse_monitor(void);
static void set_rj45_leds(uint32_t leds);
static void set_status_leds(uint32_t leds);
static void dma_tx_constant(size_t table_size, uint16_t constant);
static void dma_tx_waveform(size_t table_size, const uint16_t *table);
uint16_t waveform[512] = {
128, 255,
131, 255,
134, 255,
137, 255,
140, 254,
143, 254,
146, 254,
149, 253,
152, 253,
155, 252,
158, 251,
162, 250,
165, 250,
167, 249,
170, 248,
173, 246,
176, 245,
179, 244,
182, 243,
185, 241,
188, 240,
190, 238,
193, 237,
196, 235,
198, 234,
201, 232,
203, 230,
206, 228,
208, 226,
211, 224,
213, 222,
215, 220,
218, 218,
220, 215,
222, 213,
224, 211,
226, 208,
228, 206,
230, 203,
232, 201,
234, 198,
235, 196,
237, 193,
238, 190,
240, 188,
241, 185,
243, 182,
244, 179,
245, 176,
246, 173,
248, 170,
249, 167,
250, 165,
250, 162,
251, 158,
252, 155,
253, 152,
253, 149,
254, 146,
254, 143,
254, 140,
255, 137,
255, 134,
255, 131,
255, 128,
255, 124,
255, 121,
255, 118,
254, 115,
254, 112,
254, 109,
253, 106,
253, 103,
252, 100,
251, 97,
250, 93,
250, 90,
249, 88,
248, 85,
246, 82,
245, 79,
244, 76,
243, 73,
241, 70,
240, 67,
238, 65,
237, 62,
235, 59,
234, 57,
232, 54,
230, 52,
228, 49,
226, 47,
224, 44,
222, 42,
220, 40,
218, 37,
215, 35,
213, 33,
211, 31,
208, 29,
206, 27,
203, 25,
201, 23,
198, 21,
196, 20,
193, 18,
190, 17,
188, 15,
185, 14,
182, 12,
179, 11,
176, 10,
173, 9,
170, 7,
167, 6,
165, 5,
162, 5,
158, 4,
155, 3,
152, 2,
149, 2,
146, 1,
143, 1,
140, 1,
137, 0,
134, 0,
131, 0,
128, 0,
124, 0,
121, 0,
118, 0,
115, 1,
112, 1,
109, 1,
106, 2,
103, 2,
100, 3,
97, 4,
93, 5,
90, 5,
88, 6,
85, 7,
82, 9,
79, 10,
76, 11,
73, 12,
70, 14,
67, 15,
65, 17,
62, 18,
59, 20,
57, 21,
54, 23,
52, 25,
49, 27,
47, 29,
44, 31,
42, 33,
40, 35,
37, 37,
35, 40,
33, 42,
31, 44,
29, 47,
27, 49,
25, 52,
23, 54,
21, 57,
20, 59,
18, 62,
17, 65,
15, 67,
14, 70,
12, 73,
11, 76,
10, 79,
9, 82,
7, 85,
6, 88,
5, 90,
5, 93,
4, 97,
3, 100,
2, 103,
2, 106,
1, 109,
1, 112,
1, 115,
0, 118,
0, 121,
0, 124,
0, 127,
0, 131,
0, 134,
0, 137,
1, 140,
1, 143,
1, 146,
2, 149,
2, 152,
3, 155,
4, 158,
5, 162,
5, 165,
6, 167,
7, 170,
9, 173,
10, 176,
11, 179,
12, 182,
14, 185,
15, 188,
17, 190,
18, 193,
20, 196,
21, 198,
23, 201,
25, 203,
27, 206,
29, 208,
31, 211,
33, 213,
35, 215,
37, 218,
40, 220,
42, 222,
44, 224,
47, 226,
49, 228,
52, 230,
54, 232,
57, 234,
59, 235,
62, 237,
65, 238,
67, 240,
70, 241,
73, 243,
76, 244,
79, 245,
82, 246,
85, 248,
88, 249,
90, 250,
93, 250,
97, 251,
100, 252,
103, 253,
106, 253,
109, 254,
112, 254,
115, 254,
118, 255,
121, 255,
124, 255,
};
static uint8_t tx_datagram[32] = {
/* FIXME test data */
0x00, 0xff, 0xAA, 0x55, 0xfe, 0x18, 0xcc, 0x10,
0x00, 0xff, 0xAA, 0x55, 0xfe, 0x18, 0xcc, 0x10,
0x00, 0xff, 0xAA, 0x55, 0xfe, 0x18, 0xcc, 0x10,
0x00, 0xff, 0xAA, 0x55, 0xfe, 0x18, 0xcc, 0x10 };
static size_t tx_bitpos = 0;
static size_t tx_sympos = 0;
static int tx_last_bit = 0;
int main(void) {
@ -401,11 +155,10 @@ int main(void) {
TIM1->CR1 |= TIM_CR1_CEN;
DMAMUX1->CCR = 25;
DMA1_Channel1->CCR = (1<<DMA_CCR_MSIZE_Pos) | (1<<DMA_CCR_PSIZE_Pos) | DMA_CCR_MINC | DMA_CCR_CIRC | DMA_CCR_DIR | DMA_CCR_TCIE;
DMA1_Channel1->CNDTR = COUNT_OF(waveform);
DMA1_Channel1->CPAR = &TIM1->DMAR;
DMA1_Channel1->CMAR = &waveform;
DMA1_Channel1->CCR |= DMA_CCR_EN;
DMA1_Channel1->CPAR = (uint32_t)&TIM1->DMAR;
NVIC_EnableIRQ(DMA1_Channel1_IRQn);
NVIC_SetPriority(DMA1_Channel1_IRQn, 0);
dma_tx_constant(COUNT_OF(waveform_zero_one), 0x00);
int i = 0;
int j = 0;
@ -420,6 +173,55 @@ int main(void) {
}
}
void dma_tx_waveform(size_t table_size, const uint16_t *table) {
DMA1_Channel1->CCR = 0;
DMA1_Channel1->CCR = (1<<DMA_CCR_MSIZE_Pos) | (1<<DMA_CCR_PSIZE_Pos) | DMA_CCR_MINC | DMA_CCR_DIR | DMA_CCR_TCIE;
DMA1_Channel1->CNDTR = table_size;
DMA1_Channel1->CMAR = (uint32_t)table;
DMA1_Channel1->CCR |= DMA_CCR_EN;
}
void dma_tx_constant(size_t table_size, uint16_t constant) {
static uint16_t tx_constant;
tx_constant = constant;
DMA1_Channel1->CCR = 0;
DMA1_Channel1->CCR = (1<<DMA_CCR_MSIZE_Pos) | (1<<DMA_CCR_PSIZE_Pos) | DMA_CCR_DIR | DMA_CCR_TCIE;
DMA1_Channel1->CNDTR = table_size;
DMA1_Channel1->CMAR = (uint32_t)&tx_constant;
DMA1_Channel1->CCR |= DMA_CCR_EN;
}
void DMA1_Channel1_IRQHandler() {
static int transfer_errors = 0;
if (DMA1->ISR & DMA_ISR_TEIF1) {
transfer_errors ++;
}
DMA1->IFCR = DMA_IFCR_CGIF1;
int bit = !!(tx_datagram[tx_sympos] & (1<<tx_bitpos));
if (tx_last_bit == bit) {
dma_tx_constant(COUNT_OF(waveform_zero_one), bit ? WAVEFORM_CONST_ONE : WAVEFORM_CONST_ZERO);
} else if (bit) {
dma_tx_waveform(COUNT_OF(waveform_zero_one), waveform_zero_one);
} else {
dma_tx_waveform(COUNT_OF(waveform_zero_one), waveform_one_zero);
}
tx_last_bit = bit;
tx_bitpos ++;
if (tx_bitpos >= 8) {
tx_bitpos = 0;
tx_sympos ++;
if (tx_sympos >= COUNT_OF(tx_datagram)) {
tx_sympos = 0;
}
}
}
uint32_t read_fuse_monitor() {
uint32_t idr_a = GPIOA->IDR;
uint32_t idr_c = GPIOC->IDR;