OpenEdv-开源电子网

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

我用CubeMX配置H750的FMC接口驱动ILI9341的显示屏,已经读到ID了,但是白屏。观察写数据的波形,发现一次写操作居然有4个NWE波形

[复制链接]

4

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2019-12-9
在线时间
40 小时
发表于 2019-12-18 21:51:44 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 jiyuehua1023 于 2019-12-18 22:44 编辑

我刚开始学STM32,感觉太复杂了,无从下手。幸好有CubeMX这个软件,可以直接生成外设框架的代码,别提有多爽了。
有天发现H750VB这个芯片功能强大,主频更是高到480M,而且价格很便宜。官方标价3.4美元,在淘宝上买25元包邮。

于是搞了块精简板,配了一块2.8寸的显示屏,屏幕驱动芯片是ILI9341。很常见的一个芯片,本以为会很容易就能点亮的。

我用原子哥的液晶程序移植到CubeMX生成的代码中,刚开始先读ID,读出来死活不正确。查了好久,后来发现在写入读取
ID命令0xD3后,要加一点延时才能正确读出9341这个ID值。原子哥经常说,读出ID值就成功了一半。可谁知后边却怎么折腾
都无法控制屏幕的显示了,一直白屏。我把每条读写指令都加了延时,把地址和数据建立时间都调到最大周期,仍然不行。

最后都想放弃了,但不想认输。于是沉下心来仔细研究读写时序的波形,这一看不打紧。发现在写时序的时候,每次写数据,
写信号电平都要跳4次。这样相当于在真正写入数据时,前面写入了3次0数据,那么屏幕当然不能正常显示了。
下面附上示波器观察的读写时序图和CubeMX配置出来的FMC及时钟参数,请各位高手们帮忙看看到底问题出在哪里,谢谢大家!





最佳答案

