返回列表 发新帖我要提问本帖赏金: 10.00元(功能说明)

[STM32F4] 【STM32F469I试用】标准外设库DSI刷屏

[复制链接]
6980|11
 楼主| 聿怀嘿嘿 发表于 2016-1-11 11:11 | 显示全部楼层 |阅读模式
本帖最后由 聿怀嘿嘿 于 2016-1-11 11:11 编辑

       虽然意法现在主推HAL库,低功耗L系列的单片机甚至已不再提供标准外设库,HAL的资料越来越丰富,是接下来设计产品的主流,但现在也还有很大一部分工程师继续使用着标准外设库,或是之前项目工程是基于标准库,移植起来也相对方便。STM32F469这块板子ST在HAL库以及提供了DSI LCD部分的相关例程,使用起来真是方便。不过为了适配接下来RTT的移植(RTT是基于标准外设库),只能把HAL库的这部分的程序移植到标准外设库上。       先上两张图看看效果:
IMG_20160110_210005.jpg
IMG_20160110_210443.jpg
      首先,是SDRAM的初始化,整体的程序参考标准外设库stm324x9i_eval_fmc_sdram.c文件里的初始化函数,不过由于我们采用RGB565的格式来储存像素点的数据,所以对初始化函数的内容也做相应的改动:SDRAM_MEMORY_WIDTH改为16b的宽度,以对应RGB565的两个字节数据。
  1. <span style="line-height: 1.5;">FMC_SDRAMInitStructure.FMC_SDMemoryDataWidth  =</span><font color="#ff0000" style="line-height: 1.5;"> SDRAM_MEMORY_WIDTH</font><span style="line-height: 1.5;">;</span>
  2.   FMC_SDRAMInitStructure.FMC_InternalBankNumber = FMC_InternalBank_Number_4;
      接下来是按照HAL库的初始化顺序,先后对DSI、LTDC初始化
  1. LCD_Reset();
  2.   DSI_Config();
  3.   LCD_Config();
  4.   DSI_Start(DSI);
  5.   OTM8009Setup(DSI, IMAGEFORMAT_RGB565);

        在LCD_Config中,值得注意的是LTDC_CFBStartAdress的设置,这个地址指向了LCD显存的地址,这里用SDRAM来作为显存,RGB565格式下,0xC0000000开始的连续两个地址代表一个像素点的颜色信息,所以打点函数也就是计算位置,往SDRAM中填入相应的颜色信息。
  1. LTDC_Layer_InitStruct.LTDC_CFBStartAdress = ((uint32_t)0xC0000000);
  2. /* the length of one line of pixels in bytes + 3 then :
  3. Line Length = Active high width x number of bytes per pixel + 3
  4. Active high width = 480
  5. number of bytes per pixel = 2 (pixel_format : RGB565) */
  6. LTDC_Layer_InitStruct.LTDC_CFBLineLength = ((480 * 2) + 3);
  7. /* the pitch is the increment from the start of one line of pixels to the
  8. start of the next line in bytes, then :
  9. Pitch = Active high width x number of bytes per pixel */
  10. LTDC_Layer_InitStruct.LTDC_CFBPitch = (480 * 2);
  11. /* Configure the number of lines */
  12. LTDC_Layer_InitStruct.LTDC_CFBLineNumber = 800;
  13. /* Initializes the Layer */
  14. LTDC_LayerInit(LTDC_Layer1, <DC_Layer_InitStruct);
  15. /* Enable Layer 1 */
  16. LTDC_LayerCmd(LTDC_Layer1, ENABLE);
  17. /* Reload configuration of Layer 1 */
  18. LTDC_ReloadConfig(LTDC_IMReload);
  19. /* Enable The LCD */
  20. LTDC_Cmd(ENABLE);

      SDRAM显存与LCD显示的关系如下图:画得不是很好、呵呵、不过应该能大致了解。
