本帖最后由 平湖秋月 于 2014-1-6 13:28 编辑
平湖秋月 发表于 2014-1-5 21:25
19.2.2 LCD Interface Display Driver (LIDD) Mode
The LIDD mode controller allows connection of disp ...
下面的程序段演示如何使用LCD控制器API来配置一个800x480分辨率的光栅板,并以8bpp帧缓冲格式显示。注意:配置光栅时序时需考虑不同显示器的差异。根据您的显示器实际修改tLCDRaster结构体的时序值。
//*****************************************************************************
//
// Define the frame buffer dimensions and format.
//
//*****************************************************************************
#define SCREEN_WIDTH 800
#define SCREEN_HEIGHT 480
#define SCREEN_BPP 8
//*****************************************************************************
//
//分类定义包含图像的位图和调色板的大小。
//
//*****************************************************************************
#define SIZE_IMAGE ((SCREEN_WIDTH * SCREEN_HEIGHT * SCREEN_BPP) / 8)
#define SIZE_PALETTE ((SCREEN_BPP == 8) ? (256 * 2) : (16 * 2))
//*****************************************************************************
//帧缓冲在存储器中的适当存储单元,最有可能在 连接的EPI SDRAM中的0x10000000单元。
// The frame buffer will be (SIZE_IMAGE + SIZE_PALETTE) bytes long.
//
//*****************************************************************************
uint32_t *g_pui32DisplayBuffer = (uint32_t *)LCD_FRAME_BUFFER_ADDR;
//*****************************************************************************
//计算指向调色板的帧缓冲器和实际位图第一个字节的指针。
//
//*****************************************************************************
uint16_t *g_pui16Palette = (uint16_t *)LCD_FRAME_BUFFER_ADDR;
uint8_t *g_pBitmap = (uint8_t *)(LCD_FRAME_BUFFER_ADDR + SIZE_PALETTE);
//*****************************************************************************
//
// Initialize our source color palette. These colors are defined in RGB888
// format as used by the TivaWare Graphics Library.注意这个定义在TivaWare图像库中
//
说明这里采用8bpp格式显示,所以颜色被定义成RGB888,而市面上常用的
是16bpp格式显示,即RGB565格式。
//*****************************************************************************
const uint32_t g_pulSrcPalette[256] =
{
ClrBlack,
ClrWhite,
ClrRed,
ClrLightGreen,
ClrBlue,
ClrYellow,
ClrMagenta,
ClrCyan,
ClrOrange,
//
// and so on...
//
};
//*****************************************************************************
//
//分类定义所需的像素时钟,PLL VCO频率和系统时钟。
// Note that the system clock must be an integer multiple of the pixel clock.系统时钟为像素的
//整数倍
//*****************************************************************************
#define PIXEL_CLOCK_FREQ 30000000
#define SYSTEM_VCO_FREQ SYSCTL_CFG_VCO_480
#define SYSTEM_CLOCK_FREQ 120000000
//*****************************************************************************
//
// 各种光栅接口信号的时序和信号极性。
//时序参数用像素时钟(水平时序)和线(垂直时序)来定义。
//*****************************************************************************
tLCDRasterTiming g_sRasterTimings =
{
(RASTER_TIMING_ACTIVE_HIGH_PIXCLK |
RASTER_TIMING_SYNCS_ON_RISING_PIXCLK),
SCREEN_WIDTH, SCREEN_HEIGHT,
2, 30, 8,
10, 10, 8,
0
};
//*****************************************************************************
//
// LCD控制器的中断处理程序。此函数只计算接收中断。
//
//*****************************************************************************
void
LCDIntHandler(void)
{
uint32_t ui32Status;
//
// Get the current interrupt status and clear any active interrupts.
//
ui32Status = LCDIntStatus(LCD0_BASE, true);
LCDIntClear(LCD0_BASE, ui32Status);
//
// Handle any interrupts as required by the application. In normal
// operation, no action is required at interrupt time to keep the raster
// scan running.
//
}
//*****************************************************************************
//初始化LCD控制器来驱动光栅显示模式并使能光栅引擎。
//
//*****************************************************************************
void
InitDisplay(uint32_t ui32SysClkHz, uint32_t ui32PixClock,
tLCDRasterTiming *psTimings)
{
uint32_t ui32Loop;
//
// Enable the LCD controller peripheral.使能外设
//
SysCtlPeripheralEnable(SYSCTL_PERIPH_LCD0);
//
// Wait to ensure that the LCD controller is enabled.
//
SysCtlDelay(2);
//
// Configure the LCD controller for raster operation with a pixel clock
// as close to the requested pixel clock as possible.配置光栅操作
//
ui32PixClock = LCDModeSet(LCD0_BASE, (LCD_MODE_RASTER |
LCD_MODE_AUTO_UFLOW_RESTART),
ui32PixClock, ui32SysClkHz);
//
// Set the output format for the raster interface.设置光栅接口的输出格式
//
LCDRasterConfigSet(LCD0_BASE, RASTER_FMT_ACTIVE_PALETTIZED_16BIT, 0);
//
// Program the raster engine timings according to the display requirements.
//编程光栅引擎时序
LCDRasterTimingSet(LCD0_BASE, psTimings);
//
// Configure LCD DMA-related parameters.配置DMA相关参数
//
LCDDMAConfigSet(LCD0_BASE, LCD_DMA_BURST_4);
//
// Set up the frame buffer.设置帧缓冲
//
LCDRasterFrameBufferSet(LCD0_BASE, 0, g_pui32DisplayBuffer,
SIZE_PALETTE + SIZE_IMAGE);
//
// 写调色板的帧缓冲区。
//
LCDRasterPaletteSet(LCD0_BASE,
LCD_PALETTE_SRC_24BIT | LCD_PALETTE_TYPE_8BPP,
(uint32_t *)g_pui16Palette, g_pulSrcPalette, 0,
(SIZE_PALETTE / 2));
//
// 用黑色填充帧缓冲区(像素值0对应黑色,我们刚才设置的调色板)。
//
for(ui32Loop = 0; ui32Loop < (SIZE_IMAGE / sizeof(uint32_t)); ui32Loop++)
{
g_pui32DisplayBuffer[ui32Loop] = 0;
}
//
// Enable the LCD interrupts.
//
LCDIntEnable(LCD0_BASE, (LCD_INT_DMA_DONE | LCD_INT_RASTER_FRAME_DONE |
LCD_INT_SYNC_LOST | LCD_INT_AC_BIAS_CNT | LCD_INT_UNDERFLOW |
LCD_INT_PAL_LOAD | LCD_INT_EOF0 | LCD_INT_EOF1));
IntEnable(INT_LCD0);
//
// Enable the raster output.
//
LCDRasterEnable(LCD0_BASE);
}
//*****************************************************************************
//
// This example demonstrates the use of the LCD Controller in raster mode.
//这个例子演示了如何使用光栅模式的LCD控制器。
//*****************************************************************************
int
main(void)
{
uint32_t ui32SysClock;
//
// 设置系统时钟从PLL在120 MHz运行。
//
ui32SysClock = SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ |
SYSCTL_OSC_MAIN |
SYSCTL_USE_PLL |
SYSTEM_VCO_FREQ), SYSTEM_CLOCK_FREQ);
//
// Configure the device pins.引脚配置
//
PinoutSet();
//
// Enable interrupts in the CPU.
//
IntMasterEnable();
//
// Initialize the display controller and start the raster engine.
//
InitDisplay(ui32SysClock, PIXEL_CLOCK_FREQ, &g_sRasterTimings);
while(1)
{
//
// Other application code...
//
}
}