STM32
直播中

陈伟

8年用户 1572经验值
私信 关注
[问答]

求助,关于STM32F407VET6 FSMC的地址问题求解

STM32F407VET6  FSMC接口驱动 DM9000的问题,PD7 接做为片选,PD11做为指令与数据的
代码如下:

#define DM9000_DATA  *(vu16*)((u32)0x60000000)
#define DM9000_CMD   *(vu16*)((u32)0x60020000)


/*******************************************************************************
* 函数名: DM9000AE_CtrlLinesConfig
* 参  数: 无
* 返  回: 无
* 功  能: 配置DM9000AE控制口线,FSMC管脚设置为复用功能
*/

static void DM9K_CtrlLinesConfig(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
FSMC_NORSRAMTimingInitTypeDef  FSMC_NORSRAMTimingInitStructure;

/* FSMC GPIO configure */
RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE);

/* Enable GPIOs clock */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOF, ENABLE);
/* Enable FSMC clock */


/* GPIOD configuration */
GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_FSMC);   // D2
GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_FSMC);   // D3
GPIO_PinAFConfig(GPIOD, GPIO_PinSource4, GPIO_AF_FSMC);   // NOE
GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_FSMC);   // WE

GPIO_PinAFConfig(GPIOD, GPIO_PinSource8, GPIO_AF_FSMC);   // D13
GPIO_PinAFConfig(GPIOD, GPIO_PinSource9, GPIO_AF_FSMC);   // D14
GPIO_PinAFConfig(GPIOD, GPIO_PinSource10, GPIO_AF_FSMC);  // D15
GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_FSMC);  // D0
GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_FSMC);  // D1

/* GPIOE configuration */
GPIO_PinAFConfig(GPIOE, GPIO_PinSource7 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource8 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource9 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource10 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource11 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource12 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource13 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource14 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource15 , GPIO_AF_FSMC);

    /* GPIOF configuration */
    GPIO_PinAFConfig(GPIOD, GPIO_PinSource7 , GPIO_AF_FSMC);   // CS---DM9000_CS
    GPIO_PinAFConfig(GPIOD, GPIO_PinSource11 , GPIO_AF_FSMC);   // A16---CMD

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 |  
          GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_14 | GPIO_Pin_15;
   
    GPIO_Init(GPIOD,  GPIO_InitStructure);

    GPIO_InitStructure.GPIO_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_Init(GPIOE,  GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_11;
    GPIO_Init(GPIOD,  GPIO_InitStructure);
}





/*******************************************************************************
* 函数名: DM9K_FSMCConfig
* 参  数: 无
* 返  回: 无
* 功  能: 配置FSMC并口访问时序
*/
static void DM9K_FSMCConfig(void)
{
FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
FSMC_NORSRAMTimingInitTypeDef  FSMC_NORSRAMTimingInitStructure;

/*-- FSMC Configuration ------------------------------------------------------*/
/*----------------------- SRAM Bank 2 ----------------------------------------*/
/* FSMC_Bank1_NORSRAM4 configuration */
FSMC_NORSRAMTimingInitStructure.FSMC_AddressSetupTime = 15;
FSMC_NORSRAMTimingInitStructure.FSMC_AddressHoldTime = 10;
FSMC_NORSRAMTimingInitStructure.FSMC_DataSetupTime = 50;
FSMC_NORSRAMTimingInitStructure.FSMC_BusTurnAroundDuration = 10;
FSMC_NORSRAMTimingInitStructure.FSMC_CLKDivision = 0;
FSMC_NORSRAMTimingInitStructure.FSMC_DataLatency = 0;
FSMC_NORSRAMTimingInitStructure.FSMC_AccessMode = FSMC_AccessMode_A;

/* Color LCD configuration ------------------------------------
  LCD configured as follow:
     - Data/Address MUX = Disable
     - Memory Type = SRAM
     - Data Width = 16bit
     - Write Operation = Enable
     - Extended Mode = Enable
     - Asynchronous Wait = Disable */
FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM2;
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct =  FSMC_NORSRAMTimingInitStructure;
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct =  FSMC_NORSRAMTimingInitStructure;

FSMC_NORSRAMInit( FSMC_NORSRAMInitStructure);
/* - BANK 2 (of NOR/SRAM Bank 0~3) is enabled */
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM2, ENABLE);
}






注意红色部分,如果是PD7,应该选择FSMC_Bank1_NORSRAM1而不是FSMC_Bank1_NORSRAM2,但是为FSMC_Bank1_NORSRAM1 的时候,就会死在
//Hard Fault exception handler
void HardFault_Handler(void)
{
   while (1)
   {
   }
}这里面,改为FSMC_Bank1_NORSRAM2
就正常了,请是怎么一回事呢?
有遇到这个情况 的朋友吗?





回帖(1)

胡秋阳

2024-5-15 16:57:59
根据您提供的信息,您正在尝试使用STM32F407VET6的FSMC接口驱动DM9000芯片。您已经定义了两个宏,分别用于访问DM9000的数据端口和命令端口。以下是您提供的代码:

```c
#define DM9000_DATA  *(vu16*)((u32)0x60000000)
#define DM9000_CMD   *(vu16*)((u32)0x60020000)

/********************************************************************************
函数名: DM9000AE_CtrlLinesConfig
参 数: 无
返 回: 无
功 能: 配置DM9000AE控制口线,FSMC管脚设置为复用功能
*/
static void DM9K_CtrlLinesConfig(void)
{
    // 这里需要添加FSMC管脚配置代码
}
```

为了完成FSMC的配置,您需要在`DM9K_CtrlLinesConfig`函数中添加相应的代码。以下是一些建议的步骤:

1. 配置FSMC的时钟:确保FSMC时钟已经启用。

2. 配置GPIO:将PD7和PD11配置为复用功能,以便它们可以作为FSMC的片选和命令/数据线使用。

3. 配置FSMC的寄存器:设置FSMC的控制寄存器,包括地址设置、数据宽度、时序等。

4. 配置FSMC的命令寄存器:设置FSMC的命令寄存器,以便可以发送命令和接收数据。

以下是一个简化的示例,展示了如何配置FSMC:

```c
static void DM9K_CtrlLinesConfig(void)
{
    // 1. 配置FSMC时钟
    // ...

    // 2. 配置GPIO
    // ...

    // 3. 配置FSMC的寄存器
    FSMC_Bank1->BTCR[0] = 0x00001091; // 假设这是正确的寄存器值,根据您的需求进行调整
    FSMC_Bank1->BTCR[1] = 0x001B0D9B; // 同上

    // 4. 配置FSMC的命令寄存器
    // ...
}
```

请注意,这只是一个示例,您需要根据您的具体需求和硬件配置来调整寄存器的值。建议您查阅STM32F407VET6的数据手册和DM9000的手册,以获取更详细的配置信息。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分