4881|8

2144

帖子

3

TA的资源

五彩晶圆(中级)

楼主
 

聊聊IAR的Loader + RadioYúN [复制链接]

本帖最后由 lyzhangxiang 于 2015-10-20 13:17 编辑

官方提供的Demo程序需要通过ST-Link Utility来下载二进制文件到板子中。
否则程序运行的时候花屏,看过readme的都知道这么干。

我们来深入学习一下这些动作背后的原理性的东西,其实看过Demo程序的小伙伴一下子就明白了。
res资源是被工具转换为数组而且被指定在QSPI-Flash的地址单元中了。

图1.RES文件定位

图2. ICF文件窥探
首先看一下ST-Link Utility安装目录下的一些文件夹,看看有什么端倪,我们发现有一种特殊格式的二进制文件。

图3. ST-Link Utility扩展Loader
就是这些文件了,在ST-Link Utility添加扩展外部Loader的时候就是添加这些。继续看IAR的Loader,用默认的Loader来下载程序的话,是不会下载到外部QSPI-Flash中去的,所以会有一些警告,当然如果我们的RES资源文件烧好了还是可以用这种方式来调试代码的,这些警告都不影响的,不要怕。

图4. 调试信息原生Loader
那么IAR的Loader文件到底有什么神秘的地方,我们去看一下安装目录下的一些文件就知道整个事情的全貌了,有的时候大家很少去关注这些,当然搞破解的人对这些了如指掌,我也是在前几年搞富士通FM3才知道这个事情的,那时候IAR支持太差了,还得自己改写这些Loader文件,还是蛮痛苦的一段经历。

图5.标准的Loader组成
看看都有哪些文件吧,主要有四种文件,细节的东西我就不说了,想了解的自然去了解,不想了解的我也白写。
board文件 / flash文件 / mac文件 / out文件
关于这几个文件是如何关联的请看前三个文件,最后一个大家熟悉吧,一般IAR编译工程都会有这种文件,不过这里的文件是IAR提供的或者是产商提供给IAR公司的。

图6.FLash文件

图7.Board文件
看了这两个文件你是否明白了些什么,这里我的安装目录下没有找到DISCO板子的Board文件,所以你懂的,采用EVAL的,需要看一下配置是否合适。

图8.下载
不过我可以告诉你此法我也没行的通,估计得改改配置,loader算法有问题吧可能,QSPI烧写会一直等待,大家折腾吧,在我感觉没啥意思,这个烧写过程很慢,帖子写好了还在等着。。

图9.就这个结果了
最近有点忙,还没怎么折腾这个板子,也没时间去看loader的细节了,大家实验一下给我个结论吧,对了用ST-Link Utility分析文件会有奇效。


---------------------------------------------------------------------------------------------------------------------------------
更新记录-问题所在
---------------------------------------------------------------------------------------------------------------------------------


找到问题法门,需要修改FLashSTM32F7xx_QSPI.mac文件,这个文件是给EVAL板子用的,我们的板子是DISCO,比较了一下QSPI部分的原理图,有如下差异

图1.DISCO原理图


图2.EVAL原理图

图3.MMP图

图4.原始mac文件,添加了log

图5.对应的setup信息

好了,真没时间折腾了,大家感兴趣的,对着寄存器改一下这个mac文件吧。

---------------------------------------------------------------------------------------------------------------------------------
更新记录-原始的mac文件
---------------------------------------------------------------------------------------------------------------------------------


