完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
一、点亮lcd
首先在cube配置FSMC STM32的 FSMC外设可以用于控制扩展的外部存储器,而 MCU 对液晶屏的操作实际上就是把显示数据写入到显存中,与控制存储器非常类似,且 8080接口的通讯时序完全可以使用 FSMC外设产生,因而非常适合使用 FSMC控制液晶屏。控制 LCD 时使用的是与 NORFLASH一样的模式 B。 Address setup time in HCLK clock cycles Data setup time in HCLK clock cycles 这俩成员设置地址和数据建立时间,它表示多少个 HCLK周期数,按我的配置,HCLK的时钟频率为168MHz,即一个 HCLK周期为 1/168微秒。这里我查了手册地址和数据建立时间最短为10ns,所以填2最合适。 接下来修改lcd.c中地址线的定义,因为我硬件上LCD的DC(寄存器/数据选择)脚接在FSMC_A16地址线,所以cube配置LCD Register Select时候选择A16,要使 FSMC_A16 地址线为高电平,实质是输出地址信号的第 16位为 1 即可,要使 FSMC_A16 地址线为低电平,实质是输出地址信号的第 16位为 0 即可,但是,以上方法计算的地址还不完全正确,STM32 内部访问地址时使用的是内部 HADDR 总线,它是需要转换到外部存储器的内部 AHB 地址线,它是字节地址(8 位), 而存储器访问不都是按字节访问,因此接到存储器的地址线依存储器的数据宽度有所不同,在本工程中使用的是 16位的数据访问方式,所以HADDR 与 FSMC_A的地址线连接关系会左移一位。 二、触摸屏底层 1.初始化 代码如下: u8 FT6236_Init(void) { u8 temp[2]; HAL_Delay (500); temp[0]=0; FT6236_WR_Reg(FT_DEVIDE_MODE,temp,1); //进入正常操作模式 FT6236_WR_Reg(FT_ID_G_MODE,temp,1); //查询模式 temp[0]=22; //触摸有效值,22,越小越灵敏 FT6236_WR_Reg(FT_ID_G_THGROUP,temp,1); //设置触摸有效值 temp[0]=12; //激活周期,不能小于12,最大14 FT6236_WR_Reg(FT_ID_G_PERIODACTIVE,temp,1); //读取版本号,参考值:0x3003 FT6236_RD_Reg(FT_ID_G_LIB_VERSION,temp,2); // if(temp[0]==0X30&&temp[1]==0X03)//版本:0X3003 // { printf("CTP ID:%xrn",((u16)temp[0]<<8)+temp[1]); return 0; // } } 2.读入数据 代码如下(示例): //扫描触摸屏(采用查询方式) //mode:0,正常扫描. //返回值:当前触屏状态. //0,触屏无触摸;1,触屏有触摸 u8 FT6236_Scan(u8 mode) { u8 buf[4]; u8 i=0; u8 res=0; u8 temp; static u8 t=0;//控制查询间隔,从而降低CPU占用率 t++; // if((t%10)==0||t<10)//空闲时,每进入10次CTP_Scan函数才检测1次,从而节省CPU使用率 // { FT6236_RD_Reg(FT_REG_NUM_FINGER,&mode,1);//读取触摸点的状态 if((mode&0XF)&&((mode&0XF)<6)) { temp=0XFF<<(mode&0XF);//将点的个数转换为1的位数,匹配tp_dev.sta定义 tp_dev.sta=(~temp)|TP_PRES_DOWN|TP_CATH_PRES; for(i=0;i<5;i++) { if(tp_dev.sta&(1< { FT6236_RD_Reg(FT6236_TPX_TBL,buf,4); //读取XY坐标值 tp_dev.x=319-(((u16)(buf[0]&0X0F)<<8)+buf[1]); tp_dev.y=479-(((u16)(buf[2]&0X0F)<<8)+buf[3]); if((buf[0]&0XF0)!=0X80)tp_dev.x=tp_dev.y=0;//必须是contact事件,才认为有效 } } res=1; if(tp_dev.x[0]==0 && tp_dev.y[0]==0)mode=0; //读到的数据都是0,则忽略此次数据 t=0; //触发一次,则会最少连续监测10次,从而提高命中率 // } } if((mode&0X1F)==0)//无触摸点按下 { if(tp_dev.sta&TP_PRES_DOWN) //之前是被按下的 { tp_dev.sta&=~(1<<7); //标记按键松开 }else //之前就没有被按下 { tp_dev.x[0]=0xffff; tp_dev.y[0]=0xffff; tp_dev.sta&=0XE0; //清除点有效标记 } } if(t>240)t=10;//重新从10开始计数 return res; } 要移植到lvgl所以注释了节省CPU使用率的代码,因为lvgl本身不会一直读取触摸屏状态。 |
|
|
|
只有小组成员才能发言,加入小组>>
imx6ull 和 lan8742 工作起来不正常, ping 老是丢包
2780 浏览 0 评论
3351 浏览 9 评论
3030 浏览 16 评论
3525 浏览 1 评论
9131 浏览 16 评论
1258浏览 3评论
647浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
638浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2386浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1950浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-2-2 13:22 , Processed in 1.053014 second(s), Total 76, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号