|
聊聊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。
|
赞赏
-
1
查看全部赞赏
-
|