OpenEdv-开源电子网

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

fsmc驱动lcd ,我到底错在哪里?

[复制链接]

1

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
191
金钱
191
注册时间
2019-5-5
在线时间
49 小时
发表于 2020-3-21 23:39:02 | 显示全部楼层 |阅读模式
1金钱
        近来要用一块407zgt6板子实现照相机功能,这块板子称为a板,a板自带9341的屏幕。手里有正点原子的407zgt6核心板,屏幕也是9341.问题来了,因为正点原子的板子RS接A6,a板的接A0,所以信心满满的把正点原子照相机例程的#define LCD_BASE        ((uint32_t)(0x6C000000|0x0000007e))改为#define LCD_BASE        ((uint32_t)(0x6C000000)),烧进去一调试发现屏幕id都读不出来,一直是0.这就开始开始折腾了,试着把address setup和hold date setup都改大还是不行。研究了两天也没有结果。于是又想到用stm32cube来配置一下试试。在生成的工程中添加#define LCD_BASE        ((uint32_t)(0x6C000000))  等语句,下载到a板调试还是读id失败。于是在程序中把LCD_BASE 改为#define LCD_BASE        ((uint32_t)(0x6C000000|0x0000007e)),下载到正点原子的407核心板上实验结果也是读id失败。id读出来0xff。接下来就不知道怎么回事了,百度了好久没有收获。看到一个帖子说要开mpu,什么保护单元,要不然定义的外部地址不会生效,可是在stm32cube中找不到可以设置的地方,于是将整点的例程打开,把程序停在读id的地方,打开keil的peripherals,选择core peripherals下边的memory protect unit(MPU),把当前的状态截图。然后在打开cube生成的程序,同样停在读id的位置,再打开mpu对比发现两个程序状态是完全一样的,看来不是这里的问题。这就郁闷了。笨方法,两个程序停在读id的地方,然后在keil中观察fsmc的各个寄存器是否一致。此时发现BTBR4的值不同,很兴奋,觉得找到为题所在了,结果却很打脸,这个寄存器中,数值不同1是因为,cube中配置是我用的address setup      holdtime     date setup是cube默认的最大值,我的想法是数值大一点,读取速度慢一点,获取兼容性更好一点,等以后可以正常使用了在优化。还有就是原子的例程中        FSMC_ReadWriteTim.CLKDivision=0;        FSMC_ReadWriteTim.DataLatency=0;        FSMC_ReadWriteTim.BusTurnAroundDuration=0;这三相因为没有用到所以没有赋值,而cube默认的最大值。于是我首先在调试中,在读id位置停下程序,然后把BTBR4的值改为和原子的一样,再读id还是不对。然后不死心的把原子的没有初始化的变量重新赋值,发现还是可以正常使用,然后把cube例程改为和原子的一样还是不能读id。到这里我已经没招可用了。心灰意冷中还把两个程序中液晶用到的fsmc的引脚一个一个对照了一遍,配置完全一样,但是就是读id为0xff。又在本论坛发现读id之前有的程序加上一句LCD_WriteReg(0x0000,0x0001);我加上后还是失败,不过id变成读出来就是0xd3d3.主要部分程序如下,看看那位大神来指导一下
typedef struct
{
        volatile uint16_t LCD_REG;
        volatile uint16_t LCD_RAM;
} LCD_TypeDef;                            
#define LCD_BASE        ((uint32_t)(0x6C000000|0x0000007e))
#define LCD             ((LCD_TypeDef *) LCD_BASE)
void LCD_WR_REG(volatile uint16_t regval)
{   
        regval=regval;               
        LCD->LCD_REG=regval;         
}

void LCD_WR_DATA(volatile uint16_t data)
{          
        data=data;                        //ê1óÃ-O2óÅ»ˉμÄê±oò,±ØDë2åèëμÄÑóê±
        LCD->LCD_RAM=data;                 
}

uint16_t LCD_RD_DATA(void)
{
        volatile uint16_t ram;                        //·àÖ1±»óÅ»ˉ
        ram=LCD->LCD_RAM;       
        return ram;         
}       

以上代码从原子代码中复制过来的没有改动
/* FSMC initialization function */
static void MX_FSMC_Init(void)
{
  FSMC_NORSRAM_TimingTypeDef Timing;
  FSMC_NORSRAM_TimingTypeDef ExtTiming;

  /** Perform the SRAM4 memory initialization sequence
  */
  hsram4.Instance = FSMC_NORSRAM_DEVICE;
  hsram4.Extended = FSMC_NORSRAM_EXTENDED_DEVICE;
  /* hsram4.Init */
        hsram4.Init.NSBank = FSMC_NORSRAM_BANK4;
        hsram4.Init.DataAddressMux = FSMC_DATA_ADDRESS_MUX_DISABLE;
        hsram4.Init.MemoryType = FSMC_MEMORY_TYPE_SRAM;
        hsram4.Init.MemoryDataWidth = FSMC_NORSRAM_MEM_BUS_WIDTH_16;
        hsram4.Init.BurstAccessMode = FSMC_BURST_ACCESS_MODE_DISABLE;
        hsram4.Init.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW;
        hsram4.Init.WrapMode = FSMC_WRAP_MODE_DISABLE;
        hsram4.Init.WaitSignalActive = FSMC_WAIT_TIMING_BEFORE_WS;
        hsram4.Init.WriteOperation = FSMC_WRITE_OPERATION_ENABLE;
        hsram4.Init.WaitSignal = FSMC_WAIT_SIGNAL_DISABLE;
        hsram4.Init.ExtendedMode = FSMC_EXTENDED_MODE_ENABLE;
        hsram4.Init.AsynchronousWait = FSMC_ASYNCHRONOUS_WAIT_DISABLE;
        hsram4.Init.WriteBurst = FSMC_WRITE_BURST_DISABLE;
        hsram4.Init.PageSize = FSMC_PAGE_SIZE_NONE;
  /* Timing */
  Timing.AddressSetupTime =15;
  Timing.AddressHoldTime = 0;
  Timing.DataSetupTime = 60;
  Timing.BusTurnAroundDuration =0;// 15;
  Timing.CLKDivision = 0;//16;
  Timing.DataLatency = 0;//17;
  Timing.AccessMode = FSMC_ACCESS_MODE_A;
  /* ExtTiming */
  ExtTiming.AddressSetupTime = 9;//15;
  ExtTiming.AddressHoldTime = 0;
  ExtTiming.DataSetupTime = 8;//255;
  ExtTiming.BusTurnAroundDuration = 0;
  ExtTiming.CLKDivision = 0;//16;
  ExtTiming.DataLatency = 0;//17;
  ExtTiming.AccessMode = FSMC_ACCESS_MODE_A;

  if (HAL_SRAM_Init(&hsram4, &Timing, &ExtTiming) != HAL_OK)
  {
    Error_Handler( );
  }

}、这是cube生成的fsmc初始化,俩便有些参数做过调整实验,也没有效果。


