STM32H750片外QSPI启动配置简要

STM32H750片外QSPI启动配置简要


  • 📍参考信息源:《STM32H750片外Flash启动(W25Q64JVSIQ)》
  • 🔖本例程基于Keil MDk开发平台。
  • 🍁配置框架:
    在这里插入图片描述
✨为什么使用要使用QSPI启动方式
不管对于STM32H7系列单片机,还是其他单片机,其自身内部自带的flash容量都是很有限的,容量越大,价格翻倍。QSPI启动方式就是,将主控程序放置到外部SPI flash当中,这样程序空间可以做到很大,仅需要占用一个QSPI硬件接口。同时也方便程序的更新和维护。

🔨QSPI Flash的MDK下载算法制作

  • 🌿以上面的参考源为例。这里以我使用的W25Q64JVSSIQ为例,这是一颗8MB的 SPI flash。
  • 🌿 在FlashDev.c文件中,找到有关宏FLASH_MEM的定义内容,填写对应的参数
#ifdef FLASH_MEM
struct FlashDevice const FlashDevice  =  {
    FLASH_DRV_VERS,                   /* 驱动版本,勿修改,这个是MDK定的 */
    "DIY_STM32H7x_QSPI_W25Q64B",    /* 算法名,添加算法到MDK安装目录会显示此名字 */
    EXTSPI,                           /* 设备类型 */
    0x90000000,                       /* Flash起始地址 */
    8 * 1024 * 1024,                  /* Flash大小,8MB */
    1024,                             /* 编程页大小 */
    0,                                /* 保留,必须为0 */
    0xFF,                             /* 擦除后的数值 */
    1000,                             /* 页编程等待时间 */
    6000,                             /* 扇区擦除等待时间 */
    4 * 1024, 0x000000,               /* 扇区大小,扇区地址 */
    SECTOR_END    
};
#endif 
  • 🌿主控时钟可以和后面的Bootloader程序以及APP程序的时钟初始化一样的。可以直接拷贝过来。
    • 🌿生成的下载算法文件,拷贝到Keil安装目录下的ARM/flash文件夹内,例如:D:\Keil_v5\ARM\Flash

🔧QSPI信息STM32CubeMX软件配置

  • 🔖也就是STM32h7主控搭载的QSPI flash硬件信息填写
  • 🌿QSPI信息配置:后面的的Bootloader程序里面,也保持相同配置。
    在这里插入图片描述
  • 🔖我这里NCS引脚使用的是PB6引脚,