469SDRAM1.jpg
       整个屏幕实现横屏和竖屏的效果,由宏定义控制,其中0为横屏,1为竖屏。
  1. #define OTM_8009_sta  1   //横屏  0   竖屏  1
      横屏和竖屏的效果在最底层的打点函数上实现
  1. #if OTM_8009_sta==0  
  2. *(__IO uint16_t*) (LCD_FB_START_ADDRESS + (2*(Xpos*480 + 480-Ypos))) = RGB_Code;
  3. #else   
  4.   /* Write data value to all SDRAM memory */
  5.   *(__IO uint16_t*) (LCD_FB_START_ADDRESS + (2*(Ypos*480 + Xpos))) = RGB_Code;
  6. #endif
     其他的字符函数、画圆、画矩形函数都是基于上述打点函数,基本是从HAL库直接复制过来,基本不用修改。
  1. void BSP_LCD_DrawCircle(uint16_t Xpos, uint16_t Ypos, uint16_t Radius)
  2. {
  3.   int32_t   D;    /* Decision Variable */
  4.   uint32_t  CurX; /* Current X Value */
  5.   uint32_t  CurY; /* Current Y Value */
  6.   D = 3 - (Radius << 1);
  7.   CurX = 0;
  8.   CurY = Radius;
  9.   while (CurX <= CurY)
  10.   {
  11.     BSP_LCD_DrawPixel((Xpos + CurX), (Ypos - CurY), DrawProp[ActiveLayer].TextColor);
  12.     BSP_LCD_DrawPixel((Xpos - CurX), (Ypos - CurY), DrawProp[ActiveLayer].TextColor);
  13.     BSP_LCD_DrawPixel((Xpos + CurY), (Ypos - CurX), DrawProp[ActiveLayer].TextColor);
  14.     BSP_LCD_DrawPixel((Xpos - CurY), (Ypos - CurX), DrawProp[ActiveLayer].TextColor);
  15.     BSP_LCD_DrawPixel((Xpos + CurX), (Ypos + CurY), DrawProp[ActiveLayer].TextColor);
  16.     BSP_LCD_DrawPixel((Xpos - CurX), (Ypos + CurY), DrawProp[ActiveLayer].TextColor);
  17.     BSP_LCD_DrawPixel((Xpos + CurY), (Ypos + CurX), DrawProp[ActiveLayer].TextColor);
  18.     BSP_LCD_DrawPixel((Xpos - CurY), (Ypos + CurX), DrawProp[ActiveLayer].TextColor);
  19.     if (D < 0)
  20.     {
  21.       D += (CurX << 2) + 6;
  22.     }
  23.     else
  24.     {
  25.       D += ((CurX - CurY) << 2) + 10;
  26.       CurY--;
  27.     }
  28.     CurX++;
  29.   }
  30. }
  1. void BSP_LCD_DisplayStringAt(uint16_t Xpos, uint16_t Ypos, uint8_t *Text, Text_AlignModeTypdef Mode)
  2. {
  3.   uint16_t refcolumn = 1, i = 0;
  4.   uint32_t size = 0, xsize = 0;
  5.   uint8_t  *ptr = Text;
  6.   /* Get the text size */
  7.   while (*ptr++) size ++ ;
  8.   /* Characters number per line */
  9.   xsize = (OTM8009A_800X480_WIDTH/DrawProp[ActiveLayer].pFont->Width);
  10.   switch (Mode)
  11.   {
  12.   case CENTER_MODE:
  13.     {
  14.       refcolumn = Xpos + ((xsize - size)* DrawProp[ActiveLayer].pFont->Width) / 2;
  15.       break;
  16.     }
  17.   case LEFT_MODE:
  18.     {
  19.       refcolumn = Xpos;
  20.       break;
  21.     }
  22.   case RIGHT_MODE:
  23.     {
  24.       refcolumn = - Xpos + ((xsize - size)*DrawProp[ActiveLayer].pFont->Width);
  25.       break;
  26.     }
  27.   default:
  28.     {
  29.       refcolumn = Xpos;
  30.       break;
  31.     }
  32.   }
  33.   /* Check that the Start column is located in the screen */
  34.   if ((refcolumn < 1) || (refcolumn >= 480))//0x8000
  35.   {
  36.     refcolumn = 1;
  37.   }
  38.   /* Send the string character by character on LCD */
  39.   while ((*Text != 0) & (((OTM8009A_800X480_WIDTH - (i*DrawProp[ActiveLayer].pFont->Width)) & 0xFFFF) >= DrawProp[ActiveLayer].pFont->Width))
  40.   {
  41.     /* Display one character on LCD */
  42.     BSP_LCD_DisplayChar(refcolumn, Ypos, *Text);
  43.     /* Decrement the column position by 16 */
  44.     refcolumn += DrawProp[ActiveLayer].pFont->Width;
  45.     /* Point on the next character */
  46.     Text++;
  47.     i++;
  48.   }
  49. }
