LCD显示例程分析
在CCS左边的Project Explorer中,右键单击选择Import->CCS Projects打开Import CCS Eclipse Projects对话框,点Browse按钮选择目录
C:\ti\AM335X_StarterWare_02_00_01_01\build\armv7a\cgt_ccs\am335x\evmskAM335x\raster,将导入rasterDisplay项目例程,如下图所示:
项目中只有rasterDisplay.c源文件,但会调用其它目录下的一些文件,如system_config、platform等目录下的一些文件。main()主函数中,基本都是初始化调用,MMUConfigAndEnable()函数配置使能MMU内存管理单元,CacheEnable()函数使能Cache高速缓冲区,IntMasterIRQEnable()函数使能ARM处理器的IRQ中断。IntAINTCInit()函数初始化AM335x ARM处理器的中断控制器,通常在使用中断控制器之前完成调用。
#define INTC_SYSCONFIG_SOFTRESET (0x00000002u)
如上图所示,IntAINTCInit()函数的第一条语句进行软件复位,而第二条语句等待软件复位完成。
而第三条语句则禁止中断优先级。最后一个for循环是初始化各个中断处理函数,即将其设置为进去就出来的空函数。
fnRAMVectors[]被定义为函数型数组,相当于中断向量表,专门用于保存处理器各个中断源的中断处理函数。
LCDAINTCConfigure()为LCD中断配置函数
IntRegister(SYS_INT_LCDCINT, LCDIsr)将LCDIsr()函数作为LCD中断处理函数存入中断向量表fnRAMVectors[]数组中:
RasterIntStatus()函数读取中断状态标志位,RasterClearGetIntStatus()函数清除中断状态标志位,同时返回中断状态标志位。
接着两个if语句分别判断是否为LCD的缓冲区0及1的DMA写结束产生的中断,是则重新配置对应缓冲区的基地址和结束地址。
IntPrioritySet(SYS_INT_LCDCINT, 0, AINTC_HOSTINT_ROUTE_IRQ )函数调用设定LCD中断的优先级
上述是将LCD控制器设置成IRQ中断且优先级为最高的0
IntSystemEnable(SYS_INT_LCDCINT)使能LCD中断。
#define INTC_MIR_CLEAR(n) (0x88 + ((n) * 0x20))
#define REG_IDX_SHIFT (0x05)
这里为何要(n)*0x20呢?原来是因为INTC_MIR_CLEAR0、INTC_MIR_CLEAR1和INTC_MIR_CLEAR2分别相差0x20。而2的5次方等于32,所以REG_IDX_SHIFT被定义为0x05。
总的来说就是中断向量号对应的mask位按顺序分别从小到大排列在INTC_MIR_CLEAR0、INTC_MIR_CLEAR1和INTC_MIR_CLEAR2的每位中。
LCDBackLightEnable()函数调用使能LCD背光,LCD背光原理图:
由上图知LCD背光使能由GPIO3_17控制,低电平使能,高电平禁止。
GPIO3ModuleClkConfig()配置GPIO3的时钟模块
GPIO_PMUX_OFFADDR_VALUE(3, 17, PAD_FS_RXE_PD_PUPDE(7))配置GPIO3_17的管脚复用功能为mode 7,CONTROL_CONF_RXACTIVE使能GPIO3_17的输入功能和选择内部电阻下拉,
GPIOModuleReset(SOC_GPIO_3_REGS)软件复位GPIO3模块
GPIOModuleEnable(SOC_GPIO_3_REGS)使能GPIO3模块
GPIODirModeSet(SOC_GPIO_3_REGS,GPIO_INSTANCE_PIN_NUMBER,GPIO_DIR_OUTPUT)函数设置GPIO3_17为输出口
#define GPIO_INSTANCE_PIN_NUMBER (17u)
#define GPIO_DIR_OUTPUT 0
GPIOPinWrite(SOC_GPIO_3_REGS, GPIO_INSTANCE_PIN_NUMBER,GPIO_PIN_LOW)函数设置GPIO3_17输出低电平
#define GPIO_PIN_LOW 0
SetUpLCD()设置LCD
LCDModuleClkConfig()配置LCD模块时钟
LCDPinMuxSetup()配置LCD所使用的管脚复用功能
RasterClocksEnable(LCDC_INSTANCE)使能LCD模块时钟
RasterDisable(LCDC_INSTANCE)禁止LCD模块
RasterClkConfig(LCDC_INSTANCE, 23040000, 192000000)配置LCD从PLL输入的时钟PCLK分频数
RasterDMAConfig(LCDC_INSTANCE, RASTER_DOUBLE_FRAME_BUFFER,
RASTER_BURST_SIZE_16, RASTER_FIFO_THRESHOLD_8,
RASTER_BIG_ENDIAN_DISABLE)配置LCD的DMA模块方式
RasterModeConfig(LCDC_INSTANCE, RASTER_DISPLAY_MODE_TFT_UNPACKED,
RASTER_PALETTE_DATA, RASTER_COLOR, RASTER_RIGHT_ALIGNED)配置LCD支持的模式类型颜色等
RasterTiming2Configure(LCDC_INSTANCE, RASTER_FRAME_CLOCK_LOW |
RASTER_LINE_CLOCK_LOW |
RASTER_PIXEL_CLOCK_HIGH|
RASTER_SYNC_EDGE_RISING|
RASTER_SYNC_CTRL_ACTIVE|
RASTER_AC_BIAS_HIGH , 0, 255)配置LCD的驱动时序,不同的屏需要作些调整
RasterHparamConfig(LCDC_INSTANCE, 480, 4, 8, 43)和 RasterVparamConfig(LCDC_INSTANCE, 272, 10, 4, 12)分别配置LCD屏的水平、垂直象素及时序
RasterFIFODMADelayConfig(LCDC_INSTANCE, 128)配置DMA FIFO延时时间
RasterDMAFBConfig()函数,
该函数将要显示的image1数组的首地址转给LCD DMA缓冲区的基地址寄存器(Frame Buffer 0 Base Address pointer),将image1数组末地址转给LCD DMA缓冲区的结束地址寄存器(Frame Buffer 0 Ceiling Address pointer)。另外,AM335x共有两块LCD DMA缓冲区,通过flag标志确定image1转给哪一块。
RasterIntEnable(LCDC_INSTANCE, RASTER_END_OF_FRAME0_INT |
RASTER_END_OF_FRAME1_INT);
使能了LCD DMA End-of-Frame中断,即当LCD缓冲区FB0和FB1的DMA写完成后将发出各自的中断信号。
#define RASTER_END_OF_FRAME0_INT LCDC_IRQENABLE_SET_EOF0
#define RASTER_END_OF_FRAME1_INT LCDC_IRQENABLE_SET_EOF1
#define LCDC_IRQENABLE_SET_EOF1 (0x00000200u)
#define LCDC_IRQENABLE_SET_EOF0 (0x00000100u)
主函数中RasterEnable函数使能LCD控制器。
最后是while(1)死循环。
当运行后将在目标板的LCD屏上显示下述图像
|