dma + pio working at 40hz

This commit is contained in:
matthias wagner
2023-07-30 17:11:00 +02:00
parent c01e73aa75
commit ea1fc9bf71
3 changed files with 18 additions and 12 deletions

View File

@@ -20,10 +20,10 @@ const struct tft_config lcd_config = {
int main() int main()
{ {
set_sys_clock_khz(100 * 1000, true); set_sys_clock_khz(200 * 1000, true);
uint offset = pio_add_program(lcd_config.pio, &tft_program); uint offset = pio_add_program(lcd_config.pio, &tft_program);
tft_program_init(lcd_config.pio, lcd_config.sm, offset, lcd_config.gpio_din, lcd_config.gpio_clk, 10.f); tft_program_init(lcd_config.pio, lcd_config.sm, offset, lcd_config.gpio_din, lcd_config.gpio_clk, 1.f);
int dma_chan = dma_claim_unused_channel(true); int dma_chan = dma_claim_unused_channel(true);
dma_channel_config c = dma_channel_get_default_config(dma_chan); dma_channel_config c = dma_channel_get_default_config(dma_chan);
@@ -35,15 +35,23 @@ int main()
&c, &c,
&pio0->txf[lcd_config.sm], &pio0->txf[lcd_config.sm],
NULL, NULL,
320*480/12, 320*480/4,
false false
); );
dled_start(25); dled_start(25);
tft_init(&lcd_config, dma_chan); tft_init(&lcd_config, dma_chan);
sleep_ms(100); sleep_ms(100);
tft_fill(16000); tft_start_pixels(lcd_config.pio, lcd_config.sm);
while (true){
for(size_t i = 0; i < 8; i++) {
tft_fill(0);
dma_channel_wait_for_finish_blocking(dma_chan); dma_channel_wait_for_finish_blocking(dma_chan);
while (true); }
for(size_t i = 0; i < 8; i++) {
tft_fill(31807);
dma_channel_wait_for_finish_blocking(dma_chan);
}
}
return 0; return 0;
} }
void dled_start(uint pin){ void dled_start(uint pin){

View File

@@ -56,7 +56,7 @@ void tft_init(const struct tft_config* config, int dma_channel) {
gpio_put(tft_cfg.gpio_cs, 1); gpio_put(tft_cfg.gpio_cs, 1);
gpio_put(tft_cfg.gpio_rst, 1); gpio_put(tft_cfg.gpio_rst, 1);
//lcd_init(tft_cfg.pio, tft_cfg.sm, st7789_init_seq); lcd_init(tft_cfg.pio, tft_cfg.sm, st7789_init_seq);
gpio_put(tft_cfg.gpio_bl, 1); gpio_put(tft_cfg.gpio_bl, 1);
} }
void tft_fill(uint16_t color) { void tft_fill(uint16_t color) {
@@ -64,10 +64,8 @@ void tft_fill(uint16_t color) {
uint32_t two = 0; uint32_t two = 0;
two |= color_left; two |= color_left;
two |= color; two |= color;
//tft_start_pixels(tft_cfg.pio, tft_cfg.sm); uint32_t pix_buf[320*480/4];
uint32_t pix_buf[320*480/12]; for(size_t i = 0; i < 320*480/4; i++) {
size_t i;
for(i = 0; i < 320*480/12; i++) {
pix_buf[i] = two; pix_buf[i] = two;
} }
dma_channel_set_read_addr(dma_chan, pix_buf, true); dma_channel_set_read_addr(dma_chan, pix_buf, true);

View File

@@ -34,7 +34,7 @@ static inline void tft_program_init(PIO pio, uint sm, uint offset, uint data_pin
sm_config_set_out_pins(&c, data_pin, 1); sm_config_set_out_pins(&c, data_pin, 1);
sm_config_set_fifo_join(&c, PIO_FIFO_JOIN_TX); sm_config_set_fifo_join(&c, PIO_FIFO_JOIN_TX);
sm_config_set_clkdiv(&c, clk_div); sm_config_set_clkdiv(&c, clk_div);
sm_config_set_out_shift(&c, false, true, 32); sm_config_set_out_shift(&c, false, true, 8);
pio_sm_init(pio, sm, offset, &c); pio_sm_init(pio, sm, offset, &c);
pio_sm_set_enabled(pio, sm, true); pio_sm_set_enabled(pio, sm, true);
} }