硬汉嵌入式论坛

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

[FMC] 使用STM32H725通过FMC 读取ILI9325的ID,一直是0

[复制链接]

1

主题

6

回帖

9

积分

新手上路

积分
9
发表于 2025-1-23 20:57:39 | 显示全部楼层 |阅读模式
使用STM32H725通过FMC 读取ILI9325的ID,一直是0 ,   lcd_wr_regno(0X0000); DeviceCode = lcd_rd_data();                /* Read LCD ID        */printf("DeviceCode = %04x\r\n",DeviceCode);  把地址0x0000更换任意地址,返回的都是地址,就是把0x0000,换成0x0044,DeviceCode返回的就是0x0044,真的很奇怪
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2025-1-24 06:28:47 | 显示全部楼层
方便的话,分享这部分原理图和这部分的配置代码看下
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2025-1-24 10:06:34 | 显示全部楼层
void MPU_Config(void)
{
   MPU_Region_InitTypeDef MPU_InitStruct;

    /* ???1 MPU */
    HAL_MPU_Disable();

#if 0
       /* ????AXI SRAM|¨¬?MPU¡§o?D??aWrite back, Read allocate?¨o?Write allocate */
    MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
    MPU_InitStruct.BaseAddress      = 0x24000000;
    MPU_InitStruct.Size             = MPU_REGION_SIZE_512KB;
    MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    MPU_InitStruct.IsBufferable     = MPU_ACCESS_BUFFERABLE;
    MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;
    MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
    MPU_InitStruct.Number           = MPU_REGION_NUMBER0;
    MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL1;
    MPU_InitStruct.SubRegionDisable = 0x00;
    MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;

    HAL_MPU_ConfigRegion(&MPU_InitStruct);

#else
     /* |¨¬?¨¤???¡§o?2¡§|¡§??????|¨¬????? */
    /* ????AXI SRAM|¨¬?MPU¡§o?D??aNORMAL, NO Read allocate?¨o?NO Write allocate */
    MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
    MPU_InitStruct.BaseAddress      = 0x24000000;
    MPU_InitStruct.Size             = MPU_REGION_SIZE_512KB;
    MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;
    MPU_InitStruct.IsCacheable      = MPU_ACCESS_NOT_CACHEABLE;
    MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
    MPU_InitStruct.Number           = MPU_REGION_NUMBER0;
    MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL1;
    MPU_InitStruct.SubRegionDisable = 0x00;
    MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;

    HAL_MPU_ConfigRegion(&MPU_InitStruct);
#endif
    /* ????FMC¡§¡è??1IO|¨¬?MPU¡§o?D??aDevice?¡§¡ã??Strongly Ordered */
    MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
    MPU_InitStruct.BaseAddress      = 0x60000000;
    MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_256MB;   
    MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    MPU_InitStruct.IsBufferable     = MPU_ACCESS_BUFFERABLE;
    MPU_InitStruct.IsCacheable      = MPU_ACCESS_NOT_CACHEABLE;
    MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
    MPU_InitStruct.Number           = MPU_REGION_NUMBER1;
    MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL1;
    MPU_InitStruct.SubRegionDisable = 0x00;
    MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;
   
    HAL_MPU_ConfigRegion(&MPU_InitStruct);

    /*¡§o1?¡§1 MPU */
    HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
}
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2025-1-24 10:07:10 | 显示全部楼层
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_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_ENABLE;
  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 = 3;
  Timing.AddressHoldTime = 2;
  Timing.DataSetupTime = 38;
  Timing.BusTurnAroundDuration = 15;
  Timing.CLKDivision = 0;
  Timing.DataLatency = 0;
  Timing.AccessMode = FMC_ACCESS_MODE_A;
  /* ExtTiming */
  ExtTiming.AddressSetupTime = 3;
  ExtTiming.AddressHoldTime = 2;
  ExtTiming.DataSetupTime = 13;
  ExtTiming.BusTurnAroundDuration = 15;
  ExtTiming.CLKDivision = 0;
  ExtTiming.DataLatency = 0;
  ExtTiming.AccessMode = FMC_ACCESS_MODE_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万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2025-1-25 05:46:33 | 显示全部楼层