贴上原始的mac文件给大家看看,一看就懂
  • __setup()
  • {
  •   __var Reg;
  •   __hwReset(0);
  •   __message "---- setup device ----" ;
  •   Reg = __readMemory32(0x40023838, "Memory");  // RCC.AHB3ENR enable QSPI
  •   Reg |= (0x02UL);
  •   __writeMemory32(Reg, 0x40023838, "Memory");
  •   __message "---- setup 1 ----" ;
  •   Reg = __readMemory32(0x40023830, "Memory");  // RCC.AHB1ENR enable GPIOB & GPIOF
  •   Reg |= (0x22UL);
  •   __writeMemory32(Reg, 0x40023830, "Memory");
  •   __message "---- setup 2 ----" ;
  •   Reg = __readMemory32(0x40023818, "Memory");  // RCC.AHB3RSTR reset assert QSPI
  •   Reg |= (0x02UL);
  •   __writeMemory32(Reg, 0x40023818, "Memory");
  •   __message "---- setup 3 ----" ;
  •   Reg = __readMemory32(0x40023818, "Memory");  // RCC.AHB3RSTR reset release QSPI
  •   Reg &= ~(0x02UL);
  •   __writeMemory32(Reg, 0x40023818, "Memory");
  •   __message "---- setup 4 ----" ;
  •   /* CS pin */
  •   Reg = __readMemory32(0x40020420, "Memory");  // GPIOB.AFR[0]
  •   Reg &= ~(0x0FUL << 24);
  •   Reg |=  (0x0AUL << 24);
  •   __writeMemory32(Reg, 0x40020420, "Memory");
  •   __message "---- setup 5 ----" ;
  •   Reg = __readMemory32(0x40020400, "Memory");  // GPIOB.MODER
  •   Reg &= ~(0x03UL << 12);
  •   Reg |=  (0x02UL << 12);
  •   __writeMemory32(Reg, 0x40020400, "Memory");
  •   __message "---- setup 6 ----" ;
  •   Reg = __readMemory32(0x40020404, "Memory");  // GPIOB.OTYPER
  •   Reg &= ~(1UL << 6);
  •   __writeMemory32(Reg, 0x40020404, "Memory");
  •   __message "---- setup 7 ----" ;
  •   Reg = __readMemory32(0x40020408, "Memory");  // GPIOB.OSPEEDR
  •   Reg |= (0x3UL << 12);
  •   __writeMemory32(Reg, 0x40020408, "Memory");
  •   __message "---- setup 8 ----" ;
  •   Reg = __readMemory32(0x4002040C, "Memory");  // GPIOB.PUPDR
  •   Reg &= ~(0x03UL << 12);
  •   Reg |=  (0x01UL << 12);
  •   __writeMemory32(Reg, 0x4002040C, "Memory");
  •   __message "---- setup 9 ----" ;
  •   /* CLK pin */
  •   Reg = __readMemory32(0x40020420, "Memory");  // GPIOB.AFR[0]
  •   Reg &= ~(0x0FUL << 8);
  •   Reg |=  (0x09UL << 8);
  •   __writeMemory32(Reg, 0x40020420, "Memory");
  •   __message "---- setup 10 ----" ;
  •   Reg = __readMemory32(0x40020400, "Memory");  // GPIOB.MODER
  •   Reg &= ~(0x03UL << 4);
  •   Reg |=  (0x02UL << 4);
  •   __writeMemory32(Reg, 0x40020400, "Memory");
  •   __message "---- setup 11 ----" ;
  •   Reg = __readMemory32(0x40020404, "Memory");  // GPIOB.OTYPER
  •   Reg &= ~(1UL << 2);
  •   __writeMemory32(Reg, 0x40020404, "Memory");
  •   __message "---- setup 12 ----" ;
  •   Reg = __readMemory32(0x40020408, "Memory");  // GPIOB.OSPEEDR
  •   Reg |= (0x3UL << 4);
  •   __writeMemory32(Reg, 0x40020408, "Memory");
  •   __message "---- setup 13 ----" ;
  •   Reg = __readMemory32(0x4002040C, "Memory");  // GPIOB.PUPDR
  •   Reg &= ~(0x03UL << 4);
  •   __writeMemory32(Reg, 0x4002040C, "Memory");
  •   __message "---- setup 14 ----" ;
  •   /* D0-D3 pin */
  •   Reg = __readMemory32(0x40021420, "Memory");  // GPIOF.AFR[0]
  •   Reg &= ~(0xFFUL << 24);
  •   Reg |=  (0x99UL << 24);
  •   __writeMemory32(Reg, 0x40021420, "Memory");
  •   __message "---- setup 15 ----" ;
  •   Reg = __readMemory32(0x40021424, "Memory");  // GPIOF.AFR[1]
  •   Reg &= ~(0xFFUL);
  •   Reg |=  (0xAAUL);
  •   __writeMemory32(Reg, 0x40021424, "Memory");
  •   __message "---- setup 16 ----" ;
  •   Reg = __readMemory32(0x40021400, "Memory");  // GPIOF.MODER
  •   Reg &= ~(0xFFUL << 12);
  •   Reg |=  (0xAAUL << 12);
  •   __writeMemory32(Reg, 0x40021400, "Memory");
  •   __message "---- setup 17 ----" ;
  •   Reg = __readMemory32(0x40021404, "Memory");  // GPIOF.OTYPER
  •   Reg &= ~(0x0FUL << 6);
  •   __writeMemory32(Reg, 0x40021404, "Memory");
  •   __message "---- setup 18 ----" ;
  •   Reg = __readMemory32(0x40021408, "Memory");  // GPIOF.OSPEEDR
  •   Reg |= (0xFFUL << 12);
  •   __writeMemory32(Reg, 0x40021408, "Memory");
  •   __message "---- setup 19 ----" ;
  •   Reg = __readMemory32(0x4002140C, "Memory");  // GPIOF.PUPDR
  •   Reg &= ~(0xFFUL << 12);
  •   __writeMemory32(Reg, 0x4002140C, "Memory");
  •   __message "---- setup 20 ----" ;
  • }
  • execUserFlashInit()
  • {
  •     __message"----- Prepare hardware for Flashloader -----\n";
  •     __setup();
  • }
  • execUserPreload()
  • {
  •     __message"----- Prepare hardware for Flashloader -----\n";
  •     __setup();
  • }

