关于stm32f429原子哥教程的LTDC层配置问题

2019-07-20 18:23发布

在原子哥教程里面,关于ltcd.c文件里,用于配制层参数的的函数

[mw_shl_code=c,true]//LTDC,基本参数设置.
//注意:此函数,必须在LTDC_Layer_Window_Config之前设置.
//layerx:层值,0/1.
//bufaddr:层颜 {MOD}帧缓存起始地址
//pixformat:颜 {MOD}格式.0,ARGB8888;1,RGB888;2,RGB565;3,ARGB1555;4,ARGB4444;5,L8;6;AL44;7;AL88
//alpha:层颜 {MOD}Alpha值,0,全透明;255,不透明
//alpha0:默认颜 {MOD}Alpha值,0,全透明;255,不透明
//bfac1:混合系数1,4(100),恒定的Alpha;6(101),像素Alpha*恒定Alpha
//bfac2:混合系数2,5(101),恒定的Alpha;7(111),像素Alpha*恒定Alpha
//bkcolor:层默认颜 {MOD},32位,低24位有效,RGB888格式
//返回值:无
void LTDC_Layer_Parameter_Config(u8 layerx,u32 bufaddr,u8 pixformat,u8 alpha,u8 alpha0,u8 bfac1,u8 bfac2,u32 bkcolor)
{
        LTDC_LayerCfgTypeDef pLayerCfg;
       
        pLayerCfg.WindowX0=0;                       //窗口起始X坐标
        pLayerCfg.WindowY0=0;                       //窗口起始Y坐标
        pLayerCfg.WindowX1=lcdltdc.pwidth;          //窗口终止X坐标
        pLayerCfg.WindowY1=lcdltdc.pheight;         //窗口终止Y坐标
        pLayerCfg.PixelFormat=pixformat;                    //像素格式
        pLayerCfg.Alpha=alpha;                                        //Alpha值设置,0~255,255为完全不透明
        pLayerCfg.Alpha0=alpha0;                                //默认Alpha值
        pLayerCfg.BlendingFactor1=(u32)bfac1<<8;    //设置层混合系数
        pLayerCfg.BlendingFactor2=(u32)bfac2<<8;        //设置层混合系数
        pLayerCfg.FBStartAdress=bufaddr;                //设置层颜 {MOD}帧缓存起始地址
        pLayerCfg.ImageWidth=lcdltdc.pwidth;        //设置颜 {MOD}帧缓冲区的宽度   
        pLayerCfg.ImageHeight=lcdltdc.pheight;      //设置颜 {MOD}帧缓冲区的高度
        pLayerCfg.Backcolor.Red=(u8)(bkcolor&0X00FF0000)>>16;   //背景颜 {MOD}红 {MOD}部分
        pLayerCfg.Backcolor.Green=(u8)(bkcolor&0X0000FF00)>>8;  //背景颜 {MOD}绿 {MOD}部分
        pLayerCfg.Backcolor.Blue=(u8)bkcolor&0X000000FF;        //背景颜 {MOD}蓝 {MOD}部分
        HAL_LTDC_ConfigLayer(<DC_Handler,&pLayerCfg,layerx);   //设置所选中的层
}  [/mw_shl_code]
在调试过程中,发现下面赋值会有问题
pLayerCfg.Backcolor.Red=(u8)(bkcolor&0X00FF0000)>>16; //背景颜 {MOD}红 {MOD}部分
pLayerCfg.Backcolor.Green=(u8)(bkcolor&0X0000FF00)>>8; //背景颜 {MOD}绿 {MOD}部分
pLayerCfg.Backcolor.Blue=(u8)bkcolor&0X000000FF; //背景颜 {MOD}蓝 {MOD}部分
如果传入bkcolor = 0X00FF0000,理论上应该是
pLayerCfg.Backcolor.Red=0xff;
pLayerCfg.Backcolor.Green=0x00;
pLayerCfg.Backcolor.Blue=0x00;
实际上为:
pLayerCfg.Backcolor.Red=0x00;
pLayerCfg.Backcolor.Green=0x00;
pLayerCfg.Backcolor.Blue=0x00;

我是在IAR上调试的,编译器是先进行(u8)(bkcolor&0X00FF0000)强转类型,然后再进行移位操作。
所以应该先移位,后转换类型才对:
pLayerCfg.Backcolor.Red=(u8) ((bkcolor&0X00FF0000)>>16); //背景颜 {MOD}红 {MOD}部分



0条回答

一周热门 更多>