void MX_QUADSPI_Init(void)
{

  /* USER CODE BEGIN QUADSPI_Init 0 */

  /* USER CODE END QUADSPI_Init 0 */

  /* USER CODE BEGIN QUADSPI_Init 1 */

  /* USER CODE END QUADSPI_Init 1 */
  hqspi.Instance = QUADSPI;
  hqspi.Init.ClockPrescaler = 3;//针对HCLK3分频
  hqspi.Init.FifoThreshold = 32;
  hqspi.Init.SampleShifting = QSPI_SAMPLE_SHIFTING_HALFCYCLE;
  hqspi.Init.FlashSize = 24;
  hqspi.Init.ChipSelectHighTime = QSPI_CS_HIGH_TIME_2_CYCLE;
  hqspi.Init.ClockMode = QSPI_CLOCK_MODE_0;
  hqspi.Init.FlashID = QSPI_FLASH_ID_1;
  hqspi.Init.DualFlash = QSPI_DUALFLASH_DISABLE;
  if (HAL_QSPI_Init(&hqspi) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN QUADSPI_Init 2 */

  /* USER CODE END QUADSPI_Init 2 */

}

📘APP程序程序配置

  • ⚡APP应用程序的IROM1起始地址,一定要和Bootloader程序中的程序跳转地址是一致的才行。
  • 🌿IROM1起始地址配置:(注意这里是0x90000000
    在这里插入图片描述

  • 🔰 Bootloader程序IROM1起始地址保持默认的0x8000000地址位。不要改。
    在这里插入图片描述

  • 🌿APP程序下载和更新,算法文件配置:
    在这里插入图片描述

  • ⚡上面的下载时的RAM大小是1000,需要该大一点,否则下载时会报错。

⛳采坑注意事项

🔰参数差异
  • 🔱由于每个人所使用的主控不同,时钟频率不一样,又或者配置的外置spi flash容量和引脚复用不同,上面的资源参考中,仅仅提供的是一个模板,需要根据个人所使用的硬件差异和参数进行稍微改动。
  • 在个人首次移植时,需要对自己手上的硬件信息有个,基本的了解,主控搭载的外部晶振频率、SPI flash容量、以及flash引脚与主控对应连接的脚位。
  • spi flash容量参数直接根据个人具体型号直接在工程中填写。如果不知道的可以烧录Bootloader程序时启用串口和启用BspQspiBoot_Test()测试函数,并其中插入调试打印信息。
void BspQspiBoot_Test(void)
{
  bool bTestResult = true;
  uint8_t ucTestCnt;
  uint32_t ulTestAddr;
  uint32_t ulSectorAddr = 0x2000;

  ulFlashID = BspQspiBoot_ReadID();

  //  if(ulFlashID != 0x00EF4018) //16MB:15679512
  if (ulFlashID != 0x00EF4017) // 8MB:15679511
  {
    bTestResult = false;
  }
  else
    HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin | LED3_Pin, GPIO_PIN_RESET);

  while (bTestResult == false)
  {

    HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin | LED2_Pin | LED3_Pin);
    HAL_Delay(800);
    //		printf("FlashID:%d \r\n",ulFlashID);//查看容量,十进制的
  }

  BspQspiBoot_EraseSector(ulSectorAddr);

  for (ucTestCnt = 0; ucTestCnt < 16; ucTestCnt++)
  {
    ulTestAddr = ulSectorAddr + (ucTestCnt * QSPI_FLASH_PAGE_SIZE);

    {
      uint16_t i;

      for (i = 0; i < sizeof(ucaTestBuff); i++)
      {
        ucaTestBuff[i] = i;
      }
    }

    BspQspiBoot_WritePage(ucaTestBuff, ulTestAddr, sizeof(ucaTestBuff));

    memset(ucaTestBuff, 0, sizeof(ucaTestBuff));

    BspQspiBoot_ReadBuff(ucaTestBuff, ulTestAddr, sizeof(ucaTestBuff));

    {
      uint16_t i;

      for (i = 0; i < sizeof(ucaTestBuff); i++)
      {
        if (ucaTestBuff[i] != i)
        {
          bTestResult = false;
          break;
        }
      }
    }
  }

  while (bTestResult == false)
    ;

  while (1)
  {
  }
}

  • 🌿外部时钟时钟初始化函数可以通过STM32CubeMX配置设定好参数自动生成工程,然后拷贝对应的时钟初始化函数到工程中进行替换。来匹配个人使用的主控芯片。

  • 🌿QSP NCS引脚复用调整:

#define QSPI_CS_PIN GPIO_PIN_6 // 注意修改 GPIO_PIN_10
#define QSPI_CS_GPIO_PORT GPIOB
#define QSPI_CS_GPIO_AF GPIO_AF10_QUADSPI // 注意修改 GPIO_AF9_QUADSPI

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VGG:更小的卷积核

“paddingvalid”&#xff0c;表示不对输入数据进行填充(不填充)“paddingsame”&#xff0c;表示对输入数据进行填充&#xff0c;使得输出特征图的大小与输入特征图的大小相同 VGG16 网络架构 Why VGG16 VGG16 卷积层 全连接层层数 1个输出层 更小的卷积核 连续的33卷积…

换手机后日记不见了怎么恢复?换手机日记内容同步方法

