MCX N微处理器SmartDMA对图像数据的定制处理实现

描述

MCX N系列MCU介绍

MCX N系列是高性能、低功耗微控制器,配备智能外设和加速器,可提供多任务功能和高能效。选择MCX N系列,包含eIQ Neutron神经处理单元(NPU),适用于机器学习应用。低功耗高速缓存增强了系统性能,双块Flash存储器和带ECC检测的RAM支持系统功能安全,提供了额外的保护和保证。

SmartDMA介绍 MCX N系列微控制器全系带有SmartDMA协处理器。该协处理器支持高效汇编代码指令运行,主要功能包含加减,左移右移,字节位域交换,位翻转,访问内存外设,单周期读写IO,接收外部触发信号等。为了方便客户工程师简单使用,我将常用的一些功能,通过数组的形式放在主代码工程中,用户只需要调用API函数即可。今天主要介绍如何使用SmartDMA对图像进行预处理。

图像处理介绍及应用 在嵌入式领域,我们经常需要对图像的数据进行处理。比如,我们从原图像接收到的数据,每个像素的高低字节可能是反的,又比如,我们可能只想要RGB数据,但是原图像数据可能还带有透明度的数据成分,这时我们想把透明度的数据去掉。

有时候我们显示接口要求的数据格式可能与我们RAM中的数据格式不一致,这时候就需要对图像数据进行预处理,然后再显示。还有时候,针对RAM中存放的显示数据,我们想挑选其中的一部分进行显示,比如隔点隔行显示。上面这些情况都可以通过CPU核来处理,但这种重复简单的工作无形给CPU造成很大的负担。SmartDMA可以很容易实现上述功能,并且不需要打扰CPU核工作。

SmartDMA对图像处理的实现

针对目前常用的情况,我用SmartDMA实现了如下几个功能:

1) 可以作为通用的DMA来实现,因为SmartDMA可以访问内存和外设,所以它可以作为一个通用的DMA。

2) 字节翻转功能。Smart DMA有字节翻转、位翻转等功能,所以又可以对数据进行预处理。字节翻转可以是一个半字(Half Word)里面的高低位字节翻转。也可以是一个字(Word)里面的最高字节和最低字节翻转。

3) 对一定数据长度的字节翻转。比如每次图像处理的一组数据有32个字节,SmartDMA可以将这些字节进行颠倒,也就是说第一个字节和最后一个字节互换,第二个字节和倒数第二个字节互换,以此类推。

4) 针对图像的数据格式实现RGB565和RGB888之间的互换,这也是为了应对不同的显示接口格式与RAM中存放的数据格式不一致的问题。

Demo展示 在MCXN系列微处理器的软件开发包SDK里面已经有一个相应的例程(lvgl_demo_widgets_bm)来实现这个功能。它实现的是一个流行的图形用户界面Little VGL的常用部件功能。在显示驱动中,用户既可以通过普通的DMA传送数据到LCD接口,也可以配置为通过SmartDMA来实现数据的传输。

使用的开发板是FRDM-MCXN947(FRDM-MCXN947 Development Board using MCUXpresso | NXP Semiconductors), 该开发板具有LCD接口。LCD使用FlexIO来驱动。LCD接口支持NXP LCD显示屏模块LCD-PAR-S035(LCD-PAR-S035 | NXP Semiconductors)。该LCD支持480x320分辨率。

SmartDMA给用户提供API接口有如下几个:

 

enum _smartdma_display_api
{


kSMARTDMA_FlexIO_DMA_Endian_Swap = 0U,


kSMARTDMA_FlexIO_DMA_Reverse32,


kSMARTDMA_FlexIO_DMA,


kSMARTDMA_FlexIO_DMA_Reverse, /*!< Send data to FlexIO with reverse order.


*/


kSMARTDMA_RGB565To888, /*!< Convert RGB565 to RGB888 and save to output


memory, use parameter


smartdma_rgb565_rgb888_param_t. */


kSMARTDMA_FlexIO_DMA_RGB565To888, /*!< Convert RGB565 to RGB888 and send to


FlexIO, use parameter


smartdma_flexio_mculcd_param_t. */


kSMARTDMA_FlexIO_DMA_ARGB2RGB, /*!< Convert ARGB to RGB and send to FlexIO,


use parameter


smartdma_flexio_mculcd_param_t. */


kSMARTDMA_FlexIO_DMA_ARGB2RGB_Endian_Swap, /*!< Convert ARGB to RGB, then


swap endian, and send to FlexIO, use


parameter smartdma_flexio_mculcd_param_t. */


kSMARTDMA_FlexIO_DMA_ARGB2RGB_Endian_Swap_Reverse, /*!< Convert ARGB to RGB,


then swap endian and reverse, and send


to FlexIO, use parameter smartdma_flexio_mculcd_param_t. */


};

 

Demo显示如下:

RGB




审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分