STM32H750片外QSPI下载算法文件(stldr)生成

2024-04-25 20:36

本文主要是介绍STM32H750片外QSPI下载算法文件(stldr)生成,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

STM32H750片外QSPI下载算法文件(stldr)生成


  • 🌿相关篇《STM32H750片外QSPI启动配置简要》
  • 📌参考实现资料:
    • https://github.com/lchnu/STM32H750XBH_ARTPIQSPI_W25Q64JV
    • https://gitee.com/wangchief/H750_W25QXX
  • ✨利用以上资料中的任意一个,即可实现的是片外QSPI下载算法文件(stldr)的生成,(结合参考下面贴出的重要参考信息进行修改,即可实现。)可以方便针对STM32CubeProgrammerSTM32CubeIDE工具软件,对片外QSPI Flash进行下载。
  • 🎉需要注意一点的是,上面的参考资料,对于大部分人手上的硬件,可能都不一样,需要有针对性的做调整和修改,才能用。
  • 📍STM32H750片外QSPI下载算法文件(.FLM)生成,可以参考资料:https://www.armbbs.cn/forum.php?mod=viewthread&tid=101586
  • 🔖片外QSPI下载算法文件(.FLM)文件是,针对MDK Keil开发环境需要使用到的。
  • ⚡同样的(.FLM)文件通过STM32 ST-LINK Utility 4.6工具测试,无法烧录,使用STM32CubeProgrammer没有问题。
🔰(.stldr)文件和(.FLM)文件的生成,都是基于MDK KEIL工程生成的。工程并不是通用的。(利用生成.FLM的工程区生成.stldr文件是没法识别的。)

⛳移植重点

  • 🌿QSPI引脚定义:(具体引脚根据硬件连接进行调整)
    在这里插入图片描述