曾经&#xff0c;我使用的是一款苹果手机&#xff0c;这部手机陪伴了我整整3年。随着时间的推移&#xff0c;手机内存不够用成为了我面临的一个大问题&#xff0c;因此我决定更换一部新手机——这次我选择了OPPO品牌。在更换手机的过程中&#xff0c;我利用手机搬家软件一键同步…

AI辅助研发对医药、汽车和电子行业的影响

目录 1、医药行业&#xff1a;加速药物发现与开发 2、汽车行业&#xff1a;创新设计与生产 3、电子行业&#xff1a;优化芯片设计 4、展望未来 AI辅助研发正逐渐改变我们的世界&#xff0c;特别是在医药、汽车和电子等关键行业中的应用&#xff0c;已经展现出其巨大潜力。本…

支付宝开放平台,证书验签出错,请确认charset参数放在了URL查询字符串中且各参数值使用charset参数指示的字符集编码

#小李子9479# 支付宝证书接入方式的时候出现如下错误 验签出错&#xff0c;请确认charset参数放在了URL查询字符串中且各参数值使用charset参数指示的字符集编码 产生的原因分析&#xff1a; 1。验证签名里面有中文 2。在json_encode的时候使用了JSON_UNESCAPED_UNICODE参数…

【字符串】【贪心】【 树状数组】2193. 得到回文串的最少操作次数

作者推荐 视频算法专题 本文涉及知识点 字符串 贪心 树状数组 分类讨论 LeetCode2193. 得到回文串的最少操作次数 给你一个只包含小写英文字母的字符串 s 。 每一次 操作 &#xff0c;你可以选择 s 中两个 相邻 的字符&#xff0c;并将它们交换。 请你返回将 s 变成回文串…

mysql-DBA(2)-日志-数据库复制

1.mysqlbinlog 查看日志-精确查找-增量备份 1.1查看日志 mysqlbinlog binlog.000003 -vv --base64auto | less //两种都有 base64加密和看的懂的明文 mysqlbinlog binlog.000003 -vv --base64never | less //不显示 mysqlbinlog binlog.000003 -vv --base64decode-rows …

Flask python开发篇: 写一个简单的接口

第一步&#xff1a;新建flask项目 参考使用pycharm新建一个项目 打开pycharm&#xff0c;根据下面图中箭头顺序&#xff0c;新建一个flask的项目&#xff1b; 第二步&#xff1a;运行项目&#xff0c; 安装成功以后&#xff0c;会有个app.py文件&#xff0c;打开以后&#…

STM32CubeIDE基础学习-STM32CubeIDE软件程序下载方法

STM32CubeIDE基础学习-STM32CubeIDE软件代码下载方法 文章目录 STM32CubeIDE基础学习-STM32CubeIDE软件代码下载方法前言第1章 代码下载第2章 下载器固件更新总结 前言 编写完代码&#xff0c;一般都会选择在线下载程序的方式进行验证该程序是否正确&#xff0c;如果发现结果和…

回收站选址(CCF 201912-2)解题思路

分析 把x,y坐标拼接成一个字符串&#xff08;x,y&#xff09;作为Set的key&#xff0c;保存到Set中&#xff0c;遍历Set&#xff0c;取出坐标&#xff0c;然后判断上下左右四个点是否在Set中&#xff0c;如果在&#xff0c;进而判断&#xff0c;四个角是否在Set中&#xff0c;…

搜索引擎推广6种策略助你站在市场顶峰的有效方法-华媒舍

如何有效推广自己的产品或服务变得至关重要。6种引擎霸屏推广策略是帮助你站在市场顶峰的有效方法&#xff0c;下面将逐一介绍这些策略。 1.搜索引擎优化&#xff08;SEO&#xff09; 搜索引擎优化是提升网站在搜索引擎结果页&#xff08;SERP&#xff09;中排名的策略。通过…

股票价格预测项目

项目介绍 背景 股票价格预测一直是金融领域的热点问题。准确的预测可以帮助投资者作出更明智的决策。本项目旨在使用机器学习技术&#xff0c;特别是长短期记忆网络&#xff08;LSTM&#xff09;&#xff0c;来预测股票价格。 目标 开发一个基于LSTM的股票价格预测模型。使…

