版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
STM32学习笔记(6):LCD的显示2011年4月14HLCD显示.LCD/LCM的基本概念液晶显示器(LiquidCrystalDisplay:LCD)的构造是在两片平行的玻璃当中放置液态的晶体,两片玻璃中间有许多垂直和水平的细小电线,透过通电与否来控制杆状水晶分子改变方向,将光线折射出来产生画面。LCM(LCDModule)即LCD显示模组、液晶模块,是指将液晶显示器件,连接件,控制与驱动等外围电路,PCB电路板,背光源,结构件等装配在一起的组件。在平时的学习开发中,我们一般使用的是LCM,带有驱动IC和LCD屏幕等多个模块。.FSMC的基本概念在STM32上开发LCD显示,可以有两种方式来对LCD进行操作,一种是通过普通的10口,连接LCM的相应引脚来进行操作,第2种是通过FSMC来进行操作。可变静态存储控制器(FlexibleStaticMemoryController:FSMC)是STM32系列中内部集成256KB以上FlaSh,后缀为xC、xD和xE的高存储密度微控制器特有的存储控制机制。之所以称为“可变”,是由于通过对特殊功能寄存器的设置,FSMC能够根据不同的外部存储器类型,发出相应的数据/地址/控制信号类型以匹配信号的速度,从而使得STM32系列微控制器不仅能够应用各种不同类型、不同速度的外部静态存储器,而且能够在不增加外部器件的情况下同时扩展多种不同类型的静态存储器,满足系统设计对存储容量、产品体积以及本钱的综合要求。FSMC有很多优点:.支持多种静态存储器类型。STM32通过FSMC可以与SRAM、ROM、PSRAM、NORFlash和NANDFlash存储器的引脚直接相连。.支持丰富的存储操作方法。FSMC不仅支持多种数据宽度的异步读/写操作,而且支持对NOR、PSRAM、NAND存储器的同步突发访问方式。FSMC_ExtendedMode=FSMC_ExtendedMode_Disable;〃设置是否使用异步等待信号(No)FSMC_AsyncWait=FSMC_AsyncWait_Disable;〃设置是否使用迸发写模式(No)FSMC_WriteBurst=FSMC_WriteBurst_Disable;〃设定读写时序FSMC_ReadWriteTimingStruct=&p;〃设定写时序FSMC_WriteTimingStruct=&p;FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);〃使能Bankl中的blocklFSMC_NORSRAMCmd(FSMC_Bankl_NORSRAMl,ENABLE);)//GPIO配置voidGPIO_cfg()(GPIOJnitTypeDefGPIO_lnitStructure;〃背光控制GPIOPin=GPIOPin13;GPIO_Mode=GPIO_Mode_Out_PP;GPIO_Speed=GPIO_Speed_50MHz;GPIOJnit(GPIOD,&GPIO_lnitStructure);//LCD复位GPIO_Pin=GPIO_Pin_l;GPIOJnit(GPIOE,&GPIO_lnitStructure);〃翻开FSMC的数据端口D[15:0]GPIOPin=GPIOPin0IGPIOPin1IGOOPin8IGPIOPin9|GPIO_Pin_10|GPIO_Pin_14|GPIO_Pin_15;GPIO_Speed=GPIO_Speed_50MHz;GPIO_Mode=GPIO_Mode_AF_PP;GPIO_lnit(GPIOD,&GPIO_lnitStructure);GPIOPin=GPIOPin7IGPIOPin8IGPIOPin9IGPIOPin10|GPIOPin11IGPIOPin12IGPIOPin13IGPIOPin14|GPIO_Pin_15;GPIO_lnit(GPIOE,&GPIO_lnitStructure);〃翻开FSMC功能端口,PD.4=RD(nOE);PD.5=WR(nWE)GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5;GPIO_lnit(GPIOD,&GPIO_lnitStructure);〃翻开NE1设置GPIO_Pin=GPIO_Pin_7;GRIOJnit(GPIOD,&GPIO_lnitStructure);〃翻开RS设置GPIOPin=GPIOPin11;GPIO_lnit(GPIOD,&GPIO_lnitStructure);//NE1=1GPIO_SetBits(GPIOD,GPIO_Pin_7);〃LCD_RESET=0GPIO_ResetBits(GPIOE,GPIO_Pin_l);//LCD_RD=l(nOE)GPIO_SetBits(GPIOD,GPIO_Pin_4);//LCD_WR=l(nWE)GPIO_SetBits(GPIOD,GPIO_Pin_5);〃背光LIGHT=1GPIO_SetBits(GPIOD,GPIO_Pin_13);)//LCD初始化voidLCD_cfg()(〃复位LCDLCD_rst();//LCD初始化LCD_lnit();)//LCD显不图片〃根据LCD_lnit里面的配置,LCD的原点在左下角,终点在右上角;先纵向增长,再横向增长voidLCD_Show(unsignedchar*LCDJmage)(u32n=0;ul6temp=0;〃设置进入模式〃AM=1:地址在水平写入方向上更新//l/D[l:0]=01:水平方向递增,垂直方向递减//BGR=1:RGB数据转换为BGR数据//TRI=0;DFM=0;〃详细信息参考ILI93258.2.5EntryModeLCD_WR_CMD(0x0003,0x1018);//GRAM的水平地址//8.2.18GRAMHorizontal/VerticalAddressSetLCD_WR_CMD(OxOO2O,0x0000);//GRAM的垂直地址LCD_WR_CMD(0x0021,OxO13F);〃水平方向开始地址LCD_WR_CMD(0x0050,0x0000);〃水平方向结束地址(0-239)LCD_WR_CMD(0x0051,OxOOEF);〃垂直方向开始地址LCD_WR_CMD(0x0052,0x0000);〃垂直方向结束地址(0・319)LCD_WR_CMD(0x0053,0x013F);〃写数据地址〃因为是16bits一起写入,而图像数据数组中是每个数据8bits,〃所以是2个8bits的数据合并成一个16bits的数据,再写入GRAMLCD_WR_ADD(0x0022);while(n<153600)(temp=(ul6)(LCD_lmage[n]«8)+LCD_lmage[n+l];LCD_WR_DATA(temp);n+=2;))stm32fl0x_lcd.c中的代码#include"stm32flOx_lcd.h"〃数据区地址#defineBankl_LCD_Data((u32)0x)〃寄存器区地址#defineBankl_LCD_Reg((u32)0x)u32colorl=0;〃延时函数voidDelay(u32nCount)(for(;nCount!=0;nCount-);)//LCD复位voidLCD_rst()(〃PE.1连接LCD的reset引脚GPIO_ResetBits(GPIOE,GPIO_Pin_l);Delay(OxAFFFFf);GPIO_SetBits(GPIOE,GPIO_Pin_l);Delay(OxAFFFFf);〃LCD写寄存器地址函数voidLCD_WR_ADD(ul6index)((vul6*)(Bankl_LCD_Reg)=index;)//LCD写数据函数voidLCD_WR_DATA(ul6val)((vul6*)(Bankl_LCD_Data)=val;)〃LCD写寄存器命令函数,先将命令地址写到Reg中,然后再将命令的数值写到Data中〃具体地址和配置参照ILI9325的DatasheetvoidLCD_WR_CMD(u16index,ul6val)((vul6*)(Bankl_LCD_Reg)=index;*(vul6*)(Bankl_LCD_Data)=val;)voidLCD_lnit()(〃设置内部时钟LCD_WR_CMD(0x00E3,0x3008);LCD_WR_CMD(0x00E7,0x0012);LCD_WR_CMD(0x00EF,0x1231);〃启动振荡,ILI9325可以不要这一*句LCD_WR_CMD(0x0000,0x0001);〃设置驱动器输出控制,SS=1,SM=0〃当SS=O时,源输出信号从S1开始至S720结束;〃当SS=1时:源输出信号从S720开始至S1结束。//SM和GS搭配使用,具体查看ILI93258.2.3DriverOutputContorlLCD_WR_CMD(0x0001,0x0100);//LCD波形控制//B/C=l:行反转;//EOR=1和B/C=l:设置行反转//8.2.4LCDDrivingWaveControlLCD_WR_CMD(0x0002,0x0700);〃设置进入模式〃AM=1:地址在水平写入方向上更新//l/D[l:0]=01:水平方向递增,垂直方向递减//BGR=1:RGB数据转换为BGR数据//TRI=0;DFM=0;〃详细信息参考ILI93258.2.5EntryModeLCD_WR_CMD(0x0003,0x1018);〃重新调整控制寄存器大小//8.2.6ResizingControlRegisterLCD_WR_CMD(0x0004,0x0000);〃显示器控制2//FP[3:0]=0010;//BP[3:0]=0010;〃详细信息参考ILI93258.2.8DisplayControl2LCD_WR_CMD(0x0008,0x0202);〃显示器控制3〃设置非显示区域刷新//8.2.9DisplayControl3LCD_WR_CMD(0x0009,0x0000);〃显示器控制4//FMARK信号设置//8.2.10DisplayControl4LCD_WR_CMD(0x000A,0x0000);//RGB显示接口控制1//8.2.11RGBDisplayInterfaceControl1LCD_WR_CMD(0x000C,0x0000);〃帧标记位置//8.2.12FrameMarkerPositionLCD_WR_CMD(0x000D,0x0000);//RGB显示接口控制2//8.2.13RGBDisplayInterfaceControl2LCD_WR_CMD(0x000F,0x0000);〃功率控制1//8.2.14PowerControl1LCD_WR_CMD(0x0010,0x0000);〃功率控制2//8.2.15PowerControl2//VC[2:0]=lll:参考电压为VciLCD_WR_CMD(0x0011,0x0007);〃功率控制3//8.2.16PowerControl3LCD_WR_CMD(0x0012,0x0000);〃功率控制4//8.2.17PowerControl4LCD_WR_CMD(0x0013,0x0000);〃延时,放电Delay(200);〃功率控制1//SAP=1:源驱动程序被启动//BT[2:0]=110://APE=1:开始供应电力//AP[2:0]=001:伽马驱动放大和源驱动放大LCD_WR_CMD(0x0010,0x1690);〃功率控制2//DCl[2:0]=010:选择升压电路2工作频率Fosc/16//DC0[2:0]=010:选择升压电路1工作频率Fosc/4//VC[2:0]=lll:参考电压为VciLCD_WR_CMD(0x0011,0x0227);〃延时Delay(50);〃功率控制3//PON=1:控制线路3(VGL)开启//VRH[3:0]=1100:设置外部参考电压LCD_WR_CMD(0x0012,OxOOlC);〃延时Delay(50);〃功率控制4//VDV[4:0]=11000:设置Vcom的电压振幅交替LCD_WR_CMD(0x0013,0x1800);〃功率控制7//8.2.21PowerControl7//VCM[5:0]=011100:设置内部VcomH电压LCD_WR_CMD(0x0029,OxOOlC);〃帧速率和色彩控制//8.2.22FrameRateandColorControl//FRS[3:0]:1101:帧率128LCD_WR_CMD(0x002B,OxOOOD);〃延时Delay(50);//GRAM的水平地址//8.2.18GRAMHorizontal/VerticalAddressSetLCD_WR_CMD(0x0020,0x0000);//GRAM的垂直地址LCD_WR_CMD(0x0021,0x0000);〃伽马控制//8.2.23GammaControlLCD_WR_CMD(0x0030,0x0007);LCD_WR_CMD(0x0031,0x0302);LCD_WR_CMD(0x0032,0x0105);LCD_WR_CMD(0x0035,0x0206);LCD_WR_CMD(0x0036,0x0808);LCD_WR_CMD(0x0037,0x0206);LCD_WR_CMD(0x0038,0x0504);LCD_WR_CMD(0x0039,0x0007);LCD_WR_CMD(0x003C,0x0105);LCD_WR_CMD(0x003D,0x0808);〃水平和垂直位置的RAM地址//8.2.24HorizontalandVerticalRAMAddressPosition〃水平方向开始地址LCD_WR_CMD(0x0050,0x0000);〃水平方向结束地址(0-239)LCD_WR_CMD(0x0051,OxOOEF);〃垂直方向开始地址LCD_WR_CMD(0x0052,0x0000);〃垂直方向结束地址(0・319)LCD_WR_CMD(0x0053,0x013F);〃门扫描控制//8.2.25GateScanControl〃GS=1:扫描方向是从G320至G1//NL[5:0]=100111LCD_WR_CMD(0x0060,0xA700);//NDL=0:在非显示区域设置源驱动器的输出极//VLE=0:垂直滚动显示不可用//REV=1:图像灰度反转LCD_WR_CMD(0x0061,0x0001);//VL[8:0]=0LCD_WR_CMD(0x006A,0x0000);〃局部影像1显示位置//8.2.26PartialImage1DisplayPositionLCD_WR_CMD(0x0080,0x0000);〃局部影像1RAM开始/结束地址//8.2.27PartialImage1RAMStart/EndAddressLCD_WR_CMD(0x0081,0x0000);LCD_WR_CMD(0x0082,0x0000);〃局部影像2显示位置//8.2.28.PartialImage2DisplayPositionLCD_WR_CMD(0x0083,0x0000);〃局部影像2RAM开始/结束地址//8.2.29PartialImage2RAMStart/EndAddressLCD_WR_CMD(0x0084,0x0000);LCD_WR_CMD(0x0085,0x0000);〃平板接口控制1//8.2.30PanelInterfaceControl1〃RTNI[4:0]=10000:设置内部时钟运行模式中1线时钟的数目:〃个LCD_WR_CMD(0x0090,0x0010);〃平板接口控制2//8.2.31PanelInterfaceControl2LCD_WR_CMD(0x0092,0x0000);LCD_WR_CMD(0x0093,0x0003);〃平板接口控制4//8.2.32PanelInterfaceControl4LCD_WR_CMD(0x0095,0x0110);LCD_WR_CMD(0x0097,0x0000);LCD_WR_CMD(0x0098,0x0000);〃显示控制1//8.2.7DisplayControl1//BASEE=1:显示基本图像//GON=1DTE=1:正常显示//D[l:0]=ll:翻开显示面板LCD_WR_CMD(0x0007,0x0133);〃GRAM写入数据,用黑色清屏LCD_WR_ADD(0x0022);for(colorl=0;colorl<320*240;colorl++)(LCD_WR_DATA(0x0000);//)colorl=0;)stm32fl0x_lcd.h中的代码#include"stm32fl0xJib.h"//LCD复位函数voidLCD_rst();//LCD初始化函数voidLCD_lnit();〃延时函数voidDelay(u32nCount);〃LCD写寄存器地址函数voidLCD_WR_ADD(ul6index);//LCD写数据函数voidLCD_WR_DATA(ul6val);pijbit.c中的代码和pijhit.c中的代码由于太长了,所以并没有贴出来,其实就是根据某一幅图片用lmage2LCD生成的,其数组名分别叫constunsignedcharLCD_lmage_BIT[153600]constunsignedcharLCD_lmage_HIT[153600].支持同时扩展多种存储器。FSMC的映射地址空间中,不同的BANK是独立的,可用于扩展不同类型的存储器。当系统中扩展和使用多个外部存储器时,FSMC会通过总线悬空延迟时间参数的设置,防止各存储器对总线的访问冲突。.支持更为广泛的存储器型号。通过对FSMC的时间参数设置,扩大了系统中可用存储器的速度范围,为用户提供了灵活的存储芯片选择空间。.支持代码从FSMC扩展的外部存储器中直接运行,而不需要首先调入内部SRAM。FSMC包含两类控制器:1个NOR闪存/SRAM控制器,可以与NOR闪存、SRAM和PSRAM存储器接口。1个NAND闪存/PC卡控制器,可以与NAND闪存、PC卡,CF卡和CF+存储器接口。控制器产生所有驱动这些存储器的信号时序:位数据线,用于连接8位或16位的存储器;位地址线,最多可连续64MB的存储器(这里不包括片选线);5位独立的片选信号线;组适合不同类型存储器的控制信号线:控制读/写操作与存储器通信,提供就绪/繁忙信号和中断信号与所用配置的PC卡接口:PC存储卡、PCI/O卡和真正的IDE接口从FSMC的角度看,可以把外部存储器划分为固定大小为256MB的4个存储块・存储块I用于访问最多4个NOR闪存或者PSRAM存储设备。这个存储区被划分为4个NOR/PSRAM区,并有4个专用的片选。•存储块2和3用于访问NAND闪存设备,每个存储块连接一个NAND闪存。•存储块4用于访问PC卡设备每一个存储块上.的存储器类型是由用户在配置寄存器中定义的。注意:FSMC只是提供了一个控制器,并不提供相应的存储设备,至于外设接的是什么设备,完全是由用户自己选择,只要能用于FSMC控制,就可以,像本次实验中,我们接的就是LCM。3.本例中FSMC的使用由于本例只是利用FSMC对LCM进行操作,因此不用完全懂得FSMC的所有功能,而是懂得一局部相应的操作即可。LFSMC包括哪几个局部FSMC包含以下4个模块:AHB接口(包含FSMC配置寄存器)NOR闪存和PSRAM控制器NAND闪存和PC卡控制器外部设备接口需要注意的是,FSMC可以请求AHB进行数据宽度操作。如果AHB操作的数据宽度大于外部设备(NOR或NAND或LCD)的宽度,此时FSMC将AHB操作分割成几个连续的较小的数据宽度,以适应外部设备的数据宽度。FSMC对外部设备的地址映像FSMC对外部设备的地址映像从0x600000()()开始,至U0x9FFFFFFF结束,一共4个地址块,每个地址块256MB,而每个地址块又分成4个分地址块,大小为64MB。对于NOR的地址映像来说,我们可以通过选择HADDR[27:26]来确定当前使用的是哪个64M的分地址块。而这四个分存储块的片选,那么使用NE[4:1]来选择。数据线/地址线/控制线是共享的。这里的HADDR是需要转换到外部设备的内部AHB地址线,每个地址对应一个字节单元。因此,假设外部设备的地址宽度是8位的,那么HADDR[25:0]与STM32的CPU引脚FSMC_A[25:0]一一对应,最大可以访问64M字节的空间。假设外部设备的地址宽度是16位的,那么是HADDR[25:1]与STM32的CPU引脚FSMC_A[24:0]对应。在应用的时候,可以将FSMC_A总线连接到存储器或其他外设的地址总线引脚上。.ILI9325由于我们使用的是奋斗STM32V3开发板,其内部自带的是一个LCM,产品的编号是:QD024CPS25-36AV0,其中的详细规格参数可以参考QD024CPS25-36AV0规格书中的记载。而LCM中的驱动IC就是采用的IL19325。ILI9325的功能很多,在此无法一一说明,但是参考ILI9325的Dalasheel我们发现有几个引脚还是非常重要的,而只要操作好了这几个引脚,基本上就可以实现简单的对LCM的控制了。nCS:IC的片选信号。如果是低电平,贝UILI9325是被选中,并且可以进行操作,如果是高电平,这不被选中。RS:寄存器选择信号。如果是低电平,那么选择的是索引或者状态寄存器,如果是高电平,那么选择控制寄存器。nWR/SCL:写使能信号,低电平有效。nRD:读使能信号,低电平有效。以上内容是从ILI9325的Datasheet里面找到的,但是根据我的实际操作发现,似乎高电平也是有效的。而且,不管是高电平还是低电平,都可以成功驱动LCD,如果有了解情况的可以讨论一下。ILI9325的寄存器非常多,详细的各个寄存器的功能请参考HJ9325的Datasheet。在对ILI9325进行操作时,应该先写地址,然后再写数据,设置好各个寄存器之后,ILI9325就可以开始工作了。.电路设计.信号线的连接STM32F10xFSMC有4个不同的banks,每一个64MB,可支持NOR以及其他类似的存储器。这些外部设备的地址线、数据线和控制线是共享的。每个设备的访问时通过片选信号来决定的,而每次只能访问一个设备。我们的LCM就是连接在NOR的bank上面。FSMC_D[15:0]:16bit的数据总线,连接ILI9325的数据线;FSMC_NEx:分配给NOR的256MB的地址空间还可以分为4个banks,每一个区用来分配一个外设,这4个外设分别就是NE1-NE4;FSMC.NOE:输出使能,连接ILI9325的nRD引脚;FSMC_NWE:写使能,连接ILI9325的nWR引脚;FSMC_Ax:用在LCD显示RAM和寄存器之间进行选择的地址线,这个和ILI9325的RS引脚相连。该线可用任意一根地址线,范围是FSMC_A[25:0]。当RS=0时,表示读写寄存器,RS=1时,表示读写数据RAM。其实关于RS的表述也并不完全准确,应该这么理解,RS=0的时候,向这个地址写的数表示了选择什么寄存器进行操作,然而要对寄存器进行什么操作,那么要看当RS=1时,送入的数据了。关于地址的计算,如果我们选择NOR的第一个存储区,并且使用FSMC_A16来控制ILI9325的RS引脚,那么如果要访问寄存器地址(RS=0),那么地址是0x60000000(起始地址),如果要访问数据区(RS=1),那么基地址应该是0x60020000。有人会问,为什么不是()x60010000呢?因为FSMC_A16=1。因为在前文中已经说过,假设外部设备的地址宽度是16位的,那么是HADDR[25:1]与STM32的CPU引脚FSMC_A[24:0]对应。也就是说,内部产生的地址应该要左移一位,FSMC_A16=1,代表着第17位为1,而不是第16位为1。如果外部设备的地址宽度是8位的话,那么不会出现这个问题。再举一个例子,如果选择NOR的第4个存储区,使用FSMC_A0来控制RS引脚,那么访问数据区的地址为0x60000002,访问LCD寄存器的地址为:0x60000000o.时序问题一般使用模式2来做LCD的接口控制,不使用外扩模式。并且读写操作的时序一样。此种情况下,我们需要使用3个参数:ADDSET、DATAST.ADDHOLDo时序的计算需要根据NOR闪存存储器的特性和STM32F10x的时钟HCLK来计算这些参数。写或读访问时序是存储器片选信号的下降沿与上升沿之间的时间,这个时间可以由FSMC时序参数的函数计算得到:写/读访问时间=((ADDSET+1)+(DATAST+1))XHCLK在写操作中,DATAST用于衡量写信号的下降沿与上升沿之间的时间参数:写使能信号从低变高的时间=tWP=DATASTXHCLK为了得到正确的FSMC时序配置,以下时序应予以考虑:最大的读/写访问时间、不同的FSMC内部延迟、不同的存储器内部延迟因此得到:((ADDSET+1)+(DATAST+l))xHCLK=max(tWC,IRC)DATASTxHCLK=tWPDATAST必须满足:DATAST=(tAVQV+tsu(Data_NE)+tv(A_NE))/HCLK-ADDSET-4由于我没有找到ILI9325的这些时序的参数,所以就参考了一些以前别人写的程序里面的时序配置:当HCLK的频率是72MHZ,使用模式B,那么有如下时序:地址建立时间:0x1地址保持时间:0x()数据建立时间:()x5.程序编写步骤对于程序的编写,一般步骤是:.初始化RCC;.初始化GPIO;.初始化FSMC;.初始化LCD;.往GRAM里面写入显示数据。其中RCC、GPIO、FSMC的初始化函数在STM32的固件库中已经有相应的函数,在此就不赘述了,如果有不懂的,可以参考以前我写的学习笔记。FSMC的初始化参数很多,而且基本上可以通用,因此在此也不对每一个参数具体有什么用进行解释了,一般来说,用通用参数就足够普通的开发了。而对LCD的初始化,那么需要自己编写相应的代码。基本原那么是,首先向寄存器地址写入需要操作的寄存器地址(代码),然后再根据Datasheet,向数据区地址写入相应的数据,以实现某些操作。具体的操作在ILI9325的Datasheet第8节RegisterDescriptions中,有详细的解释。而LCD的初始化只要按照Datasheet里面的,把每一个寄存器都给配置好了,就没有问题了。而这些寄存器的配置,大局部都是通用的,只是有一些屏幕方向选择,坐标系等会略有差异。LCD配置好之后,就可以往GRAM里面写入图像数据了,在这里推荐一个软件“Image2LCD”,这个软件能读取图像,然后生成C代码的数据,只要将这些生成的代码直接写入GRAM中,就可以显示出图像了。不过要记住,在图像转换的时候,输出数据类型选择“C语言数组”,扫描模式选择“水平扫描”,输出灰度“16位真彩色”,最大宽度和高度“320”“240”勾选“高位在前(MSBFirst)”。这些配置都是和ILI9325的寄存器配置相对应的,如果说ILI9325的配置和本文中的不一样,那么需要相应的选择其他的选项。.程序源代码main.c文件中的代码:ftinclude"stm32fl0x_lib.h"#include"stm32fl0x_lcd.h"externunsignedcharLCD_lmage_BIT[];externunsignedcharLCD_lmage_HIT[];voidRCC_cfg();voidFSMC_cfg();voidLCD_cfg();voidGPIO_cfg();voidLCD_Show(unsignedchar*LCD_lmage);intmain()(RCC_cfg();GPIO_cfg();FSMC_cfg();LCD_cfg();while(l)(LCD_Show(LCD_lmage_HIT);Delay();LCD_Show(LCDJmage_BIT);Delay();)//RCC时钟配置voidRCC_cfg()(〃定义错误状态变量ErrorStatusHSEStartUpStatus;〃将RCC寄存器重新设置为默认值RCC_Delnit();〃翻开外部高速时钟晶振RCC_HSEConfig(RCC_HSE_ON);〃等待外部高速时钟晶振工作HSEStartUpStatus=RCC_WaitForHSEStartUp();if(HSEStartUpStatus==SUCCESS)(〃设置AHB时钟(HCLK)为系统时钟RCC_HCLKConfig(RCC_SYSCLK_Divl);〃设置高速AHB时钟(APB2)为HCLK时钟RCC_PCLK2Config(RCC_HCLK_Divl);〃设置低速AHB时钟(APB1)为HCLK的2分频RCC_PCLKlConfig(RCC_HCLK_Div2);〃设置FLASH代码延时FLASH_SetLatency(FLASH_Latency_2);〃使能预取指缓存FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);〃设置PLL时钟,为HSE的9倍频8MHz*9=72MHzRCC_PLLConfig(RCC_PLLSource_HSE_Divl,RCC_PLLMul_9);〃使能PLLRCC_PLLCmd(ENABLE);〃等待PLL准备就绪while(RCC_GetFlagSt
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 投资顾问代理合同
- 暂停劳动合同协议的法律效力
- 摇一摇服务合同的违约金计算
- 服务合同企业管理咨询
- 房屋买卖合同解除的解除案例
- 智能语音合成研发协议
- 肉鸡供应商合同样本
- 典当行贷款协议样式
- 牛奶研究选购合同
- 爆破作业合同协议
- JGJ406T-2017预应力混凝土管桩技术标准附条文
- 环境空气自动监测站运维服务投标方案
- 第5讲-空间运动方程-潜艇
- 生物化学研究进展概述
- 03S702钢筋混凝土化粪池图集
- 2022-2023学年天津市新华重点中学高一上学期期末英语试卷原卷版+解析版无听力部分
- 《孙子兵法》与执政艺术学习通超星课后章节答案期末考试题库2023年
- 苁蓉山庄工程施工组织设计
- 新人教版二年级上册数学全册教案(含教学反思)
- 钣金件设计经验手册
- 管理沟通(山东联盟-山东管理学院)知到章节答案智慧树2023年
评论
0/150
提交评论