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

news2024/11/16 5:35:59

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 name
    SPI_FLASH,                 // Device Type
    0x90000000,                // Device Start Address
    0x00800000,                // Device Size in Bytes (8MBytes)
    0x1000,                    // Programming Page Size 256Bytes
    0xFF,                      // Initial Content of Erased Memory
                               // Specify Size and Address of Sectors (view example below)
    {{0x00000800, 0x00001000,},     // Sector Num : 2048 ,Sector Size: 4KBytes
    {0x00000000, 0x00000000,}}
};
  • 🌿时钟信息(时钟源可以选择;外部时钟源、内部时钟源)
    • 🎉时钟主频推荐配置为400MHz,,QSPI挂载在AHB总线线上,STM32H7 QSPI在SDR模式下最高133MHz,DDR模式-双倍数据速率模式:100MHz.
      在这里插入图片描述
/*********************************************************************************************************
*	函 数 名: SystemClock_Config
*	功能说明: 初始化系统时钟
*            	System Clock source            = PLL (HSE)
*            	SYSCLK(Hz)                     = 400000000 (CPU Clock)
*           	HCLK(Hz)                       = 200000000 (AXI and AHBs Clock)
*            	AHB Prescaler                  = 2
*            	D1 APB3 Prescaler              = 2 (APB3 Clock  100MHz)
*            	D2 APB1 Prescaler              = 2 (APB1 Clock  100MHz)
*            	D2 APB2 Prescaler              = 2 (APB2 Clock  100MHz)
*            	D3 APB4 Prescaler              = 2 (APB4 Clock  100MHz)
*            	HSE Frequency(Hz)              = 25000000
*           	PLL_M                          = 5
*            	PLL_N                          = 160
*            	PLL_P                          = 2
*            	PLL_Q                          = 4
*            	PLL_R                          = 2
*            	VDD(V)                         = 3.3
*            	Flash Latency(WS)              = 4
*	形    参: 无
*********************************************************************************************************
*/
void SystemClock_Config(void)
{
	RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
	RCC_OscInitTypeDef RCC_OscInitStruct = {0};

	/* 锁住SCU(Supply configuration update) */
	MODIFY_REG(PWR->CR3, PWR_CR3_SCUEN, 0);

	/* 
      1、芯片内部的LDO稳压器输出的电压范围,可选VOS1,VOS2和VOS3,不同范围对应不同的Flash读速度,
         详情看参考手册的Table 12的表格。
      2、这里选择使用VOS1,电压范围1.15V - 1.26V。
    */
	__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

	while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}

	/* 使能HSE,并选择HSE作为PLL时钟源 */
	RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
	RCC_OscInitStruct.HSEState = RCC_HSE_ON;
	RCC_OscInitStruct.HSIState = RCC_HSI_OFF;
	RCC_OscInitStruct.CSIState = RCC_CSI_OFF;
	RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
	RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
		
	RCC_OscInitStruct.PLL.PLLM = 5;
	RCC_OscInitStruct.PLL.PLLN = 160;
	RCC_OscInitStruct.PLL.PLLP = 2;
	RCC_OscInitStruct.PLL.PLLR = 2;
	RCC_OscInitStruct.PLL.PLLQ = 4;		
		
	RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
	RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;	
	 HAL_RCC_OscConfig(&RCC_OscInitStruct);

	/* 
       选择PLL的输出作为系统时钟
       配置RCC_CLOCKTYPE_SYSCLK系统时钟
       配置RCC_CLOCKTYPE_HCLK 时钟,对应AHB1,AHB2,AHB3和AHB4总线
       配置RCC_CLOCKTYPE_PCLK1时钟,对应APB1总线
       配置RCC_CLOCKTYPE_PCLK2时钟,对应APB2总线
       配置RCC_CLOCKTYPE_D1PCLK1时钟,对应APB3总线
       配置RCC_CLOCKTYPE_D3PCLK1时钟,对应APB4总线     
    */
	RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_D1PCLK1 | RCC_CLOCKTYPE_PCLK1 | \
								 RCC_CLOCKTYPE_PCLK2  | RCC_CLOCKTYPE_D3PCLK1);

	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; 
	
	/* 此函数会更新SystemCoreClock,并重新配置HAL_InitTick */
	 HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4);


    /*
      使用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)文件
    在这里插入图片描述
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1630669.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

链路层安全扩展——L2TP协议

链路层安全扩展——L2TP协议 PPP协议 协议概念 说到数据链路层的安全协议,我们不得不先提一下PPP协议,后面的PAP、CHAP与L2TP协议都是围绕它展开的。(PPP不是本文重点,很多细节没有提到,到时候会专开一篇文章讲PPP&…

Java 8 Stream API的使用

一、什么是Stream? Stream(流)是一个来自数据源的元素队列,它可以支持聚合操作。 数据源:流的数据来源,构造Stream对象的数据源,比如通过一个List来构造Stream对象,这个List就是数…

ardupilot开发 --- RealSense-D400 篇

目录 0. 一些概念1. 用windows检查设备是否正常1. 使用 Intel RealSense SDK 2.0 查看相机图像数据 0. 一些概念 官网:添加链接描述选型:D455 1. 用windows检查设备是否正常 用USB连接D455与PC 下载 Intel.RealSense.Viewer.exe 并打开,设…

ACE框架学习3

ACE Acceptor-Connector框架 该框架实现 Acceptor-Connector 模式,该模式解除了“网络化应用中的协作对端服务的连接和初始化”与“连接和初始化之后它们所执行的处理”的耦合。Acceptor-Connector 框架允许成用独立于它们所提供的服务来配置其连接布局的关键属性。…

正版软件 | Reg Organizer - 适用于 Windows 的注册表清理工具软件 教程分享

什么是 Reg Organizer ? Reg Organizer 是一套用于维护和优化 Windows 操作系统的工具。 通过使用 Reg Organizer,您可以清理系统中无用的文件,优化启动应用程序,编辑 Windows 注册表,搜索和替换注册表项和值&#…

Xtuner微调笔记

Xtuner学习视频 两种微调范式 在指令微调的过程中,需要高质量的对话数据。 而构建高质量的对话(指令)数据,则涉及到以下流程 先通过system/user/assistant的json格式来构造对话模板,把问题和期望模型做出的回答通过…

Q1笔记本电脑线上市场发展现状:大盘下滑,深耕细分市场是机会

今年,宏观经济环境的恶化和笔记本电脑需求的持续放缓,导致全球笔记本电脑出货量,尤其是线上市场的整体状态不容乐观。 根据鲸参谋数据显示,今年Q1笔记本在线上市场(京东天猫淘宝)综合销量约250万件&#x…

如何禁用WordPress的自动更新(包括主题、插件和核心文件)

这几天发现我的一个网站突然打不开了,提示“此站点遇到了致命错误”,如图: 这个网站一直都是正常运行的,最近也没有过什么更新,按理说不应该会出现问题,我担心可能是主机方面做了什么调整导致,所以联系了Ho…

ShaderLab的混合命令

文章目录 示例原理混合因子混合操作参考 示例 Pass {Tags{"LightMode" "ForwardBase"}// 关闭深度写入ZWrite Off// 设置Pass的混合模式,SrcAlpha: 片元着色器产生的颜色的混合因子// OneMinusSrcAlpha 已经存在于颜色缓冲中的颜色的混合因子…

idea 的使用和安装 以及简介

Java开发工具 大家刚才写代码的时候都是用记事本写的,但是有没有觉得记事本写代码不太方便啊!记事本写代码单词写错了没有提示,格式也不好调整,写代码之后还需要我们到命令行使用javac命令手动编译,然后运行。 有没有一…

[NISACTF 2022]bilala的二维码

​​​​​​​NSSCTF{M0RS34ND282X231} 还有一个是像素我找不到

Docker 简单使用及安装常用软件

一、Docker 安装、配置与卸载 1.1、Docker 安装 # 1.安装gcc环境 yum -y install gcc gcc-c && \# 2. 卸载docker旧版本(可能之前有安装) yum -y remove docker docker-common docker-selinux docker-engine && \# 3. 安装依赖的软件包…

易错知识点(学习过程中不断记录)

快捷键专区: 注释:ctrl/ ctrlshift/ 保存:ctrls 调试: 知识点专区: 1基本数据类型 基本数据类型有四类:整型、浮点型、字符型、布尔型(Boolean), 分为八种&#xff…

房产中介小程序高效开发攻略:从模板到上线一站式服务

对于房产中介而言,拥有一个高效且用户友好的小程序是提升业务、增强客户黏性的关键。而采用直接复制模板的开发方式,无疑是实现这一目标的最佳途径,不仅简单快捷,而且性价比极高。 在众多小程序模板开发平台中,乔拓云网…

国外企业使用生成式人工智能实例100

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

电脑使用笔记

1.电脑亮度调节 亮度:50 对比度:45 暗部平衡:40

Unity inputSystem 读取输入值的方法

1:通过关在 PlayerInput 获取 设置后之后在同意物体上挂载C# 脚本 通过事件获得 2: 生成 C#脚本 通过C# 脚本获得 3:通过回调函数

计算机网络——应用层协议(1)

在这篇文章初识网络中,我介绍了关于计算机网络的相关知识,以及在这两篇文章中Socket编程和Socket编程——tcp,介绍了使用套接字在两种协议下的网络间通信方式。本篇文章中我将会进一步介绍网络中网络协议的部分,而这将会从应用层开…

如何修改php版本

我使用的Hostease的Windows虚拟主机产品,由于网站程序需要支持高版本的PHP,程序已经上传到主机,但是没有找到切换PHP以及查看PHP有哪些版本的位置,因此咨询了Hostease的技术支持,寻求帮助了解到可以实现在Plesk面板上找到此切换PHP版本的按钮…

学习100个Unity Shader (14) ---透明效果

文章目录 渲染队列透明度测试(Alpha Test)效果Shader 透明度混合(Alpha Blending)效果Shader 参考 渲染队列 由”Queue“ 标签决定,索引号越小越早被渲染: 名称队列索引号Background1000Geometry2000Alph…