STM32F4xx_DSP_StdPeriph_Lib_V1.6.1.zip (1.32 MB, 下载次数: 142)




打赏榜单

21ic小管家 打赏了 10.00 元 2016-05-16
理由:【申请有奖】TI USBType-C来袭,测评达人是你吗?活动打赏。

yiyigirl2014 发表于 2016-1-11 11:19 | 显示全部楼层
楼主觉得是HAL库好学,还是标准库好学。
 楼主| 聿怀嘿嘿 发表于 2016-1-11 11:24 | 显示全部楼层
yiyigirl2014 发表于 2016-1-11 11:19
楼主觉得是HAL库好学,还是标准库好学。

两年前用hal库,感觉十分不方便,最近试用了hal,感觉变化也挺大的,起码比标准库用起来方便多了,
笑鸟007 发表于 2016-1-11 15:12 | 显示全部楼层
最近在研究用标准库显示图片,但是一直没有设置好,显示有问题!
 楼主| 聿怀嘿嘿 发表于 2016-1-11 15:24 | 显示全部楼层
笑鸟007 发表于 2016-1-11 15:12
最近在研究用标准库显示图片,但是一直没有设置好,显示有问题!

什么问题?
笑鸟007 发表于 2016-1-12 20:53 | 显示全部楼层

我对Layer不是特别理解。求解释!

774640568498034140.jpg
 楼主| 聿怀嘿嘿 发表于 2016-1-12 23:57 | 显示全部楼层
笑鸟007 发表于 2016-1-12 20:53
我对Layer不是特别理解。求解释!

我看了用户手册,Layer好像分成2层,加上背景全部按照这个图叠加就形成了最终的显示效果,Layer1和Layer2分别有自己的显存空间
QQ截图20160112235406.jpg
拉普拉斯妖 发表于 2016-2-15 11:14 | 显示全部楼层
学习下,最近打算驱动mipi接口的 高清屏,买到开发板再来请教
hpdell 发表于 2016-6-13 15:52 | 显示全部楼层
拉普拉斯妖 发表于 2016-2-15 11:14
学习下,最近打算驱动mipi接口的 高清屏,买到开发板再来请教

你好,请教下,mipi 的屏跟dsi的接口屏指的是不是同一个接口的,只是他们的说法不同 ??
hpdell 发表于 2016-6-13 15:55 | 显示全部楼层
你好,请教下,所以的显示都调用 这个

#if OTM_8009_sta==0  
*(__IO uint16_t*) (LCD_FB_START_ADDRESS + (2*(Xpos*480 + 480-Ypos))) = RGB_Code;
#else   
  /* Write data value to all SDRAM memory */
  *(__IO uint16_t*) (LCD_FB_START_ADDRESS + (2*(Ypos*480 + Xpos))) = RGB_Code;
#endif



,那么显示刷新的速度会不会比较慢啊 ???
digitalboy 发表于 2016-12-12 11:46 | 显示全部楼层
请教一下,STM32F469IIT。不外接SDRAM,只用内部的RAM是否可以驱动起来400x400的AUO 1.39“屏?显示的图像基本上是静止的菜单,没有什么动画效果。
是否可以逐个点从FLASH读取图像数据,然后传给DSI?或者只是使用一个小的缓存区,比如100kB左右的?
板子太小,已经放不下SDRAM了。
zyzoe2003 发表于 2019-11-13 17:00 来自手机 | 显示全部楼层
请问楼上问题解决了吗?我也想知道能不能不接外部SDRAM。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

451

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部