STM32F7 External Flash loader using QuadSPI
I have a problem same as on here https://community.st.com/s/profile/0050X000007vtAYQAY?t=1566392175765 but different mcu (STM32F750N8) and same flash chip.
I used the code that published there. But i cant get it done.
When i compile my code, i can see clk on the qspi chip. But it is not solid.
Here is my init code (uart for debugging):
/*
* Initialize Flash Programming Functions
* Parameter: adr: Device Base Address
* clk: Clock Frequency (Hz)
* fnc: Function Code (1 - Erase, 2 - Program, 3 - Verify)
* Return Value: 0 - OK, 1 - Failed
*/
int Init (unsigned long adr, unsigned long clk, unsigned long fnc)
{
SystemInit();
SystemClock_Config();
__HAL_RCC_GPIOI_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_3;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(GPIOI, &GPIO_InitStruct);
GPIOI->BSRR = (uint32_t)GPIO_PIN_0 << 16;
GPIOI->BSRR = (uint32_t)GPIO_PIN_3 << 16;
__HAL_RCC_USART1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/**USART1 GPIO Configuration
PA10 ------> USART1_RX
PA9 ------> USART1_TX
*/
GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
HAL_UART_Init(&huart1);
SYSInit();
BSP_QSPI_Init();
// GPIOI->BSRR = (uint32_t)GPIO_PIN_0 << 16;
// QSPI_ResetMemory();
// BSP_QSPI_MemoryMappedMode();
return (0);
}
//Here is my subsector erase code:
/*
* Erase Sector in Flash Memory
* Parameter: adr: Sector Address
* Return Value: 0 - OK, 1 - Failed
*/
int EraseSector (unsigned long adr)
{
HAL_UART_Transmit(&huart1, (uint8_t *)"Sector erase", sizeof("Sector erase"), 1);
GPIOI->BSRR = GPIO_PIN_0;
BSP_QSPI_Erase_Block(adr - base_adr);
GPIOI->BSRR = (uint32_t)GPIO_PIN_0 << 16;
return 0;
}
//Here is my sector erase (full chip) code:
/*
* Erase complete Flash Memory
* Return Value: 0 - OK, 1 - Failed
*/
int EraseChip (void)
{
HAL_UART_Transmit(&huart1, (uint8_t *)"Full chip erase", sizeof("Full chip erase"), 1);
GPIOI->BSRR = GPIO_PIN_3;
BSP_QSPI_Erase_Chip();
GPIOI->BSRR = (uint32_t)GPIO_PIN_3 << 16;
return 0;
}
//I tried so many thing but still no progress. It is not rigid. Can some one give me a hand?