#define QSPI_CLK_ENABLE()               __HAL_RCC_QSPI_CLK_ENABLE()
#define QSPI_CLK_DISABLE()              __HAL_RCC_QSPI_CLK_DISABLE()
#define QSPI_CS_GPIO_CLK_ENABLE()       __HAL_RCC_GPIOB_CLK_ENABLE()
#define QSPI_CLK_GPIO_CLK_ENABLE()      __HAL_RCC_GPIOB_CLK_ENABLE()
#define QSPI_BK1_D0_GPIO_CLK_ENABLE()   __HAL_RCC_GPIOD_CLK_ENABLE()
#define QSPI_BK1_D1_GPIO_CLK_ENABLE()   __HAL_RCC_GPIOD_CLK_ENABLE()
#define QSPI_BK1_D2_GPIO_CLK_ENABLE()   __HAL_RCC_GPIOE_CLK_ENABLE()
#define QSPI_BK1_D3_GPIO_CLK_ENABLE()   __HAL_RCC_GPIOD_CLK_ENABLE()#define QSPI_MDMA_CLK_ENABLE()          __HAL_RCC_MDMA_CLK_ENABLE()
#define QSPI_FORCE_RESET()              __HAL_RCC_QSPI_FORCE_RESET()
#define QSPI_RELEASE_RESET()            __HAL_RCC_QSPI_RELEASE_RESET()#define QSPI_CS_PIN                     GPIO_PIN_6   //注意修改
#define QSPI_CS_GPIO_PORT               GPIOB
#define QSPI_CS_GPIO_AF                 GPIO_AF10_QUADSPI //注意修改 GPIO_AF10_QUADSPI GPIO_AF9_QUADSPI#define QSPI_CLK_PIN                    GPIO_PIN_2
#define QSPI_CLK_GPIO_PORT              GPIOB
#define QSPI_CLK_GPIO_AF                GPIO_AF9_QUADSPI#define QSPI_BK1_D0_PIN                 GPIO_PIN_11
#define QSPI_BK1_D0_GPIO_PORT           GPIOD
#define QSPI_BK1_D0_GPIO_AF             GPIO_AF9_QUADSPI#define QSPI_BK1_D1_PIN                 GPIO_PIN_12
#define QSPI_BK1_D1_GPIO_PORT           GPIOD
#define QSPI_BK1_D1_GPIO_AF             GPIO_AF9_QUADSPI#define QSPI_BK1_D2_PIN                 GPIO_PIN_2
#define QSPI_BK1_D2_GPIO_PORT           GPIOE
#define QSPI_BK1_D2_GPIO_AF             GPIO_AF9_QUADSPI#define QSPI_BK1_D3_PIN                 GPIO_PIN_13
#define QSPI_BK1_D3_GPIO_PORT           GPIOD
#define QSPI_BK1_D3_GPIO_AF             GPIO_AF9_QUADSPI
void HAL_QSPI_MspInit(QSPI_HandleTypeDef *hqspi)
{GPIO_InitTypeDef GPIO_InitStruct;/* 使能QPSI时钟  */QSPI_CLK_ENABLE();/* 复位时钟接口 */QSPI_FORCE_RESET();QSPI_RELEASE_RESET();    /* 使能GPIO时钟 */QSPI_CS_GPIO_CLK_ENABLE();QSPI_CLK_GPIO_CLK_ENABLE();QSPI_BK1_D0_GPIO_CLK_ENABLE();QSPI_BK1_D1_GPIO_CLK_ENABLE();QSPI_BK1_D2_GPIO_CLK_ENABLE();QSPI_BK1_D3_GPIO_CLK_ENABLE();/* QSPI CS GPIO 引脚配置 */GPIO_InitStruct.Pin = QSPI_CS_PIN;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;GPIO_InitStruct.Alternate = QSPI_CS_GPIO_AF;HAL_GPIO_Init(QSPI_CS_GPIO_PORT, &GPIO_InitStruct);/* QSPI CLK GPIO 引脚配置 */GPIO_InitStruct.Pin = QSPI_CLK_PIN;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Alternate = QSPI_CLK_GPIO_AF;HAL_GPIO_Init(QSPI_CLK_GPIO_PORT, &GPIO_InitStruct);/* QSPI D0 GPIO pin 引脚配置 */GPIO_InitStruct.Pin = QSPI_BK1_D0_PIN;GPIO_InitStruct.Alternate = QSPI_BK1_D0_GPIO_AF;HAL_GPIO_Init(QSPI_BK1_D0_GPIO_PORT, &GPIO_InitStruct);/* QSPI D1 GPIO 引脚配置 */GPIO_InitStruct.Pin = QSPI_BK1_D1_PIN;GPIO_InitStruct.Alternate = QSPI_BK1_D1_GPIO_AF;HAL_GPIO_Init(QSPI_BK1_D1_GPIO_PORT, &GPIO_InitStruct);/* QSPI D2 GPIO 引脚配置 */GPIO_InitStruct.Pin = QSPI_BK1_D2_PIN;GPIO_InitStruct.Alternate = QSPI_BK1_D2_GPIO_AF;HAL_GPIO_Init(QSPI_BK1_D2_GPIO_PORT, &GPIO_InitStruct);/* QSPI D3 GPIO 引脚配置 */GPIO_InitStruct.Pin = QSPI_BK1_D3_PIN;GPIO_InitStruct.Alternate = QSPI_BK1_D3_GPIO_AF;HAL_GPIO_Init(QSPI_BK1_D3_GPIO_PORT, &GPIO_InitStruct);
}void HAL_QSPI_MspDeInit(QSPI_HandleTypeDef *hqspi)
{/* 复位QSPI引脚 */HAL_GPIO_DeInit(QSPI_CS_GPIO_PORT, QSPI_CS_PIN);HAL_GPIO_DeInit(QSPI_CLK_GPIO_PORT, QSPI_CLK_PIN);HAL_GPIO_DeInit(QSPI_BK1_D0_GPIO_PORT, QSPI_BK1_D0_PIN);HAL_GPIO_DeInit(QSPI_BK1_D1_GPIO_PORT, QSPI_BK1_D1_PIN);HAL_GPIO_DeInit(QSPI_BK1_D2_GPIO_PORT, QSPI_BK1_D2_PIN);HAL_GPIO_DeInit(QSPI_BK1_D3_GPIO_PORT, QSPI_BK1_D3_PIN);/* 复位QSPI */QSPI_FORCE_RESET();QSPI_RELEASE_RESET();/* 关闭QSPI时钟 */QSPI_CLK_DISABLE();
}
  • 🌿 FlashDevice结构体信息(需要根据QSPI flash容量进行配置)
