测试设备:SWM32SRET6-50 官方开发板(官方淘宝店购买) 板载SPIFLASH一枚、SD卡接口一个、标准40pin RGB显示接口一个,支持电容及电阻触摸,电阻触摸芯片未焊,电容触摸为I2C接口。如下图(图中为5寸触摸屏,实测7寸屏加转接板也可以驱动)。
5寸触摸屏一个、7寸屏(at070tn92)加转接板一套、jlink一个。
该开发板使用的SWM32SRET6-50 MCU内置8MSDRAM,对于驱动800*480的屏已经足够了。显存占用800*480*2 = 750KByte,加一个缓冲去共1500KByte。缓冲区不是必须的,有缓冲区通过切换现存地址可以避免刷屏的效果。
测试例程使用官方例程目录为\SWM320_Lib-200727\SWM320_Lib\LCD\SimplLCD_SDRAM
1、用keil4 打开例程后,修改man.c 中的分辨率设置
#define LCD_HDOT 800 //480 //水平点数
#define LCD_VDOT 480 //272 //垂直点数
2、根据屏的参数修改RGBLCDInit 函数中的
LCD_initStruct.Hfp = 15;
LCD_initStruct.Hbp = 40;
LCD_initStruct.Vfp = 8;
LCD_initStruct.Vbp = 8;
void RGBLCDInit(void)
{
LCD_InitStructure LCD_initStruct;
GPIO_Init(GPIOB, PIN12, 1, 0, 0);//±³¹â¿ØÖÆ
GPIO_SetBit(GPIOB, PIN12); //µãÁÁ±³¹â
PORT->PORTN_SEL0 = 0xAAAAAAAA; //
PORT->PORTN_SEL1 = 0xAA;
LCD_initStruct.Interface = LCD_INTERFACE_RGB;
LCD_initStruct.HnPixel = LCD_HDOT;
LCD_initStruct.VnPixel = LCD_VDOT;
LCD_initStruct.Hfp = 15;
LCD_initStruct.Hbp = 40;
LCD_initStruct.Vfp = 8;
LCD_initStruct.Vbp = 8;
LCD_initStruct.ClkDiv = LCD_CLKDIV_2; //
LCD_initStruct.ClkAlways = 1;
LCD_initStruct.SamplEdge = LCD_SAMPLEDGE_FALL;
LCD_initStruct.HsyncWidth = LCD_HSYNC_2DOTCLK;
LCD_initStruct.IntEOTEn = 1;
LCD_Init(LCD, &LCD_initStruct);
}
3、根据使用的内置SDRAM 大小为8MByte,修改void MemoryInit(void) 函数中的,内存大小设置
SDRAM_InitStruct.CellSize = SDRAM_CELLSIZE_64Mb;
4、如果需要串口输出可以修改串口端口配置
PORT_Init(PORTC, PIN2, FUNMUX0_UART0_RXD, 1);
PORT_Init(PORTC, PIN3, FUNMUX1_UART0_TXD, 0);
5、还要根据开发板背光控制端口修改背光端口设置
GPIO_Init(GPIOB, PIN12, 1, 0, 0);//
GPIO_SetBit(GPIOB, PIN12); //
6、SDRAM虽然是内置的,但是配置方法和外置是一样的,相关的端口除了M6、M18和M20外都不能用于其它功能。
7、DMA可以用于刷新显存,但是实测会导致闪屏,估计是对当前显存操作会导致显示短暂的中断。另外需要注意的是,调试的过程中对程序暂停,屏幕也会不正常,必须在几种颜色之间循环刷屏。应该是由于CPU停止刷屏导致的。NXP的MCU没有这个问题。这个问题会导致无法暂停查看当前运行处屏幕的状态。
8、通过修改LCD->SRCADDR = (uint32_t)LCD_Buffer;此处显存的起始地址可以实现屏幕瞬间刷新,避免从上往下刷屏的效果,这样就需要额外的SDRAM区域作为缓冲区。但是用DMA或者手动复制当前显存区域内容到缓冲区会导致黑屏,因此需要避免操作当前显存区域,只能分别刷写缓冲区和显存区的内容。