一、移植注意事项
1、在运行外部FLASH存储的代码之前首先要初始化QSPI进入内存映射模式,参考代码:

//QSPI进入内存映射模式(执行QSPI代码必备前提,为了减少引入的文件,
//除了GPIO驱动外,其他的外设驱动均采用寄存器形式)
void QSPI_Enable_Memmapmode(void)
{unsigned int tempreg=0; volatile unsigned int *data_reg=&QUADSPI->DR;GPIO_InitTypeDef qspi_gpio;RCC->AHB4ENR|=1<<1;                         //使能PORTB时钟    RCC->AHB4ENR|=1<<5;                            //使能PORTF时钟    RCC->AHB3ENR|=1<<14;                           //QSPI时钟使能qspi_gpio.Pin=GPIO_PIN_6;                    //PB6 AF10  qspi_gpio.Mode=GPIO_MODE_AF_PP;qspi_gpio.Speed=GPIO_SPEED_FREQ_VERY_HIGH;qspi_gpio.Pull=GPIO_NOPULL;qspi_gpio.Alternate=GPIO_AF10_QUADSPI;HAL_GPIO_Init(GPIOB,&qspi_gpio);qspi_gpio.Pin=GPIO_PIN_2;                    //PB2 AF9   qspi_gpio.Alternate=GPIO_AF9_QUADSPI;HAL_GPIO_Init(GPIOB,&qspi_gpio);qspi_gpio.Pin=GPIO_PIN_6|GPIO_PIN_7;     //PF6,7 AF9 qspi_gpio.Alternate=GPIO_AF9_QUADSPI;HAL_GPIO_Init(GPIOF,&qspi_gpio);qspi_gpio.Pin=GPIO_PIN_8|GPIO_PIN_9;     //PF8,9 AF10        qspi_gpio.Alternate=GPIO_AF10_QUADSPI;HAL_GPIO_Init(GPIOF,&qspi_gpio);//QSPI设置,参考QSPI实验的QSPI_Init函数RCC->AHB3RSTR|=1<<14;          //复位QSPIRCC->AHB3RSTR&=~(1<<14);      //停止复位QSPIwhile(QUADSPI->SR&(1<<5));       //等待BUSY位清零 QUADSPI->CR=0X01000310;         //设置CR寄存器,这些值怎么来的,请参考QSPI实验/看H750参考手册寄存器描述分析QUADSPI->DCR=0X00160401;     //设置DCR寄存器QUADSPI->CR|=1<<0;              //使能QSPI //注意:QSPI QE位的使能,在QSPI烧写算法里面,就已经设置了//所以,这里可以不用设置QE位,否则需要加入对QE位置1的代码//不过,代码必须通过仿真器下载,直接烧录到外部QSPI FLASH,是不可用的//如果想直接烧录到外部QSPI FLASH也可以用,则需要在这里添加QE位置1的代码//W25QXX进入QPI模式(0X38指令)while(QUADSPI->SR&(1<<5));        //等待BUSY位清零 QUADSPI->CCR=0X00000138;        //发送0X38指令,W25QXX进入QPI模式while((QUADSPI->SR&(1<<1))==0);   //等待指令发送完成QUADSPI->FCR|=1<<1;             //清除发送完成标志位     //W25QXX写使能(0X06指令)while(QUADSPI->SR&(1<<5));        //等待BUSY位清零 QUADSPI->CCR=0X00000106;        //发送0X06指令,W25QXX写使能while((QUADSPI->SR&(1<<1))==0);   //等待指令发送完成QUADSPI->FCR|=1<<1;             //清除发送完成标志位 //W25QXX设置QPI相关读参数(0XC0)while(QUADSPI->SR&(1<<5));       //等待BUSY位清零 QUADSPI->CCR=0X030003C0;        //发送0XC0指令,W25QXX读参数设置QUADSPI->DLR=0;while((QUADSPI->SR&(1<<2))==0);  //等待FTF*(unsigned char *)data_reg=3<<4;          //设置P4&P5=11,8个dummy clocks,104MQUADSPI->CR|=1<<2;               //终止传输 while((QUADSPI->SR&(1<<1))==0);   //等待数据发送完成QUADSPI->FCR|=1<<1;             //清除发送完成标志位  while(QUADSPI->SR&(1<<5));        //等待BUSY位清零      //MemroyMap 模式设置while(QUADSPI->SR&(1<<5));        //等待BUSY位清零 QUADSPI->ABR=0;                 //交替字节设置为0,实际上就是W25Q 0XEB指令的,M0~M7=0tempreg=0XEB;                  //INSTRUCTION[7:0]=0XEB,发送0XEB指令(Fast Read QUAD I/O)tempreg|=3<<8;                    //IMODE[1:0]=3,四线传输指令tempreg|=3<<10;                    //ADDRESS[1:0]=3,四线传输地址tempreg|=2<<12;                  //ADSIZE[1:0]=2,24位地址长度tempreg|=3<<14;                  //ABMODE[1:0]=3,四线传输交替字节tempreg|=0<<16;                 //ABSIZE[1:0]=0,8位交替字节(M0~M7)tempreg|=6<<18;                    //DCYC[4:0]=6,6个dummy周期tempreg|=3<<24;                  //DMODE[1:0]=3,四线传输数据tempreg|=3<<26;                    //FMODE[1:0]=3,内存映射模式QUADSPI->CCR=tempreg;         //设置CCR寄存器//设置QSPI FLASH空间的MPU保护SCB->SHCSR&=~(1<<16);         //禁止MemManage MPU->CTRL&=~(1<<0);             //禁止MPUMPU->RNR=0;                      //设置保护区域编号为0(1~7可以给其他内存用)MPU->RBAR=0X90000000;          //基地址为0X9000 000,即QSPI的起始地址MPU->RASR=0X0303002D;            //设置相关保护参数(禁止共用,允许cache,允许缓冲),详见MPU实验的解析MPU->CTRL=(1<<2)|(1<<0);        //使能PRIVDEFENA,使能MPU SCB->SHCSR|=1<<16;               //使能MemManage
}

