硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3585|回复: 9
收起左侧

[FMC] STM32H743 FMC控制屏幕异常

[复制链接]

14

主题

207

回帖

254

积分

高级会员

积分
254
发表于 2020-5-22 17:52:03 | 显示全部楼层 |阅读模式
基本情况:
1.屏幕驱动为SSD1961芯片,在另一项目中使用STM32F1 FSMC控制正常,现使用STM32H743核心板FMC进行控制,屏幕无显示、无法正确读出ID。
2.硬件部分,STM32H743与STM32F1引脚选用保持功能一致,即PD7/FSMC_NE1、PD11/FSMC_A16、PD4/FSMC_NOE、PD5/FSMC_NWE、D0~D15。(#define LCD_BASE        ((uint32_t)(0x60000000 | 0x0001FFFE)))
3.软件部分,STM32H743在STM32F1控制基础上,添加保留位复位值处理、使能FMC处理以及时序倍增处理。仿真对比STM32H743与STM32F1各自FMC寄存器,配置值未发现异常。
相关信息:
①MPU配置       
  1. /* 配置FMC驱动屏幕的MPU属性为Device或者Strongly Ordered */
  2.         MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
  3.         MPU_InitStruct.BaseAddress      = LCD_BASE;
  4.         MPU_InitStruct.Size             = MPU_REGION_SIZE_64MB;
  5.         MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  6.         MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;
  7.         MPU_InitStruct.IsCacheable      = MPU_ACCESS_NOT_CACHEABLE;
  8.         MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
  9.         MPU_InitStruct.Number           = MPU_REGION_NUMBER3;
  10.         MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;
  11.         MPU_InitStruct.SubRegionDisable = 0x00;
  12.         MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;
  13.         HAL_MPU_ConfigRegion(&MPU_InitStruct);
复制代码


②尝试使用FMC库函数配置
       
  1. SRAM_HandleTypeDef hsram = {0};
  2.         FMC_NORSRAM_TimingTypeDef SRAM_Timing = {0};
  3.                
  4.         hsram.Instance  = FMC_NORSRAM_DEVICE;
  5.         hsram.Extended  = FMC_NORSRAM_EXTENDED_DEVICE;

  6.     /* FMC使用的HCLK3,主频200MHz,1个FMC时钟周期就是5ns */
  7.         /* SRAM 总线时序配置 4-1-2-1-2-2 不稳定,5-2-2-1-2-2 稳定 */  
  8.         SRAM_Timing.AddressSetupTime       = 12;  /* 5*5ns=25ns,地址建立时间,范围0 -15个FMC时钟周期个数 */
  9.                 SRAM_Timing.AddressHoldTime        = 2*7;  /* 地址保持时间,配置为模式A时,用不到此参数 范围1 -15个时钟周期个数 */
  10.         SRAM_Timing.DataSetupTime          = 32;  /* 2*5ns=10ns,数据保持时间,范围1 -255个时钟周期个数 */
  11.         SRAM_Timing.BusTurnAroundDuration  = 1*15;  /* 此配置用不到这个参数 */
  12.         SRAM_Timing.CLKDivision            = 5;  /* 此配置用不到这个参数 */
  13.         SRAM_Timing.DataLatency            = 5;  /* 此配置用不到这个参数 */
  14.         SRAM_Timing.AccessMode             = FMC_ACCESS_MODE_A; /* 配置为模式A */

  15.         hsram.Init.NSBank             = FMC_NORSRAM_BANK1;              /* 使用的BANK1,即使用的片选FMC_NE1 */
  16.                 hsram.Init.DataAddressMux     = FMC_DATA_ADDRESS_MUX_DISABLE;   /* 禁止地址数据复用 */
  17.         hsram.Init.MemoryType         = FMC_MEMORY_TYPE_SRAM;           /* 存储器类型SRAM */
  18.         hsram.Init.MemoryDataWidth    = FMC_NORSRAM_MEM_BUS_WIDTH_16;        /* 32位总线宽度 */
  19.                 hsram.Init.BurstAccessMode    = FMC_BURST_ACCESS_MODE_DISABLE;  /* 关闭突发模式 */
  20.                 hsram.Init.WaitSignalPolarity = FMC_WAIT_SIGNAL_POLARITY_LOW;   /* 用于设置等待信号的极性,关闭突发模式,此参数无效 */
  21.                 hsram.Init.WaitSignalActive   = FMC_WAIT_TIMING_BEFORE_WS;      /* 关闭突发模式,此参数无效 */
  22.         hsram.Init.WriteOperation     = FMC_WRITE_OPERATION_ENABLE;     /* 用于使能或者禁止写保护 */
  23.                 hsram.Init.WaitSignal         = FMC_WAIT_SIGNAL_DISABLE;        /* 关闭突发模式,此参数无效 */
  24.         hsram.Init.ExtendedMode       = FMC_EXTENDED_MODE_ENABLE;//FMC_EXTENDED_MODE_DISABLE;      /* 禁止扩展模式 */
  25.                 hsram.Init.AsynchronousWait   = FMC_ASYNCHRONOUS_WAIT_DISABLE;  /* 用于异步传输期间,使能或者禁止等待信号,这里选择关闭 */
  26.                 hsram.Init.WriteBurst         = FMC_WRITE_BURST_DISABLE;        /* 禁止写突发 */
  27.                 hsram.Init.ContinuousClock    = FMC_CONTINUOUS_CLOCK_SYNC_ONLY; /* 仅同步模式才做时钟输出 */
  28.                 hsram.Init.WriteFifo          = FMC_WRITE_FIFO_ENABLE;          /* 使能写FIFO */

  29.         /* 初始化SRAM控制器 */
  30.         if (HAL_SRAM_Init(&hsram, &SRAM_Timing, &SRAM_Timing) != HAL_OK)
  31.         {
  32.                 /* 初始化错误 */
  33.                 Error_Handler(__FILE__, __LINE__);
  34.         }
复制代码


尝试使用FMC寄存器配置
  1. //寄存器清零
  2.         //bank1有NE1~4,每一个有一个BCR+BTR,所以总共八个寄存器。这里我们使用NE1 ,也就对应BTCR[0],[1]。
  3.         FMC_Bank1->BTCR[0]=0X00000000 | (0X01<<7);                //保持复位值
  4.         FMC_Bank1->BTCR[1]=0X00000000;
  5.         FMC_Bank1E->BWTR[0]=0X00000000 | (0xff<<20);
  6.         //BCR寄存器        使用异步模式
  7.         FMC_Bank1->BTCR[0]|=1<<12;                //存储器写使能
  8.         FMC_Bank1->BTCR[0]|=1<<14;                //读写使用不同的时序
  9.         FMC_Bank1->BTCR[0]|=1<<4;                 //存储器数据宽度为16bit
  10.         //BTR寄存器,读时序控制寄存器
  11.         FMC_Bank1->BTCR[1]|=0<<28;                //模式A
  12.         FMC_Bank1->BTCR[1]|=12<<0;                 //地址建立时间(ADDSET)为2个HCLK 1/36M=27ns(实际>200ns)                5        [3:0]--0~15Xfmc_ker_ck
  13.         FMC_Bank1->BTCR[1]|=32<<8;          //数据保存时间为16个HCLK                                                                                  5        [15:8]--1~255Xfmc_ker_ck
  14.        
  15.         //BWTR寄存器,写时序控制寄存器
  16.         FMC_Bank1E->BWTR[0]|=0<<28;         //模式A
  17.         FMC_Bank1E->BWTR[0]|=12<<0;                //地址建立时间(ADDSET)为1个HCLK                                                                 5
  18.         FMC_Bank1E->BWTR[0]|=32<<8;         //数据保存时间为4个HCLK                                                                                        5

  19.         FMC_Bank1->BTCR[0]|=1<<0;                //使能BANK1
  20.         FMC_Bank1->BTCR[0]|=0x1U<<31;        //使能FMC
复制代码


③STM32F1正常驱动线序图(Channel0--FSMC_NE1  Channel1--FSMC_A16  Channel2--FSMC_NOE  Channel3--FSMC_NWE  Channel4--D0  Channel5--D1  Channe6--D2  Channel7--D3)

STM32H743驱动线序图(线序含义同上)


现在没有进一步测试的思路了,还望各位指导~
STM32F1正常驱动屏幕时序.png
STM32H743未成功驱动屏幕时序.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2020-5-22 22:41:38 | 显示全部楼层

回帖奖励 +1 个金币

你的地址有点问题。
NE1配FSMC_A16,且使用的16位宽度,那么应该是:
0x60000000
0x60000000 | (1 << (16+1))
这两个,一个命令地址,一个数据地址。

你的MPU配置那里直接写0x60000000即可。

评分

参与人数 1金币 +20 收起 理由
wangertan + 20 赞一个!

查看全部评分

回复

使用道具 举报

14

主题

207

回帖

254

积分

高级会员

积分
254
 楼主| 发表于 2020-5-25 11:17:16 | 显示全部楼层
eric2013 发表于 2020-5-22 22:41
你的地址有点问题。
NE1配FSMC_A16,且使用的16位宽度,那么应该是:
0x60000000

硬汉兄,应该不是这里的问题,这个我楼主层中没说明清楚,也是借鉴的处理方式,并且在F103中使用正常,即如下注释掉的处理方式
  1. //////////////////////////////////////////////////////////////////////////////////         
  2. //-----------------LCD端口定义----------------
  3. //typedef struct
  4. //{
  5. //        __IO uint16_t LCD_REG;
  6. //        __IO uint16_t LCD_RAM;
  7. //} LCD_TypeDef;                        //LCD地址结构体
  8. ////使用NOR/SRAM的 Bank1.sector1,地址位HADDR[27,26]=00 A16作为数据命令区分线
  9. ////注意设置时STM32内部会右移一位对其!
  10. //#define LCD_BASE        ((uint32_t)(0x60000000 | 0x0001FFFE))
  11. //#define LCD             ((LCD_TypeDef *) LCD_BASE)

  12. #define LCD_BANK_BASE        0X60000000

  13. #define LCD_REG                        *(uint32_t *)0x60000000
  14. #define LCD_RAM                        *(uint32_t *)(0X60000000 | (1 << (16 + 1)))
  15. //////////////////////////////////////////////////////////////////////////////////
复制代码

进一步测试发现,屏幕的控制引脚与信号引脚存在很多10ms脉冲,屏蔽掉10ms按键检测后消失了,查看电路板,按键检测所用引脚与屏幕各引脚分别位于电路板上、下层成90°布线,按键测试工作正常,现在有点怀疑电路板是不是有问题。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2020-5-25 15:46:53 | 显示全部楼层

回帖奖励 +1 个金币

龙之谷 发表于 2020-5-25 11:17
硬汉兄,应该不是这里的问题,这个我楼主层中没说明清楚,也是借鉴的处理方式,并且在F103中使用正常,即 ...

这样的话,还真有可能硬件有问题。
回复

使用道具 举报

14

主题

207

回帖

254

积分

高级会员

积分
254
 楼主| 发表于 2020-6-30 14:28:46 | 显示全部楼层
eric2013 发表于 2020-5-25 15:46
这样的话,还真有可能硬件有问题。

感谢硬汉兄指导,换厂家做电路板后测试,屏幕驱动正常。
结帖。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2020-6-30 16:02:14 | 显示全部楼层

回帖奖励 +1 个金币

龙之谷 发表于 2020-6-30 14:28
感谢硬汉兄指导,换厂家做电路板后测试,屏幕驱动正常。
结帖。

谢谢,跟这个帖子是一个吧:

电路板BTB座区域异常
http://www.armbbs.cn/forum.php?mod=viewthread&tid=98300
回复

使用道具 举报

14

主题

207

回帖

254

积分

高级会员

积分
254
 楼主| 发表于 2020-6-30 18:40:19 | 显示全部楼层
eric2013 发表于 2020-6-30 16:02
谢谢,跟这个帖子是一个吧:

电路板BTB座区域异常

是一个板子,从根上找到问题并解决后,各个症状都顺带解决了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2020-7-1 09:37:21 | 显示全部楼层

回帖奖励 +1 个金币

龙之谷 发表于 2020-6-30 18:40
是一个板子,从根上找到问题并解决后,各个症状都顺带解决了

回复

使用道具 举报

2

主题

24

回帖

30

积分

新手上路

积分
30
发表于 2020-7-5 22:23:26 | 显示全部楼层
楼主您的意思是按键和屏幕引脚某种情况下短路了?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2020-7-5 22:25:57 | 显示全部楼层

回帖奖励 +1 个金币

wx_BwfeP1fz 发表于 2020-7-5 22:23
楼主您的意思是按键和屏幕引脚某种情况下短路了?

他的问题原因是这个:

电路板BTB座区域异常
http://www.armbbs.cn/forum.php?mod=viewthread&tid=98300
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-14 17:24 , Processed in 0.315055 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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