硬汉嵌入式论坛

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

[FMC] STM32H750调试FMC控制LCD出现诡异现象

[复制链接]

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2021-3-10 12:54:45 | 显示全部楼层 |阅读模式
本帖最后由 boom 于 2021-3-10 12:55 编辑

请教大家一个关于STM32H750 FMC的奇怪问题,我想使用FMC去控制8bit 8080并口 LCD
STM32CubeMX配置如下:
001.png
读写地址通过计算后得到:
volatile uint8_t *LcdReg =  (uint8_t*)0x60000000;
volatile uint8_t *LcdData =(uint8_t*)0x60400000; (8bit情况下地址线完全对应,所以无需偏移,A22对应400000),诡异的现象是写数据时出现的,例如我写一个0x36到0x60000000地址上,wr信号线预期应该产生1个上升沿,D7-D0数据线为0011_0110,实际情况如下:WR产生了8次上升沿,多出来7个奇怪的数据,如下图所示:
002.jpg
希望有大神能解答一下,感激不尽!

回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
 楼主| 发表于 2021-3-10 13:10:16 | 显示全部楼层
FMC配置代码如下:
void MX_FMC_Init(void)
{
  /* USER CODE BEGIN FMC_Init 0 */

  /* USER CODE END FMC_Init 0 */

  FMC_NORSRAM_TimingTypeDef Timing = {0};
  FMC_NORSRAM_TimingTypeDef ExtTiming = {0};

  /* USER CODE BEGIN FMC_Init 1 */

  /* USER CODE END FMC_Init 1 */

  /** 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_8;
  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_ENABLE;
  hsram1.Init.AsynchronousWait = FMC_ASYNCHRONOUS_WAIT_DISABLE;
  hsram1.Init.WriteBurst = FMC_WRITE_BURST_DISABLE;
  hsram1.Init.ContinuousClock = FMC_CONTINUOUS_CLOCK_SYNC_ASYNC;
  hsram1.Init.WriteFifo = FMC_WRITE_FIFO_DISABLE;
  hsram1.Init.PageSize = FMC_PAGE_SIZE_NONE;
  /* Timing */
  Timing.AddressSetupTime = 1;
  Timing.AddressHoldTime = 0x15;
  Timing.DataSetupTime = 2;
  Timing.BusTurnAroundDuration = 0;
  Timing.CLKDivision = 30;
  Timing.DataLatency = 0;
  Timing.AccessMode = FMC_ACCESS_MODE_A;
  /* ExtTiming */
  ExtTiming.AddressSetupTime = 1;
  ExtTiming.AddressHoldTime = 0x15;
  ExtTiming.DataSetupTime = 2;        //0x15
  ExtTiming.BusTurnAroundDuration = 0;
  ExtTiming.CLKDivision = 30;        //16
  ExtTiming.DataLatency = 0;        //17
  ExtTiming.AccessMode = FMC_ACCESS_MODE_A;        //A

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

  /* USER CODE BEGIN FMC_Init 2 */

  /* USER CODE END FMC_Init 2 */
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2021-3-10 14:52:26 | 显示全部楼层
注意MPU配置,务必要将此FMC地址空间设置为Strongly order或者Device模式。
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
 楼主| 发表于 2021-3-10 15:08:10 | 显示全部楼层
eric2013 发表于 2021-3-10 14:52
注意MPU配置,务必要将此FMC地址空间设置为Strongly order或者Device模式。

void MPU_Config(void)
{
        MPU_Region_InitTypeDef MPU_Initure;

        HAL_MPU_Disable();        //配置MPU之前先关闭MPU,配置完成以后在使能MPU
        //外部SRAM为region0,大小为2MB,此区域可读写
        MPU_Initure.Enable=MPU_REGION_ENABLE;            //使能region
        MPU_Initure.Number=MPU_REGION_NUMBER0;                //设置region,外部SRAM使用的region0
        MPU_Initure.BaseAddress=(0x60000000);        //region基地址
        MPU_Initure.Size=MPU_REGION_SIZE_256MB;                        //region大小
        MPU_Initure.SubRegionDisable=0X00;
        MPU_Initure.TypeExtField=MPU_TEX_LEVEL0;
        MPU_Initure.AccessPermission=MPU_REGION_FULL_ACCESS;        //此region可读写
        MPU_Initure.DisableExec=MPU_INSTRUCTION_ACCESS_ENABLE;        //允许读取此区域中的指令
        MPU_Initure.IsShareable=MPU_ACCESS_SHAREABLE;
        MPU_Initure.IsCacheable=MPU_ACCESS_NOT_CACHEABLE;
        MPU_Initure.IsBufferable=MPU_ACCESS_NOT_BUFFERABLE;
        HAL_MPU_ConfigRegion(&MPU_Initure);
        //HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);     //开启MPU

#if 1       
        //HAL_MPU_Disable();        //配置MPU之前先关闭MPU,配置完成以后在使能MPU
        //外部SRAM为region0,大小为2MB,此区域可读写
        MPU_Initure.Enable=MPU_REGION_ENABLE;            //使能region
        MPU_Initure.Number=MPU_REGION_NUMBER1;                //设置region,外部SRAM使用的region1
        MPU_Initure.BaseAddress=(0x30040000);        //region基地址
        MPU_Initure.Size=MPU_REGION_SIZE_2KB;                        //region大小
        MPU_Initure.SubRegionDisable=0X00;
        MPU_Initure.TypeExtField=MPU_TEX_LEVEL0;
        MPU_Initure.AccessPermission=MPU_REGION_FULL_ACCESS;        //此region可读写
        MPU_Initure.DisableExec=MPU_INSTRUCTION_ACCESS_ENABLE;        //允许读取此区域中的指令
        MPU_Initure.IsShareable=MPU_ACCESS_SHAREABLE;
        MPU_Initure.IsCacheable=MPU_ACCESS_NOT_CACHEABLE;
        MPU_Initure.IsBufferable=MPU_ACCESS_NOT_BUFFERABLE;
        HAL_MPU_ConfigRegion(&MPU_Initure);
        HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);     //开启MPU       
#endif       
       
}
你好,MPU配置如上,感谢!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2021-3-10 15:31:15 | 显示全部楼层
boom 发表于 2021-3-10 15:08
void MPU_Config(void)
{
        MPU_Region_InitTypeDef MPU_Initure;

看这也没啥问题,你测试下你的NE片选信号的波形看看
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
 楼主| 发表于 2021-3-10 18:43:01 | 显示全部楼层
eric2013 发表于 2021-3-10 15:31
看这也没啥问题,你测试下你的NE片选信号的波形看看

感谢,确实是mpu的问题!
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
 楼主| 发表于 2021-3-10 18:43:20 | 显示全部楼层
eric2013 发表于 2021-3-10 15:31
看这也没啥问题,你测试下你的NE片选信号的波形看看

感谢,确实是mpu的问题!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2021-3-11 09:07:37 | 显示全部楼层
boom 发表于 2021-3-10 18:43
感谢,确实是mpu的问题!

好的,还有什么问题再交流。
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
发表于 2021-5-31 20:46:49 | 显示全部楼层
楼主你好,你配置好的MPU能借我参考一下吗,谢谢了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2021-6-1 09:18:25 | 显示全部楼层
星夜欣宇 发表于 2021-5-31 20:46
楼主你好,你配置好的MPU能借我参考一下吗,谢谢了

        /* 配置FMC扩展IO的MPU属性为Device或者Strongly Ordered */
        MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
        MPU_InitStruct.BaseAddress      = 0x60000000;
        MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_64KB;        
        MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
        MPU_InitStruct.IsBufferable     = MPU_ACCESS_BUFFERABLE;
        MPU_InitStruct.IsCacheable      = MPU_ACCESS_NOT_CACHEABLE;        /* 不能用MPU_ACCESS_CACHEABLE,会出现2次CS、WE信号 */
        MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
        MPU_InitStruct.Number           = MPU_REGION_NUMBER1;
        MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;
        MPU_InitStruct.SubRegionDisable = 0x00;
        MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;

注意配置的地址和范围大小
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
发表于 2021-6-2 19:22:13 | 显示全部楼层
eric2013 发表于 2021-6-1 09:18
/* 配置FMC扩展IO的MPU属性为Device或者Strongly Ordered */
        MPU_InitStruct.Enable    ...

我的调试成功了,你和楼主提供的MPU配置都能使用,谢谢硬汉哥
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2021-6-3 08:22:27 | 显示全部楼层
星夜欣宇 发表于 2021-6-2 19:22
我的调试成功了,你和楼主提供的MPU配置都能使用,谢谢硬汉哥

好的,后面还有什么问题再交流。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-14 17:22 , Processed in 0.271350 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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