2、分散加载文件中,需要将没有开启QSPI内存映射之前的代码要放在内部FLASH。否则上电就会进入硬件中断。
分散加载文件参考如下:

#! armcc -E #define m_stmflash_start             0X08000000      //m_stmflash(STM32内部FLASH)域起始地址
#define m_stmflash_size                 0X20000         //m_stmflash(STM32内部FLASH)大小,H750是128KB#define m_qspiflash_start                0X90000000      //m_qspiflash(外扩QSPI FLASH)域起始地址
#define m_qspiflash_size                0X800000        //m_qspiflash(外扩QSPI FLASH)大小,W25Q64是8MB#define m_stmsram_start                 0X24000000      //m_stmsram(STM32内部RAM)域起始地址,定义在D1,AXI SRAM
#define m_stmsram_size                  0X80000         //m_stmsram(STM32内部RAM)大小,AXI SRAM共512KBLR_m_stmflash m_stmflash_start m_stmflash_size {        //LR_m_stmflash加载域ER_m_stmflash m_stmflash_start m_stmflash_size {      //ER_m_stmfalsh运行域,起始地址为:m_stmflash_start,大小为:m_stmflash_size *.o (RESET, +First)                                  //优先(+FIRST)将RESET(中断向量表)段放这个域,实际上就是把中断向量表拷贝到m_stmflash_start//RESET是一个段名,表示中断向量表(在.s文件定义);+FIRST表示时第一个要加载的.* (InRoot$$Sections)                              //将所有的库段(C/C++标准库)放在root region.如__main.o,__scatter*.o等* (Veneer$$Code) board.oclock.ocontext_rvds.odrv_common.ostm32h7xx_hal_gpio.ostm32h7xx_hal_rcc.ostm32h7xx_hal_rcc_ex.ostartup_stm32h750xx.osystem_stm32h7xx.o} RW_m_stmsram m_stmsram_start m_stmsram_size {           //RW_m_stmsram运行域,起始地址为:m_stmsram_start,大小为:m_stmsram_size..ANY (+RW +ZI)                                     //将所有用到的RAM都放在这个区域}
}LR_m_qspiflash m_qspiflash_start m_qspiflash_size {        //LR_m_qspiflash加载域ER_m_qspiflash m_qspiflash_start m_qspiflash_size {  //ER_m_qspiflash加载域,起始地址为:m_qspiflash_start,大小为:m_qspiflash_size .ANY (+RO)                                            //将只读数据(+RO)放这个域,任意分配.相当于程序就是存放在这个域的.* (FSymTab)}
}

3、系统初始化后就要配置时钟,并且配置QSPI进入内存映射模式,参考代码如下:

