STM32H7b0VBT6 使用了外部flash 导致spi显示屏刷新太慢 怎么解决?

使用外部flash存放代码之前spi屏刷的很快
使用外部flash以后spi屏刷新速度变成蜗牛了

修改下主程序,让主循环效率高一点,提高刷新率

  • 请看👉 :STM32系列单片机SPI速度研究(flash读取写入速度提高,液晶显示屏刷新率提高)
  • 除此之外, 这篇博客: STM32CubeMX学习笔记(10)——SPI接口使用(读写SPI Flash W25Q64)中的 5.4.2 读取状态寄存器数据并判断Flash是否忙碌 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • SPI Flash 的所有操作都是靠发送命令完成的,但是 Flash 接收到命令后,需要一段时间去执行该操作,这段时间内 Flash 处于“忙”状态,MCU 发送的命令无效,不能执行,在 Flash 内部有 2-3 个状态寄存器,指示出 Flash 当前的状态,有趣的一点是:

    当 Flash 内部在执行命令时,不能再执行 MCU 发来的命令,但是 MCU 可以一直读取状态寄存器,这下就很好办了,MCU可以一直读取,然后判断 Flash 是否忙完。

    /**
     * @brief     读取W25QXX的状态寄存器,W25Q64一共有2个状态寄存器
     * @param     reg  —— 状态寄存器编号(1~2)
     * @retval    状态寄存器的值
     */
    static uint8_t W25QXX_ReadSR(uint8_t reg)
    {
        uint8_t result = 0; 
        uint8_t send_buf[4] = {0x00,0x00,0x00,0x00};
        switch(reg)
        {
            case 1:
                send_buf[0] = READ_STATU_REGISTER_1;
            case 2:
                send_buf[0] = READ_STATU_REGISTER_2;
            case 0:
            default:
                send_buf[0] = READ_STATU_REGISTER_1;
        }
        
         /* 使能片选 */
        HAL_GPIO_WritePin(W25Q64_CHIP_SELECT_GPIO_Port, W25Q64_CHIP_SELECT_Pin, GPIO_PIN_RESET);
        
        if (HAL_OK == SPI_Transmit(send_buf, 4)) 
        {
            if (HAL_OK == SPI_Receive(&result, 1)) 
            {
                HAL_GPIO_WritePin(W25Q64_CHIP_SELECT_GPIO_Port, W25Q64_CHIP_SELECT_Pin, GPIO_PIN_SET);
                
                return result;
            }
        }
        
        /* 取消片选 */
        HAL_GPIO_WritePin(W25Q64_CHIP_SELECT_GPIO_Port, W25Q64_CHIP_SELECT_Pin, GPIO_PIN_SET);
    
        return 0;
    }
    

    然后编写阻塞判断 Flash 是否忙碌的函数:

    /**
     * @brief	阻塞等待Flash处于空闲状态
     * @param   none
     * @retval  none
     */
    static void W25QXX_Wait_Busy(void)
    {
        while((W25QXX_ReadSR(1) & 0x01) == 0x01); // 等待BUSY位清空
    }