wenyangzeng 发表于 2016-12-2 16:38:40

【F769IDISCOVERY评测】评测三 硬件JPEG解码

         STM32F769I(STM32官网)内置了硬件JPEG解码,使得处理JPEG图像的速度大大提高。在STM32Cube_FW_F7_V1.5.0\Projects\STM32F769I-Discovery\Examples\JPEGi里的演示代码让我们能够体验一下这个新功能。
    首先我们要先在CN5插入uCD卡,卡中存入1个名为image.jpg的JPG图片文件,图像的分辨率为800×480。
编译下载后运行,可以感受到图像显示速度非常的快。      未插卡
   显示的JPEG图像

xiaoye82 发表于 2016-12-2 17:03:07

:lol:lol:lol

peter001 发表于 2016-12-2 18:45:59

支持一下:lol

liuxy236@tom.co 发表于 2016-12-2 22:21:17

:):):):):):):):)

leo121_3006061 发表于 2016-12-3 01:32:27

这什么图片,看着:funk:

wenyangzeng 发表于 2016-12-3 07:27:03

leo121_3006061 发表于 2016-12-3 01:32
这什么图片,看着

显微镜下的某细菌

leo121_3006061 发表于 2016-12-3 14:32:43

wenyangzeng 发表于 2016-12-3 07:27
显微镜下的某细菌

难怪啊,恐惧症

五哥1 发表于 2016-12-5 18:26:18

好可怕的图片

xiaoye82 发表于 2016-12-7 12:20:00

:lol:lol:lol:lol

hpdell 发表于 2017-5-23 09:31:05

你好,硬件解码 jpg ,可否实现横竖屏显示功能啊 ??

wenyangzeng 发表于 2017-5-23 09:59:49

本帖最后由 wenyangzeng 于 2017-5-23 19:12 编辑

hpdell 发表于 2017-5-23 09:31
你好,硬件解码 jpg ,可否实现横竖屏显示功能啊 ??
这个一定可以的,关键在TFT初始化参数中关于横屏或竖屏的寄存器配置参数,比如SD1289的寄存器配置:


F769IDISCOVERY使用的是otm8009a。那就要去参考它的手册了。

在otm8009a.h里有参数说明

hpdell 发表于 2017-5-23 19:28:31

本帖最后由 hpdell 于 2017-5-23 19:33 编辑

wenyangzeng 发表于 2017-5-23 09:59
这个一定可以的,关键在TFT初始化参数中关于横屏或竖屏的寄存器配置参数,比如SD1289的寄存器配置:



我现在使用的是rgb转 lvds的,没有寄存器可以设置,只有外部的 U/D, L/R 控制方向,但是这个控制方向是固定的,

那么使用硬件 解码 jpg 的话,实现四个方向的显示,该如何修改 硬件解码的显示函数啊 ??
另外我使用st官网提供的历程,使用 硬件 的dma功能解码 jpg 图片时,显示错位了,使用中断模式时,显示正常,

使用dma或者中断都是从sd卡读取相同的图片,那么这个dma模式解码出现图片错位的情况,是哪里没有对齐还是 ??????

wenyangzeng 发表于 2017-5-23 21:40:25

本帖最后由 wenyangzeng 于 2017-5-23 22:10 编辑

hpdell 发表于 2017-5-23 19:28
我现在使用的是rgb转 lvds的,没有寄存器可以设置,只有外部的 U/D, L/R 控制方向,但是这个控制方向是固 ...
OTM8009A寄存器的操作是在对OTM8009初始化函数里的:
uint8_t OTM8009A_Init(uint32_t ColorCoding, uint32_t orientation)
{
/* Enable CMD2 to access vendor specific commands                               */
/* Enter in command 2 mode and set EXTC to enable address shift function (0x00) */
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData1);
DSI_IO_WriteCmd( 3, (uint8_t *)lcdRegData1);

/* Enter ORISE Command 2 */
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData2); /* Shift address to 0x80 */
DSI_IO_WriteCmd( 2, (uint8_t *)lcdRegData2);

/////////////////////////////////////////////////////////////////////
/* SD_PCH_CTRL - 0xC480h - 129th parameter - Default 0x00          */
/* Set SD_PT                                                       */
/* -> Source output level during porch and non-display area to GND */
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData2);
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData3);
OTM8009A_IO_Delay(10);
/* Not documented */
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData4);
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData5);
OTM8009A_IO_Delay(10);
/////////////////////////////////////////////////////////////////////

/* PWR_CTRL4 - 0xC4B0h - 178th parameter - Default 0xA8 */
/* Set gvdd_en_test                                     */
/* -> enable GVDD test mode !!!                         */
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData6);
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData7);