/* This structure containes information used by ST-LINK Utility to program and erase the device */
#if defined(__ICCARM__)
__root struct StorageInfo const StorageInfo = {
#else
struct StorageInfo const StorageInfo = {
#endif"STM32H750_ART_W25Q64JV",    // Device Name + EVAL Borad nameSPI_FLASH,                 // Device Type0x90000000,                // Device Start Address0x00800000,                // Device Size in Bytes (8MBytes)0x1000,                    // Programming Page Size 256Bytes0xFF,                      // Initial Content of Erased Memory// Specify Size and Address of Sectors (view example below){{0x00000800, 0x00001000,},     // Sector Num : 2048 ,Sector Size: 4KBytes{0x00000000, 0x00000000,}}
};
  • 🌿时钟信息(时钟源可以选择;外部时钟源、内部时钟源)
/*** @brief System Clock Configuration* @retval None*  HSE:25MHz*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
//  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};/** Supply configuration update enable*/HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);/** Configure the main internal regulator output voltage*/__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLM = 5;RCC_OscInitStruct.PLL.PLLN = 192;RCC_OscInitStruct.PLL.PLLP = 2;RCC_OscInitStruct.PLL.PLLQ = 2;RCC_OscInitStruct.PLL.PLLR = 2;RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;RCC_OscInitStruct.PLL.PLLFRACN = 0;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB buses clocks*/RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2|RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK){Error_Handler();}/*使用IO的高速模式,要使能IO补偿,即调用下面三个函数 (1)使能CSI clock(2)使能SYSCFG clock(3)使能I/O补偿单元, 设置SYSCFG_CCCSR寄存器的bit0*/__HAL_RCC_CSI_ENABLE() ;__HAL_RCC_SYSCFG_CLK_ENABLE() ;HAL_EnableCompensationCell();__HAL_RCC_D2SRAM1_CLK_ENABLE();__HAL_RCC_D2SRAM2_CLK_ENABLE();__HAL_RCC_D2SRAM3_CLK_ENABLE();
}

🛠STM32CubeProgrammer配置(.FLM)文件

  • 🌿打开STM32CubeProgrammer软件前,将(.FLM)文件拷贝到指定目录:D:\Program Files\STMicroelectronics\STM32Cube\STM32CubeProgrammer\bin\ExternalLoader
    在这里插入图片描述

  • 🌿加载(.FLM)文件
    在这里插入图片描述
    在这里插入图片描述

这篇关于STM32H750片外QSPI下载算法文件(stldr)生成的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/935721

相关文章

Python pip下载包及所有依赖到指定文件夹的步骤说明

《Pythonpip下载包及所有依赖到指定文件夹的步骤说明》为了方便开发和部署,我们常常需要将Python项目所依赖的第三方包导出到本地文件夹中,:本文主要介绍Pythonpip下载包及所有依... 目录步骤说明命令格式示例参数说明离线安装方法注意事项总结要使用pip下载包及其所有依赖到指定文件夹,请按照以

Python实现自动化Word文档样式复制与内容生成

《Python实现自动化Word文档样式复制与内容生成》在办公自动化领域,高效处理Word文档的样式和内容复制是一个常见需求,本文将展示如何利用Python的python-docx库实现... 目录一、为什么需要自动化 Word 文档处理二、核心功能实现:样式与表格的深度复制1. 表格复制(含样式与内容)2

python如何生成指定文件大小

《python如何生成指定文件大小》:本文主要介绍python如何生成指定文件大小的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python生成指定文件大小方法一(速度最快)方法二(中等速度)方法三(生成可读文本文件–较慢)方法四(使用内存映射高效生成

Maven项目中集成数据库文档生成工具的操作步骤

《Maven项目中集成数据库文档生成工具的操作步骤》在Maven项目中,可以通过集成数据库文档生成工具来自动生成数据库文档,本文为大家整理了使用screw-maven-plugin(推荐)的完... 目录1. 添加插件配置到 pom.XML2. 配置数据库信息3. 执行生成命令4. 高级配置选项5. 注意事

MybatisX快速生成增删改查的方法示例

《MybatisX快速生成增删改查的方法示例》MybatisX是基于IDEA的MyBatis/MyBatis-Plus开发插件,本文主要介绍了MybatisX快速生成增删改查的方法示例,文中通过示例代... 目录1 安装2 基本功能2.1 XML跳转2.2 代码生成2.2.1 生成.xml中的sql语句头2

python如何下载网络文件到本地指定文件夹

《python如何下载网络文件到本地指定文件夹》这篇文章主要为大家详细介绍了python如何实现下载网络文件到本地指定文件夹,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下...  在python中下载文件到本地指定文件夹可以通过以下步骤实现,使用requests库处理HTTP请求,并结合o

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

使用Python自动化生成PPT并结合LLM生成内容的代码解析

《使用Python自动化生成PPT并结合LLM生成内容的代码解析》PowerPoint是常用的文档工具,但手动设计和排版耗时耗力,本文将展示如何通过Python自动化提取PPT样式并生成新PPT,同时... 目录核心代码解析1. 提取 PPT 样式到 jsON关键步骤:代码片段:2. 应用 JSON 样式到

SpringBoot实现二维码生成的详细步骤与完整代码

《SpringBoot实现二维码生成的详细步骤与完整代码》如今,二维码的应用场景非常广泛,从支付到信息分享,二维码都扮演着重要角色,SpringBoot是一个非常流行的Java基于Spring框架的微... 目录一、环境搭建二、创建 Spring Boot 项目三、引入二维码生成依赖四、编写二维码生成代码五

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I