复制代码

看到里面的D0-D3部分了么,这部分需要修改为DISCO的即可。

---------------------------------------------------------------------------------------------------------------------------------
更新记录-继续更新,修改mac文件,已经能下载了,没有错误
---------------------------------------------------------------------------------------------------------------------------------
好了,还是忍不住自己折腾一下,浪费了中午休息的时间,罪过。

图1.烧写QSPI-Flash


图2.下载之后的调试信息窗口
全过程是没有错误的,删除了原始工程TCM的flash文件,暂时用不上的,不删除的话会有个警告,也不影响。主要是修改mac文件,后面分享给大家,我先折腾看看有没有bug。

download-qspi.png (3.6 MB, 下载次数: 0)

download-qspi.png
此帖出自stm32/stm8论坛

最新回复

请问rel_offset指的是哪一个地址偏移  详情 回复 发表于 2019-5-15 14:27

赞赏

1

查看全部赞赏

点赞 关注(1)
个人签名电工
 

回复
举报

1891

帖子

2

TA的资源

纯净的硅(中级)

沙发
 
赞一个。。。。。。。。
此帖出自stm32/stm8论坛
 
个人签名
分享铸就美好未来。。。




 

回复

3416

帖子

0

TA的资源

纯净的硅(高级)

板凳
 
来膜拜一下大神
此帖出自stm32/stm8论坛
 
个人签名

So TM what......?

 


回复

2144

帖子

3

TA的资源

五彩晶圆(中级)

4
 
找到问题法门,需要修改FLashSTM32F7xx_QSPI.mac文件,这个文件是给EVAL板子用的,我们的板子是DISCO,比较了一下QSPI部分的原理图,有如下差异

图1.DISCO原理图


图2.EVAL原理图

图3.MMP图

图4.原始mac文件,添加了log

图5.对应的setup信息

好了,真没时间折腾了,大家感兴趣的,对着寄存器改一下这个mac文件吧。

此帖出自stm32/stm8论坛
 
个人签名电工
 
 

回复

2144

