目录
上一篇2个层的显示内容对应显存,IPA就是实现快速更新这个显存的方式,包括更新同时完成格式的转换。
IPA定义了前景层和背景层,背景层可以简单的理解为TLI的Layer0和Layer1(实际就是对应这2个层的TLI_LxFBADDR地址值),而前景层是需要更新到背景层的数据。
IPA的背景层只支持ARGB8888,RGB888,RGB565,ARGB1555,ARGB4444。
1. 初始化
使能IPA的RCU,并复位IPA
RCU_AHB1EN |= ((uint32_t)1 << 23);
//IPA Reset
RCU_AHB1RST |= ((uint32_t)1 << 23);
RCU_AHB1RST &= ~((uint32_t)1 << 23);
2. 设置背景层
2.1 停止IPA
IPA_CTL |= ((uint32_t)1 << 2);
2.2 设置颜色格式
IPA_DPCTL = format;
这个一般是和TLI中的层的格式对应。
2.3 设置颜色
颜色对应寄存器IPA_DPV,设定的值和格式有关,如果是ARGB8888,则这个寄存器的颜色值就是ARGB8888,比如纯红色值为0x00FF0000, 如果是RGB565,颜色就需要设置为RGB565,比如纯红色值为0xF800。这个颜色的设定应该是设置为填充颜色的模式时才有效。
2.4 设置地址
对应寄存器IPA_DMADDR,目标地址。
2.5 设置背景层大小
IPA_IMS = ((uint32_t)setting.w << 16) | setting.h;
2.6 设置偏移
对应寄存器IPA_DLOFF
2.7 总结
背景层一般对应TLI的层0或者层1。
TLI的层中数据地址如上图层的起始地址,而背景层可以实现层中的局部更新(当然也可以全部更新),在定义背景层的起始地址就可以决定背景层在层中的位置。
偏移值如上图a+b,这样前景层数据更新到背景层是可以做到在背景层的区域内。
3. 设置前景层
3.1 设置数据地址
对应寄存器IPA_FMADDR
3.2 设置颜色格式
对应寄存器IPA_FPCTL
3.3 设置颜色
对应寄存器IPA_FPV和IPA_FPCTL,IPA_FPV配置RGB值,IPA_FPCTL的位24-31对应Alpha值。
3.4 设置alpha值计算算法
对应寄存器IPA_FPCTL
有3种计算方式。
3.5 设置偏移
对应寄存器IPA_FLOFF。
假设定义宽高为10,20的矩形框作为TLI的层0和层1,层0为黑色作为背景用来参考层1的变化。层0和层1的位置一样。
IPA的背景层对应层1,y方向偏移10,即IPA更新层1的下半部分空间。同样,前景层和背景层一样大小,改变这个偏移值看效果。
当前景层的偏移值为2和4时,显示效果如下图,红色是层1原来的颜色,绿色是前景层数据更新到背景层的颜色,即一个10x10的数组都是绿色值,黑色是层0.
offset = 2时,下面黑色部分有16个像素没有更新,而offset = 4时,有28个像素没有更新。规律有点奇怪,偏移值的含义不是太明显。