本帖最后由 wzd5230 于 2019-1-28 13:23 编辑
项目中使用的MCU是STM32H750,core最高频率400MHz,内部flash只有128KB,是无法满足目前我们的应用的,遂考虑外部扩展存储,并且片上执行(因为内部RAM也只有1MB),扩展的方案有2个,其一,通过QSPI外扩串行Flash,该MCU支持QSPI外接存储设备的XIP功能;其二,通过FSMC接口,外接并行的norFlash,这种方式耗费MCU的引脚比较多。因此采用QSPI外接Flash的方式。
目前在测试阶段,在MCU内部Flash中,包含了一个类似于Boot的程序,该程序初始化QSPI工作在内存映射模式,以及进行程序跳转。MCU的QSPI最高频率支持200MHz。外部Flash最高clock支持133MHz,已经包含了一个有效、可用的程序,该程序对某一IO口进行翻转。
【遇到的问题】:
1、QSPI的clock如果设置的比较高(>=50MHz),MCU就会进入hardfault_handler(),这可以理解,因为从Flash中读取的数据就是“指令”,指令不正确,肯定会出问题。如果QSPI的clock设置的比较低,如33MHz,那么是可以正常跳转,并且外部flash中的程序也执行了,IO正常翻转。
2、【测试1】,仅配置QSPI工作在内存映射模式,并不进行跳转,这样可以直接使用指针去读取数据,并且可以在IAR的memory窗口直接看到flash所映射地址的数据。测试结果是QSPI低速时通过JLink可以查看到数据,使用指针也可以正常访问到数据。如果QSPI设置clock高了,直接MCU进入异常状态。
3、【测试2】,将上述的【测试1】在一个STM32H743的评估板上验证(该板卡没有外接flash),即使QSPI的频率设置到100MHz,MCU也没有死,由于外部没有数据,映射的数据全为0xFF(我将SIO0..3直接接到VCC)。
4、不使用QSPI的内存映射模式,而是使用最简单的间接模式,对Flash中的数据进行读取,测试发现,当QSPI的clock速度提高了,mcu也还是死机。
5、还有很多其他的对比测试,我就不具体列出了。
【咨询的问题】
1、是否有使用过STMH750这一系列MCU的童鞋,我怀疑这个芯片的QSPI速度有限制,和STM32H743是不同的,当QSPI速度提升了,整个MCU进入异常。
2、是否有哪位使用STMH750这个MCU,外部通过QSPI扩展Flash实现片上执行程序(其实是取指令)。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
问题已经解决,是CubeMX默认生成的QSPI配置存在问题。
我手上暂时处于评估阶段,直接跑CubeMX生成的工程。你用CubeMX生成QSPI的程序就好了。还有CubeMX安装目录下有STM32H743-EVK的例程,可以参考。
区别在于这个函数HAL_QSPI_MspInit
CubeMX原始生成:
- GPIO_InitTypeDef GPIO_InitStruct = {0};
- if(hqspi->Instance==QUADSPI)
- {
- /* USER CODE BEGIN QUADSPI_MspInit 0 */
- /* USER CODE END QUADSPI_MspInit 0 */
- /* Peripheral clock enable */
- __HAL_RCC_QSPI_CLK_ENABLE();
-
- __HAL_RCC_GPIOB_CLK_ENABLE();
- __HAL_RCC_GPIOE_CLK_ENABLE();
- __HAL_RCC_GPIOC_CLK_ENABLE();
- /**QUADSPI GPIO Configuration
- PB2 ------> QUADSPI_CLK
- PE7 ------> QUADSPI_BK2_IO0
- PE8 ------> QUADSPI_BK2_IO1
- PE9 ------> QUADSPI_BK2_IO2
- PE10 ------> QUADSPI_BK2_IO3
- PC11 ------> QUADSPI_BK2_NCS
- */
- GPIO_InitStruct.Pin = GPIO_PIN_2;
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
- GPIO_InitStruct.Alternate = GPIO_AF9_QUADSPI;
- HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
- GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10;
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
- GPIO_InitStruct.Alternate = GPIO_AF10_QUADSPI;
- HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
- GPIO_InitStruct.Pin = GPIO_PIN_11;
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
- GPIO_InitStruct.Alternate = GPIO_AF9_QUADSPI;
- HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
- /* USER CODE BEGIN QUADSPI_MspInit 1 */
- /* USER CODE END QUADSPI_MspInit 1 */
- }
复制代码修改后的:
- GPIO_InitTypeDef GPIO_InitStruct = {0};
- if(hqspi->Instance==QUADSPI)
- {
- /*##-1- Enable peripherals and GPIO Clocks #################################*/
- /* Enable the QuadSPI memory interface clock */
- __HAL_RCC_QSPI_CLK_ENABLE();
- /* Reset the QuadSPI memory interface */
- __HAL_RCC_QSPI_FORCE_RESET();
- __HAL_RCC_QSPI_RELEASE_RESET();
- /* Enable GPIO clocks */
- __HAL_RCC_QSPI_CLK_ENABLE();
- __HAL_RCC_GPIOB_CLK_ENABLE();
- __HAL_RCC_GPIOC_CLK_ENABLE();
- __HAL_RCC_GPIOE_CLK_ENABLE();
- __HAL_RCC_GPIOF_CLK_ENABLE();
- /* Enable DMA clock */
- __HAL_RCC_MDMA_CLK_ENABLE();
-
- /*##-2- Configure peripheral GPIO ##########################################*/
- /**QUADSPI GPIO Configuration
- PB2 ------> QUADSPI_CLK
- PE7 ------> QUADSPI_BK2_IO0
- PE8 ------> QUADSPI_BK2_IO1
- PE9 ------> QUADSPI_BK2_IO2
- PE10 ------> QUADSPI_BK2_IO3
- PC11 ------> QUADSPI_BK2_NCS
- */
- GPIO_InitStruct.Pin = GPIO_PIN_2;
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
- GPIO_InitStruct.Alternate = GPIO_AF9_QUADSPI;
- HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
- GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10;
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
- GPIO_InitStruct.Alternate = GPIO_AF10_QUADSPI;
- HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
- GPIO_InitStruct.Pin = GPIO_PIN_11;
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
- GPIO_InitStruct.Pull = GPIO_PULLUP;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
- GPIO_InitStruct.Alternate = GPIO_AF9_QUADSPI;
- HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
- /* USER CODE BEGIN QUADSPI_MspInit 1 */
- /* USER CODE END QUADSPI_MspInit 1 */
- }
复制代码一周热门 更多>