Главная › Форумы › Программирование микроконтроллеров › Программирование МК STM32 › Ответ в теме: Программирование МК STM32
Добрый день! Нужна помощь. Уже недели 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 мусора нет но картинка смещена.