OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4128|回复: 0

stm32f407综合实验,有好多疑问求解答

[复制链接]

13

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2021-5-7
在线时间
102 小时
发表于 2022-1-27 17:42:45 | 显示全部楼层 |阅读模式
1金钱
板子是stm32f407,看的是综合实验,目前只看了跟界面初始化相关的部分,有几个问题请教下
1.PICTURE/piclib.c的void ai_draw_init(void)
{
        float temp,temp1;          
        temp=(float)picinfo.S_Width/picinfo.ImgWidth;
        temp1=(float)picinfo.S_Height/picinfo.ImgHeight;                                                 
        if(temp<temp1)temp1=temp;//取较小的那个         
        if(temp1>1)temp1=1;          
        //使图片处于所给区域的中间
        picinfo.S_XOFF+=(picinfo.S_Width-temp1*picinfo.ImgWidth)/2;
        picinfo.S_YOFF+=(picinfo.S_Height-temp1*picinfo.ImgHeight)/2;
        temp1*=8192;//扩大8192倍         
        picinfo.Div_Fac=temp1;
        picinfo.staticx=0xffff;
        picinfo.staticy=0xffff;//放到一个不可能的值上面                                                                                                             
}   
if(temp1>1)temp1=1;        为什么图片不能被放大?即只能缩小或不变?
temp1*=8192;这句是什么意思?为什么要将系数放大?又为什么是8192倍不是其它倍数?有什么用?

2.PICTURE/bmp.c的91行realy=(y*picinfo.Div_Fac)>>13;把坐标移位的操作是什么意思?为什么要定义两种坐标?(x,y和realx,realy)

3.PICTURE/bmp.c的118行color=((u16)bmpbuf[count]&0X1F);//R    我简单地理解为是将数据取低5位代表红色,但119行color+=(((u16)bmpbuf[count])&0XE0)<<1; //G 我就蒙了,看了手册也找不到答案

4.APP/spb.c的spb_init(void)函数,268-272行   
        //指向EX SRAM LCD BUF  
        pic_phy.read_point=slcd_read_point;
        pic_phy.draw_point=slcd_draw_point;         
        pic_phy.fillcolor=slcd_fill_color;
        gui_phy.read_point=slcd_read_point;
        gui_phy.draw_point=slcd_draw_point;       
为什么要先把这些函数指针指向slcd_xxx函数,最后又重新指向LCD_xxx函数? 为了弄清楚我看了下slcd_draw_point函数的定义:
void slcd_draw_point(u16 x,u16 y,u16 color)
{         
      sramlcdbuf[y+x*spbdev.spbheight+spbdev.frame*spbdev.spbheight*spbdev.spbwidth]=color;
}
就是把颜色值存进一个buf里,可这个中括号里为什么是这么一大串?完全不懂。我还想知道哪里会用到这个buf,我就往下找,最终在主任务 main_task(void *pdata)的spb_load_mui();里的slcd_frame_show(spbdev.pos);里的slcd_dma_enable(x);里的DMA2_Stream0->PAR=(u32)(sramlcdbuf+x*spbdev.spbheight+dmatransfered);用到了这个buf,还有参数x,这个x就是spbdev.pos,这应该是底层了,知道跟DMA有关,DMA2_Stream0->PAR可能是个寄存器?把sramlcdbuf+x*spbdev.spbheight+dmatransfered赋给它,属实看不懂。然后就对比看了下LCD_Fast_DrawPoint函数      
void LCD_Fast_DrawPoint(u16 x,u16 y,u16 color)
{          
        if(lcddev.id==0X9341||lcddev.id==0X5310)
        {
                LCD_WR_REG(lcddev.setxcmd);
                LCD_WR_DATA(x>>8);LCD_WR_DATA(x&0XFF);                           
                LCD_WR_REG(lcddev.setycmd);
                LCD_WR_DATA(y>>8);LCD_WR_DATA(y&0XFF);                           
        }else if(lcddev.id==0X5510)
        {
                LCD_WR_REG(lcddev.setxcmd);LCD_WR_DATA(x>>8);  
                LCD_WR_REG(lcddev.setxcmd+1);LCD_WR_DATA(x&0XFF);          
                LCD_WR_REG(lcddev.setycmd);LCD_WR_DATA(y>>8);  
                LCD_WR_REG(lcddev.setycmd+1);LCD_WR_DATA(y&0XFF);
        }else if(lcddev.id==0X1963)
        {
                if(lcddev.dir==0)x=lcddev.width-1-x;
                LCD_WR_REG(lcddev.setxcmd);
                LCD_WR_DATA(x>>8);LCD_WR_DATA(x&0XFF);                
                LCD_WR_DATA(x>>8);LCD_WR_DATA(x&0XFF);                
                LCD_WR_REG(lcddev.setycmd);
                LCD_WR_DATA(y>>8);LCD_WR_DATA(y&0XFF);                
                LCD_WR_DATA(y>>8);LCD_WR_DATA(y&0XFF);                
        }else if(lcddev.id==0X6804)
        {                    
                if(lcddev.dir==1)x=lcddev.width-1-x;//横屏时处理
                LCD_WR_REG(lcddev.setxcmd);
                LCD_WR_DATA(x>>8);LCD_WR_DATA(x&0XFF);                         
                LCD_WR_REG(lcddev.setycmd);
                LCD_WR_DATA(y>>8);LCD_WR_DATA(y&0XFF);                
        }else
        {
                if(lcddev.dir==1)x=lcddev.width-1-x;//横屏其实就是调转x,y坐标
                LCD_WriteReg(lcddev.setxcmd,x);
                LCD_WriteReg(lcddev.setycmd,y);
        }                         
        LCD->LCD_REG=lcddev.wramcmd;
        LCD->LCD_RAM=color;
}        又是跟寄存器有关又懵逼了。

5.      结构体m_spb_dev  有两个东西 u16 pos;(上面提到过)    //当前帧的位置(x坐标) 我知道帧就是一幅图片(不准确),但还是看不懂这两个是干什么用的。
                                                      u8 frame;  //当前帧(0/1)

先就这样吧。。。之前也看了相关的文档,但由于自身水平有限无法解决,可能问的问题有点多且混乱,但的确考虑到自身需要,时间也很紧,还望各位大佬不吝赐教,万分感谢,叫我看什么资料也行,我再去好好看就是了。可能今后还会有问题希望大佬们能帮帮我谢谢。
                                          


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 03:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表