硬汉嵌入式论坛

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

[技术讨论] 407替换GD470 fsmc驱动屏幕异常

[复制链接]

9

主题

25

回帖

52

积分

初级会员

积分
52
发表于 2025-1-4 14:20:27 | 显示全部楼层 |阅读模式
本帖最后由 cv_master 于 2025-1-4 14:28 编辑

大佬们。请教个问题;stm32f407驱动屏幕是正常的,替换成GD后240M主频的话无法点亮屏幕,将AHB分频为120M才能点亮屏幕;逻辑分析仪捉波形发现在240M主频时wr写命令会和cs引脚在同一时刻拉高,如图1;而图2wr拉高后会保持一个周期后再拉高cs,请教这是什么原因
{
#define LCD_READ_DATA_SETTIME_NS 50*2
#define LCD_READ_ADDR_SETTIME_NS 10*2

#define LCD_WRITE_DATA_SETTIME_NS 15*2   // 15*2
#define LCD_WRITE_ADDR_SETTIME_NS 20*2     // 20*2

    uint32 ulAHB_CLK = 0;
    exmc_norsram_parameter_struct  SRAM_Handler;
    exmc_norsram_timing_parameter_struct TimingWrite;
    exmc_norsram_timing_parameter_struct TimingRead;
    static uint8 s_ucFsmcInitFlg = FALSE;
   
    if (TRUE == s_ucFsmcInitFlg)  //只初始化一次
    {
        return;
    }
    s_ucFsmcInitFlg = TRUE;
   
    rcu_periph_clock_enable(RCU_EXMC);            //使能FSMC时钟

    /*fsmc挂载在AHB下,如果AHB最大时钟为240M,导致cs,wr,rs时序不对;在system_clock_240m_25m_hxtal中将AHB分频一倍,120M */
    ulAHB_CLK = rcu_clock_freq_get(CK_AHB);
   
    SRAM_Handler.read_write_timing = &TimingRead;
    SRAM_Handler.write_timing = &TimingWrite;
    exmc_norsram_struct_para_init(&SRAM_Handler);
   
      /* 配置8080时序 */
    /* 1/240M主频 = 4.1ns  */   

      TimingWrite.asyn_address_setuptime      = LCD_WRITE_ADDR_SETTIME_NS/(float)(1000000000.0f/ulAHB_CLK);                           
      TimingWrite.asyn_address_holdtime       = 0;                        
      TimingWrite.asyn_data_setuptime         = LCD_WRITE_DATA_SETTIME_NS/(float)(1000000000.0f/ulAHB_CLK);                        
      TimingWrite.bus_latency                 = 1;
      TimingWrite.syn_clk_division               = 0;
      TimingWrite.syn_data_latency               = 0;
      TimingWrite.asyn_access_mode              = EXMC_ACCESS_MODE_A;   

   
    TimingRead.asyn_address_setuptime       = LCD_READ_ADDR_SETTIME_NS/(float)(1000000000.0f/ulAHB_CLK);                        
      TimingRead.asyn_address_holdtime        = 0;                        
      TimingRead.asyn_data_setuptime          = LCD_READ_DATA_SETTIME_NS/(float)(1000000000.0f/ulAHB_CLK);                       
      TimingRead.bus_latency                     = 1;
      TimingRead.syn_clk_division             = 0;
      TimingRead.syn_data_latency             = 0;
      TimingRead.asyn_access_mode             = EXMC_ACCESS_MODE_A;


    /* SRAM device configuration */  
      SRAM_Handler.norsram_region  = EXMC_BANK0_NORSRAM_REGION3;                  //使用NE4                              
    SRAM_Handler.address_data_mux = DISABLE;                                     //地址/数据线不复用
    SRAM_Handler.memory_type = EXMC_MEMORY_TYPE_NOR;                           //SRAM                    
    SRAM_Handler.databus_width = EXMC_NOR_DATABUS_WIDTH_8B;                     //8位数据宽度   
    SRAM_Handler.burst_mode = DISABLE;                                             //禁能突发访问
    SRAM_Handler.asyn_wait =  DISABLE;                                            //禁能使能同步传输模式下的等待信号
    SRAM_Handler.nwait_polarity = EXMC_NWAIT_POLARITY_LOW;
    SRAM_Handler.nwait_config = EXMC_NWAIT_CONFIG_BEFORE;
    SRAM_Handler.wrap_burst_mode = DISABLE;        
    SRAM_Handler.memory_write = ENABLE;                                            //存储器写使能                  
    SRAM_Handler.nwait_signal = DISABLE;                                        //禁能等待使能位               
    SRAM_Handler.extended_mode = ENABLE;                                        //禁能读写使用相同的时序        
    SRAM_Handler.write_mode = EXMC_ASYN_WRITE;


     
    exmc_norsram_init(&SRAM_Handler);
    exmc_norsram_enable(EXMC_BANK0_NORSRAM_REGION3);
}
修改主频为168M和stm32F407一样,也是无法点亮屏幕

图1:240M 主频波形

图1:240M 主频波形

土2:120M主频

土2:120M主频
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-1-6 01:09:27 | 显示全部楼层
没用过GD470 fsmc,看看有其他FSMC模式没,可以也测试效果看看。
回复

使用道具 举报

9

主题

25

回帖

52

积分

初级会员

积分
52
 楼主| 发表于 2025-1-6 09:59:32 | 显示全部楼层
eric2013 发表于 2025-1-6 01:09
没用过GD470 fsmc,看看有其他FSMC模式没,可以也测试效果看看。

其他模式是指异步访问模式吗?模式A~D都试过还是不行
回复

使用道具 举报

20

主题

50

回帖

110

积分

初级会员

积分
110
发表于 2025-1-6 17:08:11 | 显示全部楼层
配置局部变量初始化为零,或使用Deinit将值设为默认,应该可以;还有你这个是代码贴的有问题,还是啥;怎么先初始化,再配置时序?
回复

使用道具 举报

9

主题

25

回帖

52

积分

初级会员

积分
52
 楼主| 发表于 2025-1-13 08:56:36 | 显示全部楼层
Zachary唷 发表于 2025-1-6 17:08
配置局部变量初始化为零,或使用Deinit将值设为默认,应该可以;还有你这个是代码贴的有问题,还是啥;怎么 ...

先deinit也无效;先exmc_norsram_struct_para_init是官方的api,就是先把结构体的成员配置成默认值;问题是mcu在高主频时无法驱动fsmc显示屏幕,在120M才可以
回复

使用道具 举报

9

主题

25

回帖

52

积分

初级会员

积分
52
 楼主| 发表于 2025-1-16 16:31:30 | 显示全部楼层
已解决;cs引脚需要外部上拉电阻;软件上拉无效;在没有上拉电阻时回导致cs信号提前一个时钟周期,从而显示失败;目前测试发现上拉10k还是会偶然显示失败,由于该引脚只和屏幕通讯,配置为通用io,上电直接拉低
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-1-17 06:28:55 | 显示全部楼层
cv_master 发表于 2025-1-16 16:31
已解决;cs引脚需要外部上拉电阻;软件上拉无效;在没有上拉电阻时回导致cs信号提前一个时钟周期,从而显示 ...

谢谢告知最终原因。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-12 06:41 , Processed in 0.046173 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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