static void HAL_FSMC_MspInit(void){
  /* USER CODE BEGIN FSMC_MspInit 0 */

  /* USER CODE END FSMC_MspInit 0 */
  GPIO_InitTypeDef GPIO_InitStruct;
  if (FSMC_Initialized) {
    return;
  }
  FSMC_Initialized = 1;
  /* Peripheral clock enable */
  __HAL_RCC_FSMC_CLK_ENABLE();

  /** FSMC GPIO Configuration  
  PF0   ------> FSMC_A0
  PE7   ------> FSMC_D4
  PE8   ------> FSMC_D5
  PE9   ------> FSMC_D6
  PE10   ------> FSMC_D7
  PE11   ------> FSMC_D8
  PE12   ------> FSMC_D9
  PE13   ------> FSMC_D10
  PE14   ------> FSMC_D11
  PE15   ------> FSMC_D12
  PD8   ------> FSMC_D13
  PD9   ------> FSMC_D14
  PD10   ------> FSMC_D15
  PD14   ------> FSMC_D0
  PD15   ------> FSMC_D1
  PD0   ------> FSMC_D2
  PD1   ------> FSMC_D3
  PD4   ------> FSMC_NOE
  PD5   ------> FSMC_NWE
  PG12   ------> FSMC_NE4
  */
  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_12;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.Alternate = GPIO_AF12_FSMC;
  HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);

  GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10
                          |GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14
                          |GPIO_PIN_15;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.Alternate = GPIO_AF12_FSMC;
  HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

  GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_14
                          |GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4
                          |GPIO_PIN_5;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.Alternate = GPIO_AF12_FSMC;
  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

  GPIO_InitStruct.Pin = GPIO_PIN_12;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.Alternate = GPIO_AF12_FSMC;
  HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);

  /* USER CODE BEGIN FSMC_MspInit 1 */

  /* USER CODE END FSMC_MspInit 1 */
}这是fsmc的io初始化,我在里边把A0 A6都使能位地址线了。


现在已经没有思路往下进行了,fsmc的io,fsmc的配置寄存器已经和正点原子例程中完全相同了,就是读不出来id,各位帮忙看看吧,感激不尽!
无标题10.png

最佳答案

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

嗯,现在可以显示了,A板也是同样的错误,把fsmc其他bank的NE引脚赋值为高电平就可以正常读取了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
191
金钱
191
注册时间
2019-5-5
在线时间
49 小时
 楼主| 发表于 2020-3-21 23:39:03 来自手机 | 显示全部楼层
嗯,现在可以显示了,A板也是同样的错误,把fsmc其他bank的NE引脚赋值为高电平就可以正常读取了
回复

使用道具 举报

1

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
191
金钱
191
注册时间
2019-5-5
在线时间
49 小时
 楼主| 发表于 2020-3-22 19:25:16 来自手机 | 显示全部楼层
审核还没有通过吗?
回复

使用道具 举报

1

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
191
金钱
191
注册时间
2019-5-5
在线时间
49 小时
 楼主| 发表于 2020-3-22 22:44:51 来自手机 | 显示全部楼层
哪位用stm32cube做过fsmc的LCD驱动,请抽空看一下本帖,知道一下,万分感谢!
回复

使用道具 举报

1

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
191
金钱
191
注册时间
2019-5-5
在线时间
49 小时
 楼主| 发表于 2020-3-23 17:22:07 来自手机 | 显示全部楼层
大佬都忙着呢?捧个场也行啊。。。。。。
回复

使用道具 举报

1

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
191
金钱
191
注册时间
2019-5-5
在线时间
49 小时
 楼主| 发表于 2020-3-23 23:40:10 来自手机 | 显示全部楼层
问题解决了,最初为了防止ME1到3的干扰就想要屏蔽这三个引脚,结果鬼使神差的把这三个引脚都值为低电平了,所以读取ID失败,改过来就好了
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2020-3-24 00:40:21 | 显示全部楼层
自己做的板子吧? 先把ID读取成功了再说。
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2020-8-6
在线时间
5 小时
发表于 2020-8-6 15:49:45 | 显示全部楼层
正点原子 发表于 2020-3-24 00:40
自己做的板子吧? 先把ID读取成功了再说。

你好,我现在也再用ST32F407ZGT6 的FSMC驱动LCD,问题和你的一样,也是读不到LCD的ID。ZGT6只有一个 bank 呀!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-4-30 18:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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