main.cpp 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #include <Arduino.h>
  2. #include "dma_st7789.hpp"
  3. #include <JPEGDEC.h>
  4. #define TFT_CS 17
  5. #define TFT_RST 21
  6. #define TFT_DC 20
  7. // サンプル画像を埋め込む
  8. __asm(\
  9. ".section \".rodata\" \n"\
  10. ".balign 4\n"\
  11. ".global _sample_picture\n"\
  12. ".global _picture_size\n"\
  13. "_sample_picture:\n"\
  14. ".incbin \"include/constructor.jpg\"\n"\
  15. ".set _picture_size, . - _sample_picture\n"\
  16. ".section \".text\"\n"\
  17. );
  18. extern const uint16_t _sample_picture[];
  19. extern uint32_t _picture_size[];
  20. // ST7789LCD(DMA付き)
  21. dma_st7789 st7789_lcd = dma_st7789(TFT_CS, TFT_DC, TFT_RST);
  22. // JPEGデコーダー
  23. JPEGDEC jpeg;
  24. // MCUを描画するコールバック関数
  25. int mcu_draw(JPEGDRAW *draw)
  26. {
  27. if( draw->iBpp == 16 ){
  28. st7789_lcd.transfer(draw->x, draw->y, draw->iWidth, draw->iHeight, (uint8_t *)(draw->pPixels) );
  29. }
  30. return 1;
  31. }
  32. void setup() {
  33. Serial1.begin(115200);
  34. // SPIクロック100MHz
  35. st7789_lcd.setSPISpeed(100*000*000);
  36. // 解像度240×240、SPIモード3
  37. st7789_lcd.init(240, 240, SPI_MODE3);
  38. }
  39. void loop() {
  40. st7789_lcd.fillScreen(ST77XX_BLACK);
  41. jpeg.openFLASH((uint8_t *)_sample_picture, (int)_picture_size, mcu_draw);
  42. jpeg.setPixelType(RGB565_BIG_ENDIAN);
  43. // 開始時間
  44. ulong start_time = micros();
  45. jpeg.decode(0,0,JPEG_USES_DMA);
  46. // 経過時間測定
  47. ulong elapsed = micros() - start_time;
  48. Serial1.printf("elapsed time %u usec.\n", elapsed);
  49. jpeg.close();
  50. sleep_ms(2000);
  51. }