void SystemInit (void)
{#if defined (DATA_IN_D2_SRAM)__IO uint32_t tmpreg;
#endif /* DATA_IN_D2_SRAM *//* FPU settings ------------------------------------------------------------*/#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)SCB->CPACR |= ((3UL << (10*2))|(3UL << (11*2)));  /* set CP10 and CP11 Full Access */#endif/* Reset the RCC clock configuration to the default reset state ------------*//* Set HSION bit */RCC->CR |= RCC_CR_HSION;/* Reset CFGR register */RCC->CFGR = 0x00000000;/* Reset HSEON, CSSON , CSION,RC48ON, CSIKERON PLL1ON, PLL2ON and PLL3ON bits */RCC->CR &= 0xEAF6ED7FU;/* Reset D1CFGR register */RCC->D1CFGR = 0x00000000;/* Reset D2CFGR register */RCC->D2CFGR = 0x00000000;/* Reset D3CFGR register */RCC->D3CFGR = 0x00000000;/* Reset PLLCKSELR register */RCC->PLLCKSELR = 0x00000000;/* Reset PLLCFGR register */RCC->PLLCFGR = 0x00000000;/* Reset PLL1DIVR register */RCC->PLL1DIVR = 0x00000000;/* Reset PLL1FRACR register */RCC->PLL1FRACR = 0x00000000;/* Reset PLL2DIVR register */RCC->PLL2DIVR = 0x00000000;/* Reset PLL2FRACR register */RCC->PLL2FRACR = 0x00000000;/* Reset PLL3DIVR register */RCC->PLL3DIVR = 0x00000000;/* Reset PLL3FRACR register */RCC->PLL3FRACR = 0x00000000;/* Reset HSEBYP bit */RCC->CR &= 0xFFFBFFFFU;/* Disable all interrupts */RCC->CIER = 0x00000000;#if defined (DATA_IN_D2_SRAM)/* in case of initialized data in D2 SRAM (AHB SRAM) , enable the D2 SRAM clock ((AHB SRAM clock) */
#if defined(RCC_AHB2ENR_D2SRAM1EN)RCC->AHB2ENR |= (RCC_AHB2ENR_D2SRAM1EN | RCC_AHB2ENR_D2SRAM2EN | RCC_AHB2ENR_D2SRAM3EN);
#elseRCC->AHB2ENR |= (RCC_AHB2ENR_AHBSRAM1EN | RCC_AHB2ENR_AHBSRAM2EN);
#endif /* RCC_AHB2ENR_D2SRAM1EN */tmpreg = RCC->AHB2ENR;(void) tmpreg;
#endif /* DATA_IN_D2_SRAM */#if defined(DUAL_CORE) && defined(CORE_CM4)/* Configure the Vector Table location add offset address for cortex-M4 ------------------*/
#ifdef VECT_TAB_SRAMSCB->VTOR = D2_AHBSRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
#elseSCB->VTOR = FLASH_BANK2_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
#endif /* VECT_TAB_SRAM */#else/* dual core CM7 or single core line */if((DBGMCU->IDCODE & 0xFFFF0000U) < 0x20000000U){/* if stm32h7 revY*//* Change  the switch matrix read issuing capability to 1 for the AXI SRAM target (Target 7) */*((__IO uint32_t*)0x51008108) = 0x000000001U;}/* Configure the Vector Table location add offset address for cortex-M7 ------------------*/
#ifdef VECT_TAB_SRAMSCB->VTOR = D1_AXISRAM_BASE  | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal D1 AXI-RAM */
#elseSCB->VTOR = FLASH_BANK1_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
#endif#endif /*DUAL_CORE && CORE_CM4*/extern void SystemClock_Config(void);SystemClock_Config();
}

二、完整工程下载
付费下载请点击:点击我下载位置工程
免费下载请扫描下方二维码加入公众号回复H750移植rt-thread完整工程下载