/* PWR_CTRL2 - 0xC590h - 146th parameter - Default 0x79      */
/* Set pump 4 vgh voltage                                    */
/* -> from 15.0v down to 13.0v                               */
/* Set pump 5 vgh voltage                                    */
/* -> from -12.0v downto -9.0v                               */
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData8);
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData9);

/* P_DRV_M - 0xC0B4h - 181th parameter - Default 0x00 */
/* -> Column inversion                              */
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData10);
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData11);

/* VCOMDC - 0xD900h - 1st parameter - Default 0x39h */
/* VCOM Voltage settings                            */
/* -> from -1.0000v downto -1.2625v               */
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData1);
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData12);

/* Oscillator adjustment for Idle/Normal mode (LPDT only) set to 65Hz (default is 60Hz) */
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData13);
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData14);

/* Video mode internal */
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData15);
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData16);

/* PWR_CTRL2 - 0xC590h - 147h parameter - Default 0x00 */
/* Set pump 4&5 x6                                     */
/* -> ONLY VALID when PUMP4_EN_ASDM_HV = "0"         */
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData17);
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData18);

/* PWR_CTRL2 - 0xC590h - 150th parameter - Default 0x33h */
/* Change pump4 clock ratio                              */
/* -> from 1 line to 1/2 line                            */
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData19);
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData9);

/* GVDD/NGVDD settings */
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData1);
DSI_IO_WriteCmd( 2, (uint8_t *)lcdRegData5);

/* PWR_CTRL2 - 0xC590h - 149th parameter - Default 0x33h */
/* Rewrite the default value !                           */
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData20);
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData21);

/* Panel display timing Setting 3 */
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData22);
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData23);

/* Power control 1 */
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData24);
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData25);

/* Source driver precharge */
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData13);
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData26);

DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData15);
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData27);

DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData28);
DSI_IO_WriteCmd( 2, (uint8_t *)lcdRegData6);

/* GOAVST */
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData2);
DSI_IO_WriteCmd( 6, (uint8_t *)lcdRegData7);

DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData29);
DSI_IO_WriteCmd( 14, (uint8_t *)lcdRegData8);

DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData30);
DSI_IO_WriteCmd( 14, (uint8_t *)lcdRegData9);

DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData31);
DSI_IO_WriteCmd( 10, (uint8_t *)lcdRegData10);

DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData32);
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData46);

DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData2);
DSI_IO_WriteCmd( 10, (uint8_t *)lcdRegData11);

DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData33);
DSI_IO_WriteCmd( 15, (uint8_t *)lcdRegData12);

DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData29);
DSI_IO_WriteCmd( 15, (uint8_t *)lcdRegData13);

DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData30);
DSI_IO_WriteCmd( 10, (uint8_t *)lcdRegData14);

DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData31);
DSI_IO_WriteCmd( 15, (uint8_t *)lcdRegData15);

DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData32);
DSI_IO_WriteCmd( 15, (uint8_t *)lcdRegData16);

DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData34);
DSI_IO_WriteCmd( 10, (uint8_t *)lcdRegData17);

DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData35);
DSI_IO_WriteCmd( 10, (uint8_t *)lcdRegData18);

DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData2);
DSI_IO_WriteCmd( 10, (uint8_t *)lcdRegData19);

DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData33);
DSI_IO_WriteCmd( 15, (uint8_t *)lcdRegData20);

DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData29);
DSI_IO_WriteCmd( 15, (uint8_t *)lcdRegData21);

DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData30);
DSI_IO_WriteCmd( 10, (uint8_t *)lcdRegData22);

DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData31);
DSI_IO_WriteCmd( 15, (uint8_t *)lcdRegData23);

DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData32);
DSI_IO_WriteCmd( 15, (uint8_t *)lcdRegData24);

/////////////////////////////////////////////////////////////////////////////
/* PWR_CTRL1 - 0xc580h - 130th parameter - default 0x00 */
/* Pump 1 min and max DM                              */
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData13);
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData47);
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData48);
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData49);
/////////////////////////////////////////////////////////////////////////////

/* Exit CMD2 mode */
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData1);
DSI_IO_WriteCmd( 3, (uint8_t *)lcdRegData25);

/*************************************************************************** */
/* Standard DCS Initialization TO KEEP CAN BE DONE IN HSDT                   */
/*************************************************************************** */

/* NOP - goes back to DCS std command ? */
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData1);
         
/* Gamma correction 2.2+ table (HSDT possible) */
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData1);
DSI_IO_WriteCmd( 16, (uint8_t *)lcdRegData3);

