|
1、这个引脚可以采用软件方式也可以采用硬件方式。
2、详情你看此贴的例子即可:
基于V7的新版RL-USB和RL-FlashFS的NAND完整解决方案,实现更简单,用户仅需初始化FMC
http://www.armbbs.cn/forum.php?mod=viewthread&tid=94277
/*
*********************************************************************************************************
* 函 数 名: bsp_FMC_NAND_Init
* 功能说明: 配置FSMC和GPIO用于NAND Flash接口。这个函数必须在读写nand flash前被调用一次。
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
#define BUSY_GPIO GPIOD
#define BUSY_PIN GPIO_PIN_6
static void bsp_FMC_NAND_Init(void)
{
/* --NAND Flash GPIOs 配置 ------*/
{
/*
PD0/FMC_D2
PD1/FMC_D3
PD4/FMC_NOE
PD5/FMC_NWE
PD7/FMC_NCE2 --替换为 PG9/FMC_NCE3
PD11/FMC_A16/FMC_CLE
PD12/FMC_A17/FMC_ALE
PD14/FMC_D0
PD15/FMC_D1
PE7/FMC_D4
PE8/FMC_D5
PE9/FMC_D6
PE10/FMC_D7
PD6/FMC_NWAIT (本例程用查询方式判忙,此口线作为普通GPIO输入功能使用)
*/
GPIO_InitTypeDef gpio_init_structure;
/* 使能 GPIO时钟 */
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOE_CLK_ENABLE();
/* 使能FMC时钟 */
__HAL_RCC_FMC_CLK_ENABLE();
/* 设置 GPIOD 相关的IO为复用推挽输出 */
gpio_init_structure.Mode = GPIO_MODE_AF_PP;
gpio_init_structure.Pull = GPIO_PULLUP;
gpio_init_structure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
gpio_init_structure.Alternate = GPIO_AF12_FMC;
/* 配置GPIOD */
gpio_init_structure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_4 | GPIO_PIN_5 |
GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_14 |
GPIO_PIN_15;
HAL_GPIO_Init(GPIOD, &gpio_init_structure);
/* 配置GPIOE */
gpio_init_structure.Pin = GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10;
HAL_GPIO_Init(GPIOE, &gpio_init_structure);
/* 配置GPIOG NAND 片选 */
gpio_init_structure.Pin = GPIO_PIN_9;
HAL_GPIO_Init(GPIOG, &gpio_init_structure);
/* busy R/B 设置为输入 */
gpio_init_structure.Mode = GPIO_MODE_INPUT; /* 设置输入 */
gpio_init_structure.Pull = GPIO_NOPULL; /* 上下拉电阻不使能 */
gpio_init_structure.Speed = GPIO_SPEED_FREQ_MEDIUM; /* GPIO速度等级 */
gpio_init_structure.Pin = BUSY_PIN;
HAL_GPIO_Init(BUSY_GPIO, &gpio_init_structure);
}
{
NAND_HandleTypeDef hNand = {0};
FMC_NAND_PCC_TimingTypeDef CommonSpaceTiming;
FMC_NAND_PCC_TimingTypeDef AttributeSpaceTiming;
hNand.Instance = FMC_NAND_DEVICE;
hNand.Init.NandBank = FMC_NAND_BANK3; /* 定义FSMC NAND BANK 号 */
hNand.Init.Waitfeature = FMC_NAND_PCC_WAIT_FEATURE_DISABLE; /* 插入等待时序使能, 禁止 */
hNand.Init.MemoryDataWidth = FMC_NAND_PCC_MEM_BUS_WIDTH_8; /* 数据宽度 8bit */
hNand.Init.EccComputation = FMC_NAND_ECC_DISABLE; /* ECC错误检查和纠正功能 - 禁止 */
hNand.Init.ECCPageSize = FMC_NAND_ECC_PAGE_SIZE_2048BYTE; /* ECC 页面大小 */
hNand.Init.TCLRSetupTime = 0x03; /* CLE低和RE低之间的延迟,HCLK周期数 */
hNand.Init.TARSetupTime = 0x03; /* ALE低和RE低之间的延迟,HCLK周期数 */
/* 2-5-3-1 V6 OK 4-10-6-2 异常 */
CommonSpaceTiming.SetupTime = 3;
CommonSpaceTiming.WaitSetupTime = 5;
CommonSpaceTiming.HoldSetupTime = 3;
CommonSpaceTiming.HiZSetupTime = 3;
AttributeSpaceTiming.SetupTime = 3;
AttributeSpaceTiming.WaitSetupTime = 5;
AttributeSpaceTiming.HoldSetupTime = 3;
AttributeSpaceTiming.HiZSetupTime = 3;
HAL_NAND_Init(&hNand, &CommonSpaceTiming, &AttributeSpaceTiming);
}
}
虽然开头加了这个,RL-FlashFS并没有调用(之前还有个网友咨询过一次这个问题):
- /* 必须等待,否则读出数据异常, 此处应该判断超时*/
- #define WAIT_BUSY() { \
- uint16_t k; \
- for (k = 0; k < 200; k++) \
- { \
- if ((BUSY_GPIO->IDR & BUSY_PIN) == 0) break; \
- } \
- for (k = 0; k < 2000; k++) \
- { \
- if ((BUSY_GPIO->IDR & BUSY_PIN) != 0) break; \
- } \
- }
- /**
- \fn int32_t Driver_NANDx_GetDeviceBusy (uint32_t dev_num)
- \brief NAND Driver GetDeviceBusy callback.
- Needs to be implemented by user.
- \param[in] dev_num Device number
- \return 1=busy, 0=not busy, or error
- */
- int32_t Driver_NAND0_GetDeviceBusy (uint32_t dev_num)
- {
- WAIT_BUSY();
-
- return 0;
- }
复制代码
|
|