初始化代码如下
void QSPI_FLASH_Init(void)
{
stc_qspi_init_t stcQspiInit;
stc_gpio_init_t stcGpioInit;
(void)GPIO_StructInit(&stcGpioInit);
stcGpioInit.u16PinDrv = PIN_HIGH_DRV;
(void)GPIO_Init(QSPI_FLASH_CS_PORT, QSPI_FLASH_CS_PIN, &stcGpioInit);
(void)GPIO_Init(QSPI_FLASH_SCK_PORT, QSPI_FLASH_SCK_PIN, &stcGpioInit);
(void)GPIO_Init(QSPI_FLASH_IO0_PORT, QSPI_FLASH_IO0_PIN, &stcGpioInit);
(void)GPIO_Init(QSPI_FLASH_IO1_PORT, QSPI_FLASH_IO1_PIN, &stcGpioInit);
(void)GPIO_Init(QSPI_FLASH_IO2_PORT, QSPI_FLASH_IO2_PIN, &stcGpioInit);
(void)GPIO_Init(QSPI_FLASH_IO3_PORT, QSPI_FLASH_IO3_PIN, &stcGpioInit);
GPIO_SetFunc(QSPI_FLASH_CS_PORT, QSPI_FLASH_CS_PIN, QSPI_FLASH_CS_FUNC);
GPIO_SetFunc(QSPI_FLASH_SCK_PORT, QSPI_FLASH_SCK_PIN, QSPI_FLASH_SCK_FUNC);
GPIO_SetFunc(QSPI_FLASH_IO0_PORT, QSPI_FLASH_IO0_PIN, QSPI_FLASH_IO0_FUNC);
GPIO_SetFunc(QSPI_FLASH_IO1_PORT, QSPI_FLASH_IO1_PIN, QSPI_FLASH_IO1_FUNC);
GPIO_SetFunc(QSPI_FLASH_IO2_PORT, QSPI_FLASH_IO2_PIN, QSPI_FLASH_IO2_FUNC);
GPIO_SetFunc(QSPI_FLASH_IO3_PORT, QSPI_FLASH_IO3_PIN, QSPI_FLASH_IO3_FUNC);
FCG_Fcg1PeriphClockCmd(QSPI_FLASH_CLK, ENABLE);
(void)QSPI_StructInit(&stcQspiInit);
stcQspiInit.u32ClockDiv = QSPI_CLK_DIV3;
stcQspiInit.u32ReadMode = QSPI_FLASH_RD_MD;
stcQspiInit.u32PrefetchMode = QSPI_PREFETCH_MD_EDGE_STOP;
stcQspiInit.u32DummyCycle = QSPI_FLASH_RD_DUMMY_CYCLE;
stcQspiInit.u32AddrWidth = QSPI_FLASH_ADDR_WIDTH;
stcQspiInit.u32SetupTime = QSPI_QSSN_SETUP_ADVANCE_QSCK1P5;
stcQspiInit.u32ReleaseTime = QSPI_QSSN_RELEASE_DELAY_QSCK1P5;
stcQspiInit.u32IntervalTime = QSPI_QSSN_INTERVAL_QSCK2;
(void)QSPI_Init(&stcQspiInit);
}
映射读取
int32_t QSPI_FLASH_Read(uint32_t u32Addr, uint8_t *pu8ReadBuf, uint32_t u32Size)
{
uint32_t u32Count = 0U;
int32_t i32Ret = LL_OK;
__IO uint8_t *pu8Read;
u32Addr += QSPI_ROM_BASE;
if ((NULL == pu8ReadBuf) || (0UL == u32Size) || ((u32Addr + u32Size) > QSPI_ROM_END)) {
i32Ret = LL_ERR_INVD_PARAM;
} else {
#if (QSPI_XIP_FUNC_ENABLE == DDL_ON)
QSPI_XipModeCmd(QSPI_FLASH_ENTER_XIP_MD, ENABLE);
#endif
pu8Read = (__IO uint8_t *)u32Addr;
while (u32Count < u32Size) {
pu8ReadBuf[u32Count++] = *pu8Read++;
#if (QSPI_XIP_FUNC_ENABLE == DDL_ON)
if (u32Count == (u32Size - 1U)) {
QSPI_XipModeCmd(QSPI_FLASH_EXIT_XIP_MD, DISABLE);
}
#endif
}
}
return i32Ret;
}
直接读取
int32_t QSPI_FLASH_Read(uint32_t u32Addr, uint8_t *pu8ReadBuf, uint32_t u32Size)
{
uint32_t u32TempSize = 0;
uint8_t u8AddrBuf[4U] = {0};
uint32_t u32AddrOffset = 0U;
int32_t i32Ret = LL_OK;
if ((NULL == pu8ReadBuf) || (0UL == u32Size) || ((u32Addr % W25Q64_PAGE_SIZE) != 0U)) {
i32Ret = LL_ERR_INVD_PARAM;
} else {
while (u32Size != 0UL) {
if (u32Size >= W25Q64_PAGE_SIZE) {
u32TempSize = W25Q64_PAGE_SIZE;
} else {
u32TempSize = u32Size;
}
QSPI_FLASH_WriteInstr(W25Q64_WR_ENABLE, NULL, 0U, NULL, 0U);
QSPI_FLASH_WordToByte(u32Addr, u8AddrBuf);
QSPI_FLASH_ReadInstr(W25Q64_RD_DATA, u8AddrBuf, (QSPI_FLASH_ADDR_WIDTH + 1U),
(uint8_t *)&pu8ReadBuf[u32AddrOffset], u32TempSize);
i32Ret = QSPI_FLASH_CheckProcessDone(500U);
if (i32Ret != LL_OK) {
break;
}
u32Addr += u32TempSize;
u32AddrOffset += u32TempSize;
u32Size -= u32TempSize;
}
}
return i32Ret;
}
|