ko062vvs



Ответы в темах

Просмотр 1 сообщения - с 1 по 1 (всего 1)
  • Автор
    Сообщения
  • в ответ на: Программирование МК STM32 #22403
    ko062vvs
    Участник

    Добрый день! Нужна помощь. Уже недели 3 мучаюсь.
    Задача: Читать JPG из SD и выводить на ILI9341 с помощью DMA Circular.
    Проблемы в основном с картинками 320*240. Где используется в передаче 3 пакета. с 1 или 2 все норм.
    Моя функция такая:

    void ILI9341_Draw_SDImageJPG(uint16_t x,uint16_t y, const char * fileName)
    {

    if((x >=ILI9341_SCREEN_WIDTH) || (y >=ILI9341_SCREEN_HEIGHT)) return;
    FIL Myfile;
    retSD = f_mount(&SDFatFS, «», 1);
    retSD = f_open(&Myfile,fileName,FA_READ);
    struct jpeg_decompress_struct cinfo;
    struct jpeg_error_mgr jerr;
    cinfo.err = jpeg_std_error(&jerr);
    jpeg_create_decompress(&cinfo);
    jpeg_stdio_src(&cinfo,&Myfile);
    (void) jpeg_read_header(&cinfo, TRUE);
    (void) jpeg_start_decompress(&cinfo);
    JSAMPARRAY buffer;
    uint16_t row_stride = cinfo.output_width * cinfo.output_components;
    buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1);
    uint32_t buf_size, count = 0;
    uint32_t n=cinfo.output_width*cinfo.output_height*2;

    if(n<=65536)
    {
    buf_size = n;
    }
    else
    {
    buf_size = 2;
    for(uint8_t j = 3; j < n/3; j++)
    {
    if(n%j == 0)
    {
    buf_size = n/j;
    break;
    }
    }
    }

    ILI9341_SetAddress(x, y, x+cinfo.output_width-1, y+cinfo.output_height-1);
    while(cinfo.output_scanline < cinfo.output_height)
    {
    (void) jpeg_read_scanlines(&cinfo, buffer, 1);

    for(uint16_t i=0;i<cinfo.output_width;i++)
    {

    frm_buf[count++]= RGB(buffer[0][i*3],buffer[0][i*3+1],buffer[0][i*3+2]) >> 8;
    frm_buf[count++]= RGB(buffer[0][i*3],buffer[0][i*3+1],buffer[0][i*3+2]) & 0xFF;

    if (count >= buf_size)

    {

    HAL_GPIO_WritePin(LCD_CS_PORT, LCD_CS_PIN, GPIO_PIN_RESET);//select
    HAL_GPIO_WritePin(LCD_DC_PORT, LCD_DC_PIN, GPIO_PIN_SET); //data
    dma_spi_cnt = 1;
    HAL_SPI_Transmit_DMA(HSPI_INSTANCE, frm_buf, buf_size-1);
    while(!dma_spi_fl) {}
    dma_spi_fl=0;
    count=0;

    }
    }
    }

    (void) jpeg_finish_decompress(&cinfo);
    jpeg_destroy_decompress(&cinfo);
    retSD = f_close(&Myfile);

    }

    //HAL_SPI_Transmit_DMA(HSPI_INSTANCE, frm_buf, buf_size-1);
    почему я сделал -1 потому что во втором пакете данных идет мусор. С -1 мусора нет но картинка смещена.
    null

  • Автор
    Сообщения
  • в ответ на: Программирование МК STM32 #22403

    ko062vvs
    Участник
    • Оффлайн

    Добрый день! Нужна помощь. Уже недели 3 мучаюсь.
    Задача: Читать JPG из SD и выводить на ILI9341 с помощью DMA Circular.
    Проблемы в основном с картинками 320*240. Где используется в передаче 3 пакета. с 1 или 2 все норм.
    Моя функция такая:

    void ILI9341_Draw_SDImageJPG(uint16_t x,uint16_t y, const char * fileName)
    {

    if((x >=ILI9341_SCREEN_WIDTH) || (y >=ILI9341_SCREEN_HEIGHT)) return;
    FIL Myfile;
    retSD = f_mount(&SDFatFS, «», 1);
    retSD = f_open(&Myfile,fileName,FA_READ);
    struct jpeg_decompress_struct cinfo;
    struct jpeg_error_mgr jerr;
    cinfo.err = jpeg_std_error(&jerr);
    jpeg_create_decompress(&cinfo);
    jpeg_stdio_src(&cinfo,&Myfile);
    (void) jpeg_read_header(&cinfo, TRUE);
    (void) jpeg_start_decompress(&cinfo);
    JSAMPARRAY buffer;
    uint16_t row_stride = cinfo.output_width * cinfo.output_components;
    buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1);
    uint32_t buf_size, count = 0;
    uint32_t n=cinfo.output_width*cinfo.output_height*2;

    if(n<=65536)
    {
    buf_size = n;
    }
    else
    {
    buf_size = 2;
    for(uint8_t j = 3; j < n/3; j++)
    {
    if(n%j == 0)
    {
    buf_size = n/j;
    break;
    }
    }
    }

    ILI9341_SetAddress(x, y, x+cinfo.output_width-1, y+cinfo.output_height-1);
    while(cinfo.output_scanline < cinfo.output_height)
    {
    (void) jpeg_read_scanlines(&cinfo, buffer, 1);

    for(uint16_t i=0;i<cinfo.output_width;i++)
    {

    frm_buf[count++]= RGB(buffer[0][i*3],buffer[0][i*3+1],buffer[0][i*3+2]) >> 8;
    frm_buf[count++]= RGB(buffer[0][i*3],buffer[0][i*3+1],buffer[0][i*3+2]) & 0xFF;

    if (count >= buf_size)

    {

    HAL_GPIO_WritePin(LCD_CS_PORT, LCD_CS_PIN, GPIO_PIN_RESET);//select
    HAL_GPIO_WritePin(LCD_DC_PORT, LCD_DC_PIN, GPIO_PIN_SET); //data
    dma_spi_cnt = 1;
    HAL_SPI_Transmit_DMA(HSPI_INSTANCE, frm_buf, buf_size-1);
    while(!dma_spi_fl) {}
    dma_spi_fl=0;
    count=0;

    }
    }
    }

    (void) jpeg_finish_decompress(&cinfo);
    jpeg_destroy_decompress(&cinfo);
    retSD = f_close(&Myfile);

    }

    //HAL_SPI_Transmit_DMA(HSPI_INSTANCE, frm_buf, buf_size-1);
    почему я сделал -1 потому что во втором пакете данных идет мусор. С -1 мусора нет но картинка смещена.
    null

Просмотр 1 сообщения - с 1 по 1 (всего 1)