查看完整内容[请看2#楼]

今晚总算找到原因了,原来我没有使能MPU,H750驱动LCD时必须使能MPU才能正常显示。 帖子发重复了,不能删除吗?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2019-12-9
在线时间
40 小时
 楼主| 发表于 2019-12-18 21:51:45 | 显示全部楼层
本帖最后由 jiyuehua1023 于 2019-12-30 15:02 编辑

今晚总算找到原因了,原来我没有使能MPU,H750驱动LCD时必须使能MPU才能正常显示。
帖子发重复了,不能删除吗?
回复

使用道具 举报

4

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2019-12-9
在线时间
40 小时
 楼主| 发表于 2019-12-18 22:11:44 | 显示全部楼层

RE: 用H750的FMC接口驱动ILI9341的显示屏,已经读到ID了,但是白屏。观察写数据的波形,发现一次写操作居然有4个写操作电平!

本帖最后由 jiyuehua1023 于 2019-12-19 10:23 编辑

我的示波器有4个通道,我接的顺序是1-RS,2-RW,3-RD,4-D0
新建文件1.png
新建文件2.png
新建文件4.png
新建文件5.png
回复

使用道具 举报

4

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2019-12-9
在线时间
40 小时
 楼主| 发表于 2019-12-18 22:38:05 | 显示全部楼层
本帖最后由 jiyuehua1023 于 2019-12-18 22:50 编辑

这是CubeMX生成的FMC的参数配置:

/* FMC initialization function */
void MX_FMC_Init(void)
{
  FMC_NORSRAM_TimingTypeDef Timing = {0};

  /** Perform the SRAM1 memory initialization sequence
  */
  hsram1.Instance = FMC_NORSRAM_DEVICE;
  hsram1.Extended = FMC_NORSRAM_EXTENDED_DEVICE;
  /* hsram1.Init */
  hsram1.Init.NSBank = FMC_NORSRAM_BANK1;
  hsram1.Init.DataAddressMux = FMC_DATA_ADDRESS_MUX_DISABLE;
  hsram1.Init.MemoryType = FMC_MEMORY_TYPE_SRAM;
  hsram1.Init.MemoryDataWidth = FMC_NORSRAM_MEM_BUS_WIDTH_16;
  hsram1.Init.BurstAccessMode = FMC_BURST_ACCESS_MODE_DISABLE;
  hsram1.Init.WaitSignalPolarity = FMC_WAIT_SIGNAL_POLARITY_LOW;
  hsram1.Init.WaitSignalActive = FMC_WAIT_TIMING_BEFORE_WS;
  hsram1.Init.WriteOperation = FMC_WRITE_OPERATION_ENABLE;
  hsram1.Init.WaitSignal = FMC_WAIT_SIGNAL_DISABLE;
  hsram1.Init.ExtendedMode = FMC_EXTENDED_MODE_DISABLE;
  hsram1.Init.AsynchronousWait = FMC_ASYNCHRONOUS_WAIT_DISABLE;
  hsram1.Init.WriteBurst = FMC_WRITE_BURST_DISABLE;
  hsram1.Init.ContinuousClock = FMC_CONTINUOUS_CLOCK_SYNC_ONLY;
  hsram1.Init.WriteFifo = FMC_WRITE_FIFO_ENABLE;
  hsram1.Init.PageSize = FMC_PAGE_SIZE_NONE;
  /* Timing */
  Timing.AddressSetupTime = 15;
  Timing.AddressHoldTime = 15;
  Timing.DataSetupTime = 30;
  Timing.BusTurnAroundDuration = 15;
  Timing.CLKDivision = 16;
  Timing.DataLatency = 17;
  Timing.AccessMode = FMC_ACCESS_MODE_A;
  /* ExtTiming */

  if (HAL_SRAM_Init(&hsram1, &Timing, NULL) != HAL_OK)
  {
    Error_Handler( );
  }

}
这是LCD头文件中对指令和数据地址的定义:

//////////////////////////////////////////////////////////////////////////////////  
//LCD地址结构体
typedef struct
{
        vu16 LCD_REG;//0x6001FFFE右移一位后 A16是0
        vu16 LCD_RAM;//结构体地址自动增加,A16变为1
} LCD_TypeDef;
//使用NOR/SRAM的 Bank1.sector4,地址位HADDR[27,26]=00 A16作为数据命令区分线
//注意设置时STM32内部会右移一位对齐。将要操作的地址加上一个偏移量0x0001FFFE
//即A16:A0=1 1111 1111 1111 1110后,地址右移1位对齐,变成0x0000FFFF,此时如果
//地址再加1,A16即变为1,从而实现RS的“0”,“1”控制
#define LCD_BASE        ((u32)(0x60000000|0x0001FFFE))
#define LCD             ((LCD_TypeDef *) LCD_BASE)
//////////////////////////////////////////////////////////////////////////////////


这是LCD.C文件中的相关读写语句:

//写寄存器函数
//regval:寄存器值
void LCD_WR_REG(vu16 regval)
{   
        regval=regval;                //使用-O2优化的时候,必须插入的延时
        LCD->LCD_REG=regval;//写入要写的寄存器序号
}
//写LCD数据
//data:要写入的值
void LCD_WR_DATA(vu16 data)
{          
        data=data;                        //使用-O2优化的时候,必须插入的延时
        LCD->LCD_RAM=data;
}
//读LCD数据
//返回值:读到的值
u16 LCD_RD_DATA(void)
{
        vu16 ram;                                //防止被优化
        ram=LCD->LCD_RAM;       
        return ram;         
}       


//读取LCD的ID值
void LCD_ReadID()
{
        LCD_WR_REG(0XD3);
        HAL_Delay(1);//读ID命令,数据返回的比较慢,要延时等待
        lcddev.id=LCD_RD_DATA();                //dummy read
        lcddev.id=LCD_RD_DATA();                //读到0X00
  lcddev.id=LCD_RD_DATA();           //读取93
        lcddev.id<<=8;
        lcddev.id|=LCD_RD_DATA();          //读取41        
        printf("LCDID=0x%04X\r\n",lcddev.id);               
}


回复

使用道具 举报

4

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2019-12-9
在线时间
40 小时
 楼主| 发表于 2019-12-18 22:42:23 | 显示全部楼层
这是CubeMX的FMC配置和时钟配置,FMC的时钟和只设了4M,等调试好了再把速度提上去
微信截图_20191218224005.png
微信截图_20191218223909.png
回复

使用道具 举报

6

主题

412

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
2692
金钱
2692
注册时间
2019-8-14
在线时间
413 小时
发表于 2019-12-19 15:17:55 | 显示全部楼层
帮顶!!
回复

使用道具 举报

4

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2019-12-9
在线时间
40 小时
 楼主| 发表于 2019-12-19 17:17:26 | 显示全部楼层

多谢!
这个问题没有人遇到过吗?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2019-12-20 02:19:30 | 显示全部楼层
建议移植我们H750的例程试试
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2019-12-9
在线时间
40 小时
 楼主| 发表于 2019-12-20 16:55:39 | 显示全部楼层
本帖最后由 jiyuehua1023 于 2019-12-20 16:59 编辑
正点原子 发表于 2019-12-20 02:19
建议移植我们H750的例程试试

原子哥来捧场了。我只移植了与硬件无关的部分,没用。估计问题出在IO及FMC初始化的部分,不过从充分利用CubeMX的自动化功能来说,还是用它原生的配置代码方便些。
还有就是原子哥的代码,IO及FMC初始化的部分还是用库函数实现的,移值后提示有很多错误,我还不知道咋解决呢,汗一下。
今天我用IO口模拟FMC时序的方法编写了基本的驱动,现在可以正常显示了,不过刷屏速度很慢,终极方案还是要搞定FMC接口。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2019-12-21 02:18:10 | 显示全部楼层
jiyuehua1023 发表于 2019-12-20 16:55
原子哥来捧场了。我只移植了与硬件无关的部分,没用。估计问题出在IO及FMC初始化的部分,不过从充分利用C ...

我们H750都是用的HAL库了,Cube也是生成hal库代码而已,不冲突
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2019-12-21 02:18:26 | 显示全部楼层
jiyuehua1023 发表于 2019-12-20 16:55
原子哥来捧场了。我只移植了与硬件无关的部分,没用。估计问题出在IO及FMC初始化的部分,不过从充分利用C ...

IO模拟都成功了,说明肯定是FMC配置问题了
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2019-12-9
在线时间
40 小时
 楼主| 发表于 2019-12-21 10:46:51 | 显示全部楼层
本帖最后由 jiyuehua1023 于 2019-12-21 10:55 编辑
正点原子 发表于 2019-12-21 02:18
我们H750都是用的HAL库了,Cube也是生成hal库代码而已,不冲突

哦,那我再耐心移植一下试试。我就是一发现满屏错误提示,就不知如何下手了,以为和HAL不兼容。
不过原子哥的程序FMC初始化部分应该不是由CubeMX直接生成的吧?我的直接生成的这部分代码在单独的fmc.c文件里。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2019-12-22 00:08:27 | 显示全部楼层
jiyuehua1023 发表于 2019-12-21 10:46
哦,那我再耐心移植一下试试。我就是一发现满屏错误提示,就不知如何下手了,以为和HAL不兼容。
不过原 ...

不是,是我们自己写的
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2019-12-9
在线时间
40 小时
 楼主| 发表于 2019-12-28 22:52:20 | 显示全部楼层
今晚总算找到原因了,原来我没有使能MPU,H750驱动LCD时必须使能MPU才能正常显示。
回复

使用道具 举报

17

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
394
金钱
394
注册时间
2015-1-7
在线时间
101 小时
发表于 2020-4-4 14:30:07 | 显示全部楼层
jiyuehua1023 发表于 2019-12-28 22:53
今晚总算找到原因了,原来我没有使能MPU,H750驱动LCD时必须使能MPU才能正常显示。
帖子发重复了,不能删 ...

MPU要怎么使能呢  能不能发给程序看看啊
https://shop72315368.taobao.com
承接软硬件项目开发
微信搜索 “嵌入式技术开发”,关注我的公众号
回复

使用道具 举报

4

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2019-12-9
在线时间
40 小时
 楼主| 发表于 2020-4-15 15:15:41 | 显示全部楼层
zhang062061 发表于 2020-4-4 14:30
MPU要怎么使能呢  能不能发给程序看看啊

file:///C:/Users/Administrator/Desktop/微信截图_20200415151103.png

这个不需要自己写程序,只需要在CubeMX里边配置好MPU就可以了。MPU的配置可以参考各开发板的资料,我自己其实理解的也不深。
回复

使用道具 举报

4

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2019-12-9
在线时间
40 小时
 楼主| 发表于 2020-4-15 15:17:46 | 显示全部楼层
jiyuehua1023 发表于 2020-4-15 15:15
这个不需要自己写程序,只需要在CubeMX里边配置好MPU就可以了。MPU的配置可以参考各开发板的资料,我 ...

今天发现无法上传图片了,原子哥论坛这个上传图片功能太难用了,能否改进一下?
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2019-9-3
在线时间
1 小时
发表于 2021-2-8 20:12:45 | 显示全部楼层
11111
回复

使用道具 举报

9

主题

91

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1849
金钱
1849
注册时间
2019-3-8
在线时间
324 小时
发表于 2021-2-22 11:25:13 | 显示全部楼层
你好能发一下程序嘛xudongqiang987@126.com  谢谢
回复

使用道具 举报

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2021-5-5
在线时间
33 小时
发表于 2022-4-27 23:24:47 | 显示全部楼层
非常感谢博主,确实是这个问题
回复

使用道具 举报

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2021-5-5
在线时间
33 小时
发表于 2022-4-27 23:27:27 | 显示全部楼层
感谢博主
回复

使用道具 举报

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2021-5-5
在线时间
33 小时
发表于 2022-4-27 23:28:06 | 显示全部楼层
我配置stm32f103zet6时就不用mpu
回复

使用道具 举报

2

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2022-8-22
在线时间
30 小时
发表于 2022-9-21 20:42:15 | 显示全部楼层
感谢博主
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 04:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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