帖子

3

TA的资源

五彩晶圆(中级)

5
 
贴上原始的mac文件给大家看看,一看就懂
  1. __setup()
  2. {
  3.   __var Reg;

  4.   __hwReset(0);   
  5.   __message "---- setup device ----" ;

  6.   Reg = __readMemory32(0x40023838, "Memory");  // RCC.AHB3ENR enable QSPI
  7.   Reg |= (0x02UL);
  8.   __writeMemory32(Reg, 0x40023838, "Memory");
  9.   __message "---- setup 1 ----" ;
  10.   
  11.   Reg = __readMemory32(0x40023830, "Memory");  // RCC.AHB1ENR enable GPIOB & GPIOF
  12.   Reg |= (0x22UL);
  13.   __writeMemory32(Reg, 0x40023830, "Memory");
  14.   __message "---- setup 2 ----" ;

  15.   Reg = __readMemory32(0x40023818, "Memory");  // RCC.AHB3RSTR reset assert QSPI
  16.   Reg |= (0x02UL);
  17.   __writeMemory32(Reg, 0x40023818, "Memory");
  18.   __message "---- setup 3 ----" ;
  19.   
  20.   Reg = __readMemory32(0x40023818, "Memory");  // RCC.AHB3RSTR reset release QSPI
  21.   Reg &= ~(0x02UL);
  22.   __writeMemory32(Reg, 0x40023818, "Memory");
  23.   __message "---- setup 4 ----" ;
  24.   
  25.   /* CS pin */
  26.   Reg = __readMemory32(0x40020420, "Memory");  // GPIOB.AFR[0]
  27.   Reg &= ~(0x0FUL << 24);
  28.   Reg |=  (0x0AUL << 24);
  29.   __writeMemory32(Reg, 0x40020420, "Memory");
  30.   __message "---- setup 5 ----" ;
  31.   
  32.   Reg = __readMemory32(0x40020400, "Memory");  // GPIOB.MODER
  33.   Reg &= ~(0x03UL << 12);
  34.   Reg |=  (0x02UL << 12);
  35.   __writeMemory32(Reg, 0x40020400, "Memory");
  36.   __message "---- setup 6 ----" ;
  37.   
  38.   Reg = __readMemory32(0x40020404, "Memory");  // GPIOB.OTYPER
  39.   Reg &= ~(1UL << 6);
  40.   __writeMemory32(Reg, 0x40020404, "Memory");
  41.   __message "---- setup 7 ----" ;
  42.   
  43.   Reg = __readMemory32(0x40020408, "Memory");  // GPIOB.OSPEEDR
  44.   Reg |= (0x3UL << 12);
  45.   __writeMemory32(Reg, 0x40020408, "Memory");  
  46.   __message "---- setup 8 ----" ;
  47.   
  48.   Reg = __readMemory32(0x4002040C, "Memory");  // GPIOB.PUPDR
  49.   Reg &= ~(0x03UL << 12);
  50.   Reg |=  (0x01UL << 12);
  51.   __writeMemory32(Reg, 0x4002040C, "Memory");
  52.   __message "---- setup 9 ----" ;
  53.   
  54.   /* CLK pin */
  55.   Reg = __readMemory32(0x40020420, "Memory");  // GPIOB.AFR[0]
  56.   Reg &= ~(0x0FUL << 8);
  57.   Reg |=  (0x09UL << 8);
  58.   __writeMemory32(Reg, 0x40020420, "Memory");
  59.   __message "---- setup 10 ----" ;
  60.   
  61.   Reg = __readMemory32(0x40020400, "Memory");  // GPIOB.MODER
  62.   Reg &= ~(0x03UL << 4);
  63.   Reg |=  (0x02UL << 4);
  64.   __writeMemory32(Reg, 0x40020400, "Memory");
  65.   __message "---- setup 11 ----" ;
  66.   
  67.   Reg = __readMemory32(0x40020404, "Memory");  // GPIOB.OTYPER
  68.   Reg &= ~(1UL << 2);
  69.   __writeMemory32(Reg, 0x40020404, "Memory");
  70.   __message "---- setup 12 ----" ;
  71.   
  72.   Reg = __readMemory32(0x40020408, "Memory");  // GPIOB.OSPEEDR
  73.   Reg |= (0x3UL << 4);
  74.   __writeMemory32(Reg, 0x40020408, "Memory");
  75.   __message "---- setup 13 ----" ;
  76.   
  77.   Reg = __readMemory32(0x4002040C, "Memory");  // GPIOB.PUPDR
  78.   Reg &= ~(0x03UL << 4);
  79.   __writeMemory32(Reg, 0x4002040C, "Memory");
  80.   __message "---- setup 14 ----" ;
  81.   
  82.   /* D0-D3 pin */
  83.   Reg = __readMemory32(0x40021420, "Memory");  // GPIOF.AFR[0]
  84.   Reg &= ~(0xFFUL << 24);
  85.   Reg |=  (0x99UL << 24);
  86.   __writeMemory32(Reg, 0x40021420, "Memory");
  87.   __message "---- setup 15 ----" ;
  88.   
  89.   Reg = __readMemory32(0x40021424, "Memory");  // GPIOF.AFR[1]
  90.   Reg &= ~(0xFFUL);
  91.   Reg |=  (0xAAUL);
  92.   __writeMemory32(Reg, 0x40021424, "Memory");
  93.   __message "---- setup 16 ----" ;
  94.   
  95.   Reg = __readMemory32(0x40021400, "Memory");  // GPIOF.MODER
  96.   Reg &= ~(0xFFUL << 12);
  97.   Reg |=  (0xAAUL << 12);
  98.   __writeMemory32(Reg, 0x40021400, "Memory");
  99.   __message "---- setup 17 ----" ;
  100.   
  101.   Reg = __readMemory32(0x40021404, "Memory");  // GPIOF.OTYPER
  102.   Reg &= ~(0x0FUL << 6);
  103.   __writeMemory32(Reg, 0x40021404, "Memory");
  104.   __message "---- setup 18 ----" ;
  105.   
  106.   Reg = __readMemory32(0x40021408, "Memory");  // GPIOF.OSPEEDR
  107.   Reg |= (0xFFUL << 12);
  108.   __writeMemory32(Reg, 0x40021408, "Memory");
  109.   __message "---- setup 19 ----" ;
  110.   
  111.   Reg = __readMemory32(0x4002140C, "Memory");  // GPIOF.PUPDR
  112.   Reg &= ~(0xFFUL << 12);
  113.   __writeMemory32(Reg, 0x4002140C, "Memory");
  114.   __message "---- setup 20 ----" ;
  115. }

  116. execUserFlashInit()
  117. {
  118.     __message"----- Prepare hardware for Flashloader -----\n";
  119.     __setup();
  120. }

  121. execUserPreload()
  122. {
  123.     __message"----- Prepare hardware for Flashloader -----\n";
  124.     __setup();
  125. }
复制代码

看到里面的D0-D3部分了么,这部分需要修改为DISCO的即可。

此帖出自stm32/stm8论坛
 
个人签名电工
 
 

回复

2144

帖子

3

TA的资源

五彩晶圆(中级)

6
 
下载qspi-flash



调试窗口log


此帖出自stm32/stm8论坛
 
个人签名电工
 
 

回复

2144

帖子

3

TA的资源

五彩晶圆(中级)

7
 
配置


文件




此帖出自stm32/stm8论坛
 
个人签名电工
 
 

回复

3238

帖子

5

TA的资源

五彩晶圆(中级)

8
 
虽然没怎么看明白,不过看完了
此帖出自stm32/stm8论坛
 
个人签名淘宝:https://viiot.taobao.com/Q群243090717
多年专业物联网行业经验,个人承接各类物联网外包项目
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

9
 
请问rel_offset指的是哪一个地址偏移
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表