H750移植rt_thread操作系统完整工程分享,包括外部FLASH分散加载文件相关推荐

  1. html中searchbutton点击没有反应,点击按钮加载完整的HTML后,使用Selenium加载其他元素...

    我想刮一页并收集所有链接.该页面显示30个条目并查看完整列表,点击全部加载按钮是必要的.点击按钮加载完整的HTML后,使用Selenium加载其他元素 我使用下面的代码: from selenium ...

  2. 中标麒麟操作系统,yum安装软件时提示:“已加载插件:langpacks,无须任何处理“的解决办法

    中标麒麟操作系统,yum安装软件时提示:"已加载插件:langpacks,无须任何处理"的解决办法 通常都是由于yum仓库未包含你所要安装的那款软件造成. 解决办法: 输入如下命令 ...

  3. 圆形进度条(包括仿QQ图片加载进度图)

    原文:圆形进度条(包括仿QQ图片加载进度图) 源代码下载地址:http://www.zuidaima.com/share/1581277496822784.htm 以前找到的自定义圆形进度条

  4. cnpm : 无法加载文件_DELL 服务器R230 加载阵列卡驱动安装Server 2012R2操作系统

    第一步:创建SATA接口模式为RIAD,创建RAID1 DELL服务器R230 RIAD1创建后安装Server 2018 R2操作系统. 在做RIAD 1之前需要将SATA接口模式更改为RIAD模式 ...

  5. mysql性能优化 洪斌_技术分享 | InnoDB Cluster 如何高效加载数据

    作者:洪斌 爱可生南区负责人兼技术服务总监,MySQL ACE,擅长数据库架构规划.故障诊断.性能优化分析,实践经验丰富,帮助各行业客户解决 MySQL 技术问题,为金融.运营商.互联网等行业客户提供 ...

  6. 设计人员拿到的工程坐标系等高线CAD图如何加载进图新地球

    序: 一个朋友拿到了一份CAD格式的图纸,里面有等高线,想把它作为三维地形底图加载到图新地球.让其他同事帮忙转换,同事用Arcgis给他输出了一份tif格式的地形,但这个数据实际检查发现是[影像] 这 ...

  7. [操作系统] 操作系统真相还原读书笔记三:MBR加载loader到内存并跳转到loader执行

    为什么要有loader程序? 通过操作系统真相还原读书笔记二:编写MBR主引导记录我们已经能够正常运行MBR主引导记录(有些书籍也叫做boot)程序了,但该程序什么也没做.我们的MBR 受限于 512 ...

  8. Libgdx学习笔记:分享自己写的异步加载

    2019独角兽企业重金招聘Python工程师标准>>> 从需求说起: 解析xml,json文件等耗时的操作,如果放到绘制线程,或者初始化里面,会导致画面卡顿一下,让人看起来不爽,这时 ...

  9. 问题记录:IDEA工程卡在Updating indexes一直加载

    问题记录 问题描述 问题解决 打开清除缓存 清理缓存并重启 总结 问题描述 在项目研发过程中,有时打开工程项目一直卡在Updating indexes一直在加载更新,具体情况如图所示 问题解决 打开清 ...

最新文章

  1. jQuery - 当当网我的订单页
  2. yml语法规则 (5.spring boot配置文件注入@ConfigurationProperties)、配置文件处理器...
  3. char栈java,Java数据结构与算法-栈和队列(示例代码)
  4. cron表达式 每天0点10分和30分_“提前2小时下班”:学会这10个函数,办公效率提升了10倍!...
  5. 博文视点读书节第九日丨大咖书单加倍放送!
  6. Mobile开发之meta篇
  7. php 小米路由器_小米路由3 原厂固件OPKG安装 nginx+php+mysql 搭建WEB环境 芒果云等...
  8. 工作总结,关于浏览器不兼容的问题。
  9. 苹果手机计算机没有记录吗,苹果手机恢复出厂设置备忘录里的便签内容都没了,怎么找回来啊...
  10. Amazon Silk 你所不知道的在Kindle背后的大数据
  11. 权变理论计算机管理理论,权变理论是什么意思?权变管理理论的介绍与应用
  12. Pandas中透视表和交叉表
  13. windows光标移动快捷键操作
  14. windows自动卸载程序
  15. 减少参数!SPViT:视觉Transformer剪枝新方法
  16. Richard Stallman简介
  17. Hadoop集群中master: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).的解决和思路
  18. C程序设计习题 - 顺序结构
  19. 能生成Deepfake也能诊断癌症,GAN与恶的距离
  20. 百度url参数分别代表什么意思?

热门文章

  1. cs231n课程资料Python Numpy Tutorial的Python3版本
  2. 属于python保留字的是_属牛的女人全集:属牛女的性格、命运、属相婚配表等-第一星座网...
  3. 湖北武汉劳务员培训劳务管理五条新举措建筑七大员培训
  4. 知网等数据库文献快速直接导入EndNote的方法
  5. php提取字符串中数字,php提取字符串中的数字教程
  6. c语言signal函数详细说明
  7. 完美解决“未能装载Office文档控件。请使用Internet Explorer(6.0+)浏览器并检查浏览器的安全设置。”的方案
  8. vs修改程序图标、任务栏图标
  9. PostgreSQL 常用工具
  10. JVM(五)JVM调优