TA的每日心情 | 擦汗 2019-6-26 20:59 |
---|
签到天数: 235 天 连续签到: 1 天 [LV.7]常住居民III
|
本帖最后由 小马哥-1650185 于 2018-6-16 16:37 编辑
PXP 是 NXP 设计的一种高性能的 2D 图形处理微构架。用于图像数据发送到 LCD 或者 TV编码器之前的数据处理,例如图像缩放、旋转等。为无 SDRAM 和基于 SRAM 的系统提供占用内存最小的图像数据优化和性能。
PXP 能将以下内容组合到一个处理引擎中:
-图像缩放;
-图像色彩转换;
-图像旋转;
-alpha 混合;
-颜色键算法;
-像素校正。
PXP 由多个流水线块组成,共同完成复杂算法或组合操作。
PXP结构图
配置步骤
选择 PXP 时钟源,配置时钟频率;
使能 PXP 时钟;
复位 PXP 外设;
根据要操作的具体内容配置 PXP 相应控制寄存器;
设置输入缓冲区配置,包括输入像素格式,输入缓冲区地址等;
设置输出缓冲区配置,包括输出像素格式,输出模式等;
如果使用中断需要置位相应中断位,并使能中断号;
若对中断优先级有要求,配置中断优先级;
填充要进行数据处理的缓冲数据区;
将数据区的地址填入 PXP 相应寄存器;
使能 PXP 进行数据处理。
官方sdk有如下几个demo
气质:
blend:利用 PXP 进行图形混合操作;
flip: 利用 PXP 进行图形翻转操作;
queue:利用 PXP 命令队列进行图形翻转操作;
rotate:利用 PXP 进行图形旋转操作;
scale:利用 PXP 进行图形缩放操作;
通过调用官方库 #include "fsl_pxp.h"配置pxp,
- void LCD_PXP_Config(void)
- {
- PXP_Init(APP_PXP);
- /* PS configure. */
- const pxp_ps_buffer_config_t psBufferConfig = {
- .pixelFormat = kPXP_PsPixelFormatRGB888,
- .swapByte = false,
- .bufferAddr = (uint32_t)s_psBufferPxp,
- .bufferAddrU = 0U,
- .bufferAddrV = 0U,
- .pitchBytes = APP_PS_SIZE * APP_BPP,
- };
- PXP_SetProcessSurfaceBackGroundColor(APP_PXP, 0U);
- PXP_SetProcessSurfaceBufferConfig(APP_PXP, &psBufferConfig);
- /* Disable AS. */
- PXP_SetAlphaSurfacePosition(APP_PXP, 0xFFFFU, 0xFFFFU, 0U, 0U);
- /* Output config. */
- outputBufferConfig.pixelFormat = kPXP_OutputPixelFormatRGB888;
- outputBufferConfig.interlacedMode = kPXP_OutputProgressive;
- outputBufferConfig.buffer0Addr = (uint32_t)s_frameBuffer[0];
- outputBufferConfig.buffer1Addr = 0U;
- outputBufferConfig.pitchBytes = APP_IMG_WIDTH * APP_BPP;
- outputBufferConfig.width = APP_IMG_WIDTH;
- outputBufferConfig.height = APP_IMG_HEIGHT;
- PXP_SetOutputBufferConfig(APP_PXP, &outputBufferConfig);
- /* Disable CSC1, it is enabled by default. */
- PXP_EnableCsc1(APP_PXP, false);
- }
复制代码 图像缩放的显示
- void APP_Scale(void)
- {
- uint8_t curLcdBufferIdx = 1U;
- float downScaleStart = 0.5f;
- float downScaleEnd = 4.0f;
- float downScaleStep = 1.01f;
- float downScaleFact;
- uint16_t outputWidth, outputHeight;
- for (;;)
- {
- for (downScaleFact = downScaleStart; downScaleFact <= downScaleEnd; downScaleFact *= downScaleStep)
- {
- outputWidth = (uint16_t)((float)APP_PS_SIZE / downScaleFact);
- outputHeight = (uint16_t)((float)APP_PS_SIZE / downScaleFact);
- /* Prepare next buffer for LCD. */
- PXP_SetProcessSurfaceScaler(APP_PXP, APP_PS_SIZE, APP_PS_SIZE, outputWidth, outputHeight);
- PXP_SetProcessSurfacePosition(APP_PXP, APP_PS_ULC_X, APP_PS_ULC_Y, APP_PS_ULC_X + outputWidth - 1U,
- APP_PS_ULC_Y + outputHeight - 1U);
- outputBufferConfig.buffer0Addr = (uint32_t)s_frameBuffer[curLcdBufferIdx];
- PXP_SetOutputBufferConfig(APP_PXP, &outputBufferConfig);
- PXP_Start(APP_PXP);
- /* Wait for process complete. */
- while (!(kPXP_CompleteFlag & PXP_GetStatusFlags(APP_PXP)))
- {
- }
- PXP_ClearStatusFlags(APP_PXP, kPXP_CompleteFlag);
- /* Now new frame is ready, pass it to LCDIF. */
- ELCDIF_SetNextBufferAddr(APP_ELCDIF, (uint32_t)s_frameBuffer[curLcdBufferIdx]);
- /*
- * The new frame is not loaded untill current frame display finished. So
- * wait until current frame finished.
- */
- ELCDIF_ClearInterruptStatus(APP_ELCDIF, kELCDIF_CurFrameDone);
- while (!(kELCDIF_CurFrameDone & ELCDIF_GetInterruptStatus(APP_ELCDIF)))
- {
- }
- /* Switch to the other LCD buffer. */
- curLcdBufferIdx ^= 1U;
- }
- }
- }
复制代码
在主函数中,
- /* 初始化LED */
- LED_GPIO_Config();
-
- /* 初始化LCD */
- LCD_Init(LCD_INTERRUPT_DISABLE);
-
- RGB_LED_COLOR_BLUE;
- LCD_PXP_Config();
-
- LCD_Test();
- APP_Scale();
复制代码
正常情况下,按照例程中的说明文档连接好 LCD 之后,编译下载PXP 例程到 RT1052 开发板,一个三色的正方形大小在有规律的改变。
|
|