STM32CubeMx使用FSMC操作LCD
简介
本例程主要讲解如何使用FSMC操作LCDSTM32CubeMx基本配置
基础配置过程请参考STM32CubeMx(Keil5)开发之路配置第一个项目CubeMX配置调试打印配置
FSMC配置根据原理图可知需要的配置的管脚SPI是与触摸芯片相关的,先不用管A10是用来作为片选的,记住,配置的时候需要用到
设置FSMC选择专门的LCD接口选择上面原理图的A10设置下面的参数,如果嫌太慢就把NORPSRAMtiming设置小一点
对应管脚和原理图一致,原理图部分就不展示出来了
代码修改添加代码(讲解写在代码里面)USERCODEBEGIN0使用printf功能intfputc(intch,FILEf){HALUARTTransmit(huart1,(uint8t)ch,1,0xFFFF);returnch;}defineTFTXMAX319设置TFT屏的xdefineTFTYMAX479设置TFT屏的ydefineWHITE0xFFFFdefineBLACK0x0000defineBLUE0x001FdefineRED0xF800defineMAGENTA0xF81FdefineGREEN0x07E0defineCYAN0x7FFFdefineYELLOW0xFFE0定义颜色的宏不同的LCD的资料文件里面都有各自初始化的命令和参数,请根据各自的参数进行初始化,我这边使用的是TFTHX8357,初始化是这样的。你们的可能会不同详细的资料我就不仔细说明了,有兴趣可以私聊写命令一些人可能在这儿会懵,这里主要是使用指针对地址进行操作,这里是C语言的知识FSMC对把显示屏当做SRAM在操作,所以采用的是对地址的操作,下面读命令也是一样voidTFTWriteCmd(uint16tcmd){(IOuint16t)(0x6C0007FE)cmd;}写数据voidTFTWriteData(uint16tdat){(IOuint16t)(0x6C000800)dat;}初始化TFTvoidTFTInit(void){uint16ti;TFTWriteCmd(0xE9);TFTWriteData(0x20);TFTWriteCmd(0x11);ExitSleepfor(i500;i0;i);TFTWriteCmd(0x3A);TFTWriteData(0x55);16BitcolorsTFTWriteCmd(0xD1);TFTWriteData(0x00);TFTWriteData(0x65);调试此值改善水纹TFTWriteData(0x1F);TFTWriteCmd(0xD0);TFTWriteData(0x07);TFTWriteData(0x07);TFTWriteData(0x80);TFTWriteCmd(0x36);SetaddressmodeTFTWriteData(0x48);48TFTWriteCmd(0xC1);TFTWriteData(0x10);TFTWriteData(0x10);TFTWriteData(0x02);TFTWriteData(0x02);TFTWriteCmd(0xC0);SetDefaultGammaTFTWriteData(0x00);TFTWriteData(0x35);TFTWriteData(0x00);TFTWriteData(0x00);TFTWriteData(0x01);TFTWriteData(0x02);TFTWriteCmd(0xC4);TFTWriteData(0x03);TFTWriteCmd(0xC5);SetframerateTFTWriteData(0x01);TFTWriteCmd(0xD2);powersettingTFTWriteData(0x01);TFTWriteData(0x22);TFTWriteCmd(0xE7);TFTWriteData(0x38);TFTWriteCmd(0xF3);TFTWriteData(0x08);TFTWriteData(0x12);TFTWriteData(0x12);TFTWriteData(0x08);TFTWriteCmd(0xC8);SetGammaTFTWriteData(0x01);TFTWriteData(0x52);TFTWriteData(0x37);TFTWriteData(0x10);TFTWriteData(0x0d);TFTWriteData(0x01);TFTWriteData(0x04);TFTWriteData(0x51);TFTWriteData(0x77);TFTWriteData(0x01);TFTWriteData(0x01);TFTWriteData(0x0d);TFTWriteData(0x08);TFTWriteData(0x80);TFTWriteData(0x00);TFTWriteCmd(0x29);displayon}设置读写的范围voidTFTSetWindow(uint16txStart,uint16tyStart,uint16txEnd,uint16tyEnd){TFTWriteCmd(0x2A);TFTWriteData(xStart8);TFTWriteData(xStart0XFF);TFTWriteData(xEnd8);TFTWriteData(xEnd0XFF);TFTWriteCmd(0x2b);TFTWriteData(yStart8);TFTWriteData(yStart0XFF);TFTWriteData(yEnd8);TFTWriteData(yEnd0XFF);TFTWriteCmd(0x2c);}清屏函数voidTFTClearScreen(uint16tcolor){uint16ti,j;TFTSetWindow(0,0,TFTXMAX,TFTYMAX);作用区域for(i0;iTFTXMAX1;i){for(j0;jTFTYMAX1;j){TFTWriteData(color);}}}USERCODEEND0main函数intmain(void){USERCODEBEGIN1USERCODEEND1MCUConfigurationResetofallperipherals,InitializestheFlashinterfaceandtheSystick。HALInit();USERCODEBEGINInitUSERCODEENDInitConfigurethesystemclockSystemClockConfig();USERCODEBEGINSysInitUSERCODEENDSysInitInitializeallconfiguredperipheralsMXGPIOInit();MXFSMCInit();MXUSART1UARTInit();USERCODEBEGIN2TFTInit();TFTClearScreen(RED);TFTClearScreen(WHITE);画一个点:坐标(100,100),颜色:黑色TFTSetWindow(100,100,100,100);设置操作的区域TFTWriteData(BLACK);画一个正方形:坐标(110,110,129,129),颜色:红色TFTSetWindow(110,110,129,129);for(inti110;i130;i){for(intj110;j130;j){TFTWriteData(RED);}}USERCODEEND2InfiniteloopUSERCODEBEGINWHILEwhile(1){USERCODEENDWHILEUSERCODEBEGIN3}USERCODEEND3}运行结果烧录进去,复位之后,查看显示屏如果输出我的类似,说明测试成功
小结
如果使用GUI库,就会用到,画点,划线等函数接口,如果使用触摸屏还会用到读点的函数,结合GUI使用屏幕才是最终的选择。