Mamba-minimal Mamba的最小限度实现 (二)

文章目录 链接导入所需包class ModelArgsclass Mambadef __ init __def forward class ResidualBlockclass RNSNorm文本生成demo manba的简单最小限度实现&#xff0c;和原始论文实现 state-spaces/mamba (github.com)相比&#xff0c;为了可读性对参数没有很好的初始化&#…

c++ 常用的STL

前言 写这篇博客目的是为了记录在刷算法题中使用过的STL&#xff0c;因为有些不太常用的会遗忘。这篇博客只是作为笔记&#xff0c;不是详细的STL&#xff0c;因此只会对常用方法说明&#xff0c;不会详细介绍。此外在后面用到新的STL内容时会再补充。 列队 基础列队 基本列…

Prompt进阶系列1:LangGPT(从编程语言反思LLM的结构化可复用提示设计框架)

Prompt进阶系列1:LangGPT(从编程语言反思LLM的结构化可复用提示设计框架) 大语言模型 (Large Language Models, LLMs) 在不同领域都表现出了优异的性能。然而&#xff0c;对于非AI专家来说&#xff0c;制定高质量的提示来引导 LLMs 是目前AI应用领域的一项重要挑战。现有的提示…

ARM/Linux嵌入式面经(二):芯片原厂

uart如何进行通信&#xff0c;模块发给uart数据信息后经历了什么 UART&#xff08;Universal Asynchronous Receiver/Transmitter&#xff0c;通用异步收发传输器&#xff09;是一种用于串行通信的协议&#xff0c;它使用一对传输线&#xff08;TX和RX&#xff09;进行双向通信…

阿里云服务器地域所在城市分布表_北京杭州深圳及全球区域

2024年最新阿里云服务器地域分布表&#xff0c;地域指数据中心所在的地理区域&#xff0c;通常按照数据中心所在的城市划分&#xff0c;例如华北2&#xff08;北京&#xff09;地域表示数据中心所在的城市是北京。阿里云地域分为四部分即中国、亚太其他国家、欧洲与美洲和中东&…

Autodl中tar.gz无法解压问题

在云服务器中&#xff0c;我们常把文件压缩转移至其他实例中&#xff0c;但是我们有时会发现&#xff0c;压缩可以但是解压缩却遇到了问题&#xff0c;下面给出了正确的压缩和解压指令。 1 压缩 tar -cvf archieve.tar.gz aaa(archieve.tar.gz为压缩后的压缩包名称&#xff0c…

【Java.mysql】——增删查改(CRUD)之 增查(CR) 附加数据库基础知识

目录 &#x1f6a9;数据库操作 &#x1f388;创建数据库 &#x1f388;使用数据库 &#x1f388;删除数据库 &#x1f6a9;数据类型 &#x1f6a9;表的操作 &#x1f388;创建表 &#x1f308;查看表结构 &#x1f388;删除表 ❗练习(综合运用) &#x1f5a5;️新增…

【黑马程序员】STL实战--演讲比赛管理系统

文章目录 演讲比赛管理系统需求说明比赛规则程序功能 创建管理类功能描述创建演讲比赛管理类 菜单功能添加菜单成员函数声明菜单成员函数实现菜单功能测试 退出功能添加退出功能声明退出成员函数实现退出功能测试 演讲比赛功能功能分析创建选手类比赛成员属性添加初始化属性创建…

KVM技术原理及安装KVM并且在KVM里面安装RHEL8

目录 一、kvm原理 1..1虚拟化概念 1.2 虚拟化产生背景 1.3虚拟化架构 1.4主流的虚拟化技术 1.5阐述个人对虚拟化技术的几种分类认知 二、安装KVM并且在KVM里面安装RHEL8 2.1在RHEL8主机上安装KVM 2.2安装完成后&#xff0c;使用virt-manager命令打开虚拟机管理图形界面…