sonic 发表于 2025-1-24 10:06
void MPU_Config(void)
{
   MPU_Region_InitTypeDef MPU_InitStruct;

原理图和LCD的配置,没有贴。仅贴了FMC的配置
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2025-2-5 10:16:58 | 显示全部楼层
这个是原理图
lcd.png
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2025-2-5 10:21:27 | 显示全部楼层
eric2013 发表于 2025-1-25 05:46
原理图和LCD的配置,没有贴。仅贴了FMC的配置






static uint32_t FMC_DeInitialized = 0;

static void HAL_FMC_MspDeInit(void){
  /* USER CODE BEGIN FMC_MspDeInit 0 */

  /* USER CODE END FMC_MspDeInit 0 */
  if (FMC_DeInitialized) {
    return;
  }
  FMC_DeInitialized = 1;
  /* Peripheral clock enable */
  __HAL_RCC_FMC_CLK_DISABLE();

  /** FMC GPIO Configuration
  PA4   ------> FMC_D8
  PA5   ------> FMC_D9
  PE7   ------> FMC_D4
  PE8   ------> FMC_D5
  PE9   ------> FMC_D6
  PE10   ------> FMC_D7
  PE13   ------> FMC_D10
  PE14   ------> FMC_D11
  PE15   ------> FMC_D12
  PD8   ------> FMC_D13
  PD9   ------> FMC_D14
  PD10   ------> FMC_D15
  PD13   ------> FMC_A18
  PD14   ------> FMC_D0
  PD15   ------> FMC_D1
  PC7   ------> FMC_NE1
  PD0   ------> FMC_D2
  PD1   ------> FMC_D3
  PD4   ------> FMC_NOE
  PD5   ------> FMC_NWE
  */

  HAL_GPIO_DeInit(GPIOA, GPIO_PIN_4|GPIO_PIN_5);

  HAL_GPIO_DeInit(GPIOE, GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10
                          |GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15);

  HAL_GPIO_DeInit(GPIOD, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_13
                          |GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1
                          |GPIO_PIN_4|GPIO_PIN_5);

  HAL_GPIO_DeInit(GPIOC, GPIO_PIN_7);

  /* USER CODE BEGIN FMC_MspDeInit 1 */

  /* USER CODE END FMC_MspDeInit 1 */
}

这是管脚的初始化,LCD的背光是可以控制的
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2025-2-5 10:22:49 | 显示全部楼层
/* FMC相关参数定义
* 默认通过FMC的存储块1来连接LCD,存储块1有4个片选(FMC_NE1~4)对应FMC存储块1的4个区域块
*/
#define LCD_FMC_NEX                1       /* 使用FMC_NE1连接LCD_CS,范围:1~4 */
#define LCD_FMC_AX                 18      /* 使能FMC_A18连接LCD_RS,范围:0~25 */

/* LCD地址结构体 */
typedef struct
{
    volatile uint16_t LCD_REG;
    volatile uint16_t LCD_RAM;
} LCD_TypeDef;

/* LCD_BASE的详细计算方法:
* 一般使用FMC的存储块1来驱动TFTLCD液晶屏(MCU屏),存储块1地址范围总大小为256MB,均分成4区域块:
* 存储块1区域块1(FMC_NE1)地址范围:0x60000000~0x63FFFFFF
* 存储块1区域块2(FMC_NE2)地址范围:0x64000000~0x67FFFFFF
* 存储块1区域块3(FMC_NE3)地址范围:0x68000000~0x6BFFFFFF
* 存储块1区域块4(FMC_NE4)地址范围:0x6C000000~0x6FFFFFFF
*
* 需要根据硬件连接方式选择合适的片选(连接LCD_CS)和地址线(连接LCD_RS)
* 正点原子 北极星 H750开发板使用FMC_NE1连接LCD_CS,FMC_A18连接LCD_RS,16位数据线,计算方法如下:
* 首先FMC_NE1的基地址为: 0x60000000;FMC_NEx(x=1~4)的基址为: 0x60000000 + (0x4000000 * (x - 1))
* FMC_A18对应地址值:2^18 * 2 = 0x80000;FMC_Ay(y=0~25)的地址为:2^y * 2
*
* LCD->LCD_REG,对应LCD_RS = 0(LCD寄存器);LCD->LCD_RAM,对应LCD_RS = 1(LCD数据)
* LCD->LCD_RAM的地址为:0x60000000 + 0x80000 = 0x60080000
* LCD->LCD_REG的地址为:LCD->LCD_RAM之外的任意地址
* 由于使用了结构体管理LCD_REG和LCD_RAM(LCD_REG在前,LCD_RAM在后,均为16位数据宽度)
* 因此结构体的基地址(LCD_BASE) = LCD_RAM - sizeof(LCD_REG) = 0x6007FFFE
*
* 更加通用的计算公式为(LCD_CS接片选脚FMC_NEx(x=1~4),(LCD_RS接地址线FMC_Ay(y=0~25)):
* LCD_BASE = (0x60000000 + (0x4000000 * (x - 1))) | (2^y * 2 - 2)
* 等效于(使用移位操作)
* LCD_BASE = (0x60000000 + (0x4000000 * (x - 1))) | ((1 << y) * 2 - 2)
*/
#define LCD_BASE                    (uint32_t)((0x60000000 + (0x4000000 * (LCD_FMC_NEX - 1))) | (((1 << LCD_FMC_AX) * 2) - 2))
#define LCD                         ((LCD_TypeDef *)LCD_BASE)
这个是lcd结构体的定义
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2025-2-6 06:02:57 | 显示全部楼层
sonic 发表于 2025-2-5 10:22
/* FMC相关参数定义
* 默认通过FMC的存储块1来连接LCD,存储块1有4个片选(FMC_NE1~4)对应FMC存储块1的4 ...

你这个地址计算看着非常别扭,直接这样就行了
#define ILI9488_BASE       ((uint32_t)(0x60000000 | 0x00000000))

#define ILI9488_REG                *(__IO uint16_t *)(ILI9488_BASE)
#define ILI9488_RAM                *(__IO uint16_t *)(ILI9488_BASE + (1 << (18 + 1)))        /* FSMC 16位总线模式下,FSMC_A18口线对应物理地址A19 */

回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2025-2-6 14:17:39 | 显示全部楼层
eric2013 发表于 2025-2-6 06:02
你这个地址计算看着非常别扭,直接这样就行了
#define ILI9488_BASE       ((uint32_t)(0x60000000 | 0x ...

我修改测试下,感谢,硬汉哥
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-14 00:51 , Processed in 0.046083 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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