/* Gamma correction 2.2- table (HSDT possible) */
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData1);
DSI_IO_WriteCmd( 16, (uint8_t *)lcdRegData4);
         
/* Send Sleep Out command to display : no parameter */
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData36);

/* Wait for sleep out exit */
OTM8009A_IO_Delay(120);

switch(ColorCoding)
{
case OTM8009A_FORMAT_RBG565 :
    /* Set Pixel color format to RGB565 */
    DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData37);
    break;
case OTM8009A_FORMAT_RGB888 :
    /* Set Pixel color format to RGB888 */
    DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData38);
    break;
default :
    break;
}

/* Send command to configure display in landscape orientation mode. By default
      the orientation mode is portrait*/
if(orientation == OTM8009A_ORIENTATION_LANDSCAPE)
{
    DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData39);
    DSI_IO_WriteCmd( 4, (uint8_t *)lcdRegData27);
    DSI_IO_WriteCmd( 4, (uint8_t *)lcdRegData28);
}

/** CABC : Content Adaptive Backlight Control section start >> */
/* Note : defaut is 0 (lowest Brightness), 0xFF is highest Brightness, try 0x7F : intermediate value */
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData40);

/* defaut is 0, try 0x2C - Brightness Control Block, Display Dimming & BackLight on */
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData41);

/* defaut is 0, try 0x02 - image Content based Adaptive Brightness */
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData42);

/* defaut is 0 (lowest Brightness), 0xFF is highest Brightness */
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData43);

/** CABC : Content Adaptive Backlight Control section end << */

/* Send Command Display On */
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData44);

/* NOP command */
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData1);

/* Send Command GRAM memory write (no parameters) : this initiates frame write via other DSI commands sent by */
/* DSI host from LTDC incoming pixels in video mode */
DSI_IO_WriteCmd(0, (uint8_t *)ShortRegData45);

return 0;
}对其他型号TFT的初始化都类似,横屏或竖屏的参数就在初始化中设定。
再举一例RA8875横、竖屏:
void RA8875_InitHard(void)
{                        
      RA8875_WriteCmd(0x88);// 初始化PLL.晶振频率为25M
      RA8875_Delaly1us();                // 延迟1us */
      RA8875_WriteData(9);      // PLLDIVM = 0 ;PLLDIVN = 10 */
      RA8875_Delaly1ms();
      RA8875_WriteCmd(0x89);
      RA8875_Delaly1us();               
      RA8875_WriteData(2);      //PLLDIVK = 2, 除以4
      /* REG或REG被设定后,为保证PLL 输出稳定,须等待一段「锁频时间」(< 100us)。*/
      RA8875_Delaly1ms();
      RA8875_WriteReg(0x10, (1 <<3 ) | (1 << 1));      /* 配置16位MCU并口,65K色 */
RA8875_WriteReg(0x04, 0x81);
      RA8875_Delaly1ms();
      /* OTD9960 & OTA7001 设置 */
      RA8875_WriteReg(0x14, 0x63);
      RA8875_WriteReg(0x15, 0x00);
      RA8875_WriteReg(0x16, 0x03);
      RA8875_WriteReg(0x17, 0x03);
      RA8875_WriteReg(0x18, 0x0B);
      RA8875_WriteReg(0x19, 0xDF);
      RA8875_WriteReg(0x1A, 0x01);
      RA8875_WriteReg(0x1B, 0x1F);
      RA8875_WriteReg(0x1C, 0x00);
      RA8875_WriteReg(0x1D, 0x16);
      RA8875_WriteReg(0x1E, 0x00);
      RA8875_WriteReg(0x1F, 0x01);
      RA8875_WriteReg(0xC7, 0x01);      
      RA8875_WriteReg(0x01, 0x80);
      RA8875_WriteReg(0x40, 0x01);      // 选择绘图模式
      RA8875_WriteReg(0x41, 0x00);      //选择绘图模式, 目的为CGRAM
       RA8875_SetDispWin(0, 0, LCD_HEIGHT, LCD_WIDTH);
      RA8875_WriteReg(0x20, (1 << 3));            // 水平扫描方向设定
// RA8875_WriteReg(0x20, (1 << 2));            // 垂直扫描方向设定
   RA8875_SetBackLight(150);

}



feixiang20 发表于 2017-5-29 23:25:50

wenyangzeng 发表于 2017-5-23 09:59
这个一定可以的,关键在TFT初始化参数中关于横屏或竖屏的寄存器配置参数,比如SD1289的寄存器配置:





happyavr128 发表于 2020-2-5 17:48:49

这什么图片,看着
页: [1] 2
查看完整版本: 【F769IDISCOVERY评测】评测三 硬件JPEG解码