试图搞懂MDK程序下载到Flash(四)--生成bin文件下载到Nor Flash
keil生成bin文件下载到norflash中

MDK程序生成.bin文件下载到NORflash中
声明:这里也有部分摘自网上。
刚开始的文件可以查看我的另一篇文章
《keil直接下载到norflash中》
只是更改了,user目录下的文件,配置如图所示:
其他的都一样,你而且可以把Utilities选项,配置设置为默认值:如图所示
配置完成之后,我们点击进行编译
我们查看工程所在文件夹多了一个:test.bin文件,南无这个就是我们要下载到开发板里的.bin文件
下面演示下载过程
在开始菜单里找到J-Flash ARM,咱们用它来烧写bin文件
打开该文件,如图所示:
然后FILE->open project
然后选择一个工程,我这里用的是嵌入式家园提供的,你也可以自己下一个J-Flash ARM串口,单击File/Open,打开上一步生成的bin文件
File->open data file 如图所示
这里选择option ->project settings
选择flash
点击select flash device
选择如图所示,点击ok即可
这里选择你相应的文件,比如说刚才的test.bin文件打开后
这里点击“OK”就可以了
下来链接好jlink,我们依次点击:
提示烧写成功后,选择Target/Disconnect,断开连接。
检验是否正确。
试图搞懂MDK程序下载到flash(五)--使用MDK中的download直接下载到nor flash

试图搞懂MDK程序下载到flash(五)--使用MDK中的download直接下载到nor flash也不知道怎么弄的,今天突然可以使用MDK中的Flash/Download将程序下载到Nor Flash 了,像开发51一样方便。
现在重新整理一下,将使用MDK中的download功能,将裸机程序下载到nor flash中的步骤写出来。
1、新建一个工程文档,并命名为test2、编写并添加,源文件main.c uart.c uart.h这三个文件可以自行下载,我已经传到了网站:点击打开链接三个文件存放在src文件夹里3、编写分散加载文件RuninFlash.sct,内容如下:将该分散加载文件存放在工程目录中4、修改S3C2440.s中一处代码,初始化时钟,因为我这个test工程使用了UART。
将CLOCK_SETUP EQU 0 修改为CLOCK_SETUP EQU 1,如下图5、配置选项Linker选项,配置如下图在Scatter File一栏中,加入自己刚才编写的分散加载文件Utilities选项,配置如下图点击上图的Settings按钮,弹出下图点击上图的Add按钮,弹出下图因为我的mini2440板的nor flash是2M的,所以选择AM29F160DB Flash Ext.Flash 16-bit 2M,然后点击Add按钮,弹出下图可以看到咱们的Nor Flash的下载算法已经添加了,然后点击OK,关于所有的配置选项已经完成,其他的配置选项使用默认就行了,下面我也贴出来自己其他的配置选项内容Target选项Output选项User选项Debug选项,我这里没有使用Jlink调试,而是直接下载到flash中去,所以这一选项也使用默认值6、保存,编译7、使用Jlink 连接好开发板,从Nor Flash启动,打开串口调试工具8、点击keil中的download按钮,或者Flash/Download,咱们的程序就下载到Nor Flash中了9、可以看到程序运行起来了,已经下载到nor flash中了,关闭电源再打开程序任然可以运行,记得把Jlink从开发板上拔掉。
MDK程序下载----FLM文件

MDK程序下载----FLM⽂件MDK编程算法 ⽤过MDK下载程序的⼩伙伴可能都知道,在下载程序之前需要都在Debug设置的Flash Download⼦选项卡选择编程算法。
⼤多数时候,我们只要安装了芯⽚包之后,就可以直接得到对应的编程算法,并不需要我们去修改它。
但是,当你是⼀个芯⽚包的开发者,或者你有独特的下载需求(⽐如在你的程序⾥加⼊⼀些校验信息),这个时候你就需要去了解它了! 编程算法呢,说⽩就其实也就是⼀段程序,主要功能就是擦除相应的内存块,并将我们的程序写⼊到相应的内存区域上去。
在你点击下载按钮的时候,这段程序会被先下载到RAM上(RAM for Algorithm上的设置),然后才会通过它,将你的程序写⼊到指定的内存区域内。
实现⼀个⾃⼰的编程算法 怎么去实现⼀个⾃⼰的编程算法?⾸先我们找到⾃⼰的MDK的安装路径,进⼊到ARM\Flash⽂件夹下(例如:D:\Keil_v5\ARM\Flash)。
这⾥有个编程算法的⼯程模板,复制这个⼯程到你的⼯程⽂件夹下,重命名你⾃⼰的想要的名字。
打开⼯程,⾥⾯主要有两个⽂件 FlashPrg.c 和 FlashDev.c: FlashDev.c主要实现了⼀个设备相关的结构体(根据⾃⼰的Flash情况去实现) ⽐如STM32L051实现如下: FlashPrg.c实现了⼏个Flash编程相关的函数: 根据⾃⼰的需要去实现,STM32L051实现如下:1/* -----------------------------------------------------------------------------2 * Copyright (c) 2014 ARM Ltd.3 *4 * This software is provided 'as-is', without any express or implied warranty.5 * In no event will the authors be held liable for any damages arising from6 * the use of this software. Permission is granted to anyone to use this7 * software for any purpose, including commercial applications, and to alter8 * it and redistribute it freely, subject to the following restrictions:9 *10 * 1. The origin of this software must not be misrepresented; you must not11 * claim that you wrote the original software. If you use this software in12 * a product, an acknowledgment in the product documentation would be13 * appreciated but is not required.14 *15 * 2. Altered source versions must be plainly marked as such, and must not be16 * misrepresented as being the original software.17 *18 * 3. This notice may not be removed or altered from any source distribution.19 *20 *21 * $Date: 18. November 201422 * $Revision: V1.0023 *24 * Project: Flash Programming Functions for ST STM32L0xx Flash25 * --------------------------------------------------------------------------- */2627/* History:28 * Version 1.0029 * Initial release30*/3132 #include "FlashOS.H"// FlashOS Structures3334 typedef volatile unsigned char vu8;35 typedef volatile unsigned long vu32;36 typedef volatile unsigned short vu16;3738#define M8(adr) (*((vu8 *) (adr)))39#define M16(adr) (*((vu16 *) (adr)))40#define M32(adr) (*((vu32 *) (adr)))4142// Peripheral Memory Map43#define IWDG_BASE 0x4000300044#define FLASH_BASE 0x400220004546#define IWDG ((IWDG_TypeDef *) IWDG_BASE)47#define FLASH ((FLASH_TypeDef*) FLASH_BASE)4849#define FLASH_MEMORY5051// Independent WATCHDOG52 typedef struct {53 vu32 KR; // offset 0x000 Key register (IWDG_KR)54 vu32 PR; // offset 0x004 Prescaler register (IWDG_PR)55 vu32 RLR; // offset 0x008 Reload register (IWDG_RLR)56 vu32 SR; // offset 0x00C Status register (IWDG_SR)57 } IWDG_TypeDef;5859// Flash Registers60 typedef struct {61 vu32 ACR; // offset 0x000 Flash access control register (FLASH_ACR)62 vu32 PECR; // offset 0x004 Flash program erase control register (FLASH_PECR)63 vu32 PDKEYR; // offset 0x008 Flash power down key register (FLASH_PDKEYR)64 vu32 PEKEYR; // offset 0x00C Flash program erase key register (FLASH_PEKEYR)65 vu32 PRGKEYR; // offset 0x010 Flash program memory key register (FLASH_PRGKEYR)66 vu32 OPTKEYR; // offset 0x014 Flash option key register (FLASH_OPTKEYR)67 vu32 SR; // offset 0x018 Flash status register (FLASH_SR)68 vu32 OPTR; // offset 0x01C Option byte register (FLASH_OBR)69 vu32 WRPRT; // offset 0x020 Flash write protection register (FLASH_WRPR)70 } FLASH_TypeDef;717273// Flash Keys74#define FLASH_PEKEY1 (0x89ABCDEFul)75#define FLASH_PEKEY2 (0x02030405ul)76#define FLASH_PRGKEY1 (0x8C9DAEBFul)77#define FLASH_PRGKEY2 (0x13141516ul)78#define FLASH_OPTKEY1 (0xFBEAD9C8ul)79#define FLASH_OPTKEY2 (0x24252627ul)8081// Flash program erase control register (FLASH_PECR) definitions82#define FLASH_PELOCK (0x00000001ul) // FLASH_PECR and data memory lock83#define FLASH_PRGLOCK (0x00000002ul) // Program memory lock84#define FLASH_OPTLOCK (0x00000004ul) // Option bytes block lock85#define FLASH_PROG (0x00000008ul) // Program memory selection86#define FLASH_DATA (0x00000010ul) // Data memory selection87#define FLASH_OPT (0x00000020ul) // Option Bytes memory selection88#define FLASH_FIX (0x00000100ul) // Fixed time data write for Byte, Half Word and Word programming 89#define FLASH_ERASE (0x00000200ul) // Page or Double Word erase mode90#define FLASH_FPRG (0x00000400ul) // Half Page/Double Word programming mode91#define FLASH_GBHF_ER (0x00000800ul) // Global Half Erase mode9293// Flash status register (FLASH_SR) definitions94#define FLASH_BSY (0x00000001ul) // Write/erase operations in progress95#define FLASH_EOP (0x00000002ul) // End of operation96#define FLASH_ENDHV (0x00000004ul) // End of high voltage97#define FLASH_WRPERR (0x00000100ul) // Write protected error98#define FLASH_PGAERR (0x00000200ul) // Programming alignment error99#define FLASH_SIZERR (0x00000400ul) // Size error100#define FLASH_OPTVERR (0x00000800ul) // Option validity error101102#define FLASH_ERRs (FLASH_PGAERR | FLASH_WRPERR | FLASH_SIZERR | FLASH_OPTVERR)103104// Option byte register (FLASH_OBR) definitions105#define FLASH_IWDG_SW (0x00100000ul) // Software IWDG or Hardware IWDG selected106107/*108 * Initialize Flash Programming Functions109 * Parameter: adr: Device Base Address110 * clk: Clock Frequency (Hz)111 * fnc: Function Code (1 - Erase, 2 - Program, 3 - Verify)112 * Return Value: 0 - OK, 1 - Failed113*/114115 #ifdef FLASH_MEMORY116int Init (unsigned long adr, unsigned long clk, unsigned long fnc) {117118 FLASH->SR |= FLASH_ERRs; // clear error flags119120// Unlock PECR Register121 FLASH->PEKEYR = FLASH_PEKEY1;122 FLASH->PEKEYR = FLASH_PEKEY2;123124// Unlock Program Matrix125 FLASH->PRGKEYR = FLASH_PRGKEY1;126 FLASH->PRGKEYR = FLASH_PRGKEY2;127128129return (0);130 }131#endif// FLASH_MEMORY132133/*134 * De-Initialize Flash Programming Functions135 * Parameter: fnc: Function Code (1 - Erase, 2 - Program, 3 - Verify)136 * Return Value: 0 - OK, 1 - Failed137*/138139 #ifdef FLASH_MEMORY140int UnInit (unsigned long fnc) {141142switch (fnc) {143case1:144case2:145// Lock PECR register and program matrix146 FLASH->PECR |= FLASH_PRGLOCK; // Program memory lock147 FLASH->PECR |= FLASH_PELOCK; // FLASH_PECR and data memory lock 148break;149 }150151return (0);152 }153#endif// FLASH_MEMORY154155/*156 * Erase Sector in Flash Memory157 * Parameter: adr: Sector Address158 * Return Value: 0 - OK, 1 - Failed159*/160161 #ifdef FLASH_MEMORY162int EraseSector (unsigned long adr) {163164 FLASH->PECR |= FLASH_ERASE; // Page or Double Word Erase enabled 165 FLASH->PECR |= FLASH_PROG; // Program memory selected166167 M32(adr) = 0x00000000; // write '0' to the first address to erase page168169while (FLASH->SR & FLASH_BSY) {170 IWDG->KR = 0xAAAA; // Reload IWDG171 }172173 FLASH->PECR &= ~FLASH_ERASE; // Page or Double Word Erase disabled 174 FLASH->PECR &= ~FLASH_PROG; // Program memory deselected175176return (0); // Done177 }178#endif// FLASH_MEMORY179180/*181 * Program Page in Flash Memory182 * Parameter: adr: Page Start Address183 * sz: Page Size184 * buf: Page Data185 * Return Value: 0 - OK, 1 - Failed186*/187188 #ifdef FLASH_MEMORY189int ProgramPage (unsigned long adr, unsigned long sz, unsigned char *buf) {190 unsigned long cnt;191 unsigned long i;192193 sz = (sz + 63) & ~63; // adjust programming size194195for (i = 0; i < (sz / 64); i++) {196 FLASH->PECR |= FLASH_FPRG; // Half Page programming mode enabled 197 FLASH->PECR |= FLASH_PROG; // Program memory selected198199 cnt = 64;200while (cnt ) {201 M32(adr) = *((unsigned long *)buf); // Program Word202 adr += 4;203 buf += 4;204 cnt -= 4;205 }206207while (FLASH->SR & FLASH_BSY) {208 IWDG->KR = 0xAAAA; // Reload IWDG209 }210211if (FLASH->SR & (FLASH_ERRs)) { // Check for Errors212 FLASH->SR |= FLASH_ERRs; // clear error flags213return (1); // Failed214 }215216 FLASH->PECR &= ~FLASH_FPRG; // Half Page programming mode disabled 217 FLASH->PECR &= ~FLASH_PROG; // Program memory deselected218 }219220return (0); // Done221 }222#endif// FLASH_MEMORYFlashPrg.c 从上⾯我们就可以看出了,下载程序的时候就是调⽤了上⾯的⼏个函数,跟我们⾃⼰写Flash没有太⼤的区别。
试图搞懂MDK程序下载到flash(六)--DNW+supervivi+MDK下载到Nand Flash

试图搞懂MDK程序下载到flash(六)--DNW+supervivi+MDK 下载到Nand Flash不容易啊,终于把将MDK程序下载到我的mini2440开发板上的nand flash的方法找到了,我是利用韦东山老师的那套方法即利用DNW和supervivi下载到nand flash的。
当然,只是方法之一,因为我能隐约的感觉到还可以使用MDK直接下载。
下面我就将下载到nand flash的方法步骤完整的贴出来。
在讲解方法之前,我还是想说明几点原理,避免知其然而不知其所以然。
supervivi的各功能选项说明功能[x]:对Nand Flash进行默认分区,此命令仅对Linux系统有效。
功能[v]:通过USB下载Linux Bootloader之vivi到Nand Flash的vivi 分区功能[k]:通过USB下载Linux 内核到Nand Flash的kernel 分区功能[y]:通过USB下载yaffs 文件系统映像到Nand Flash的root 分区功能[a]:通过USB下载用户程序到Nand Flash中,一般这样的用户程序为bin可执行文件,如2440test(需要支持超过4K限制)、uCos2(开发板中带的uCos2支持Nand Flash 启动)、U-Boot等;当然,也可以使其他任意大小的bin程序。
功能[n]:通过USB下载WinCE之启动程序Nboot到Nand Flash的root分区功能[l ]:通过USB下载WinCE的启动logo功能[w]:通过USB下载WinCE发行映像NK.bin到Nand Flash功能[d]:通过USB下载程序到指定内存地址(通过DNW的Configuration/Option选项指定运行地址)并运行。
对于我的mini2440开发板,SDRAM的物理起始地址是0x3000 0000,结束地址是0x3400 0000,大小为64MB,另外BIOS的USB下载功能时应指定地址在0x30000000 - 0x33de8000之间。
关于MDK-NAND FLASH下载的若干问题

关于MDK-NAND FLASH 下载的若干问题
自前一个星期以来,一直被无法下载编译好的文件所困扰,直到今天,才
把NAND flash 下载的问题解决了,其中有几点作为要点,特留下一笔.(其中还有
许多问题待解决,如烧写NOR FLASH 还是出现了问题,老是出现Contents missmatch at: 00000000H (Flash=3CH Required=0DH) !这样的问题) nand-flash 下载:
我的ARM 板配置如下:
CPU:S3C2410
NAND FLASH:64M K9F1208
NOR FLASH:1M AM29LV800BE
SDRAM: 64M 2 片HY57V561620
在target 下面:
这个要根据实际硬件电路设置好,当初,不明,弄错了,一直瞎搞,才弄了这么长时
间才搞定,
在utilities 下面的flash download setup 里有一个ram for algorithm 不要设置错了,弄错了,也没办法烧写进去,我就是因为这个原因,花了好长时间,直接一次偶然
的机会,才搞定,现在想想真是幸运啊.
这应该是三星内存4KB 设置.
剩下的就是程序的烧写算法了,只要不弄错,基本就不会错了.
由于下载到NADN FLASH 所以还需要注意的是:
调试命令文件(INI)用于使用软件仿真和联机测试时,以下是几个常用的命令,。
[VIP专享]IAR下载bin文件到FLASH
![[VIP专享]IAR下载bin文件到FLASH](https://img.taocdn.com/s3/m/4c17932202768e9951e73869.png)
IAR如何将二进制文件链接到代码中?发布时间:2010-12-2820:59:57技术类别:ARM如何将二进制文件链接到代码中?有时需要将一些二进制文件链接到项目中,怎么办呢?IAR提供强大的链接功能.下面简单介绍一下如何把一个二进制的文件"ZROM_Data.bin"编译链接到代码中.首先要用winhex创建二个只有4字节文件的二进制文件.为什么是4字节呢?因为ARM是4字节对齐的,所以创建4字节的文件最合适又省空间的.将这两个文件分别命名为"ZROM_BEGIN","ZROM_END.BIN".我将用这两个文件来辅助定位和确定"ZROM_Data.bin"的位置和文件大小.然后找开IAR项目的OPTION对话框,定位到Linker->Input标签,如下图所示.输入ZROM_AAAAZROM_DATAZROM_ZZZZ名字可以随意,这三个名字表示后面将要链接到项目的3个文件.然后定位到Linker->Extra options选中"use command line options",在文本框输入以下命令(命令格式请按F1查看IAR帮助文件):--image_input=$PROJ_DIR$\ZROM_BEGIN.BIN,ZROM_AAAA,ROM_region,4--image_input=$PROJ_DIR$\ZROM_Data.Bin,ZROM_DATA,ROM_region,4--image_input=$PROJ_DIR$\ZROM_END.BIN,ZROM_ZZZZ,ROM_region,4最后,在Linker->list标签中选中Generate linker map file,让链接器生成map文件,以确认数据是否正确链接目标代码中.注意,在输入上述命令时,请不要留空格,行尾也不能留(图中红圈部分),否则编译不通过.接下来查看二进制代码是否链接到目标文件中.打开map文件,查找"ZROM_AAAA".如下图所示,三个二进制文件已经成功被链接目标代码.难道就这么完了吗?没有!从上图可以得知,ZROM_AAAA的首地址为0x080000c4,ZROM_DATA的首地址为0x080000c8,ZROM_ZZZZ的首地址0x0802313c.但是随着代码的增减,每次编译这些地址值将会发生很大的变化,如何能自己的代码找到这ZROM_DATA这块数据的首地址以及确定它的大小呢?另外,你可能会问:为什么要取名为ZROM_AAAA,ZROM_DATA,ZROM_ZZZZ呢?细心的朋友会发现,IAR编译成的标代码会按照字母的顺序来链接,所以按这种命名方法,生成的代码是紧紧挨在一块的,用ZROM_AAAA的址可以确定"ZROM_Data.Bin"的开始位置,用ZROM_ZZZZ可以确定"ZROM_Data.Bin"的结束位置,这样,二进制文件的大小和位置都确定了,接下来用代码定位到访问这个二进制文件文件首地址:(u8 *)&ZROM_DATA文件大小:(u32)&ZROM_ZZZZ-(u32)&ZROM_DATA至此大功告成!是不是很方便?梅川酷。
Keil如何生成bin文件【Keil生成Bin文件的方法】
Keil如何⽣成bin⽂件【Keil⽣成Bin⽂件的⽅法】使⽤过Keil的同鞋都知道,现在Keil中默认可以输出.axf的调试⽂件和可以通过钩选输出的.hex可执⾏⽂件,没有bin(⼆进制)⽂件的输出选项。
可是偏偏某些时候需要或者习惯性的使⽤.bin⽂件来进⾏烧写,下⾯各举⼀例:1. ⼀直使⽤ADS的⽤户习惯性的使⽤.bin⽂件;2. 某些烧写器带的应⽤软件只⽀持.bin⽂件;3. 正如笔者遇到的情况,我在使⽤STM32公司提供的⽹络更新固件程序的例程时,需要⽤到.bin⽂件(.hex⽂件通过⽹络更新后遇到某些问题,⽽且⽤Hex2Bin软件转换后的也不⾏)。
其实Keil也⾃带了⼯具软件,只要进⾏适当配置便可以输出bin⽂件了,不过在介绍具体⽅法前,请仔细阅读下⾯这⼀段关于Keil中⾃带的fromelf.exe⼯具说明:该⼯具的语法为:fromelf [options] input_file其中options中的选项及说明如下:命令选项格式命令说明--help显⽰帮助信息--vsn显⽰版本信息--output file输出⽂件(默认输出为⽂本⽂件)--nodebug在⽣成的映像⽂件中不包含调试信息--nolinkview在⽣成的映像⽂件中不包含段的信息⼆进制输出格式选项说明--bin输出plain binary格式的⽂件--m32⽣成Motorola 32位⼗六进制格式的⽂件--i32⽣成Intel 32位的⼗六进制格式的⽂件--vhx⾯向字节的位⼗六进制格式的⽂件--base addr设置m32,i32格式⽂件的基地址--text 显⽰⽂本信息,⽂本信息标志如下:-v 打印详细信息-a 打印数据地址(针对带调试信息的映像)-d 打印数据段的内容-e 打印表达式表-f 打印消除虚函数的信息-g 打印调试表-g 打印调试表-r 打印重定位信息-s 打印字符表-t 打印字符串表-y 打印动态段的内容-z 打印代码和数据⼤⼩信息讲完了⼯具的语法,下⾯就讲如何在Keil中运⽤该⾃带的⼯具,以使在⼯程编译后能⽣成.bin格式的⽂件:1. 打开⼀个建好的⼯程⽂件,就不举例说明了。
试图搞懂MDK程序下载到Flash(四)--生成bin文件下载到Nor Flash
试图搞懂MDK程序下载到Flash(四)--生成bin文件下载到Nor Flash喜讯啊!!下载到flash中的一种实现了啊!!!鸡冻了!终于可以脱机运行了,尽管是下载到了Nor Flash中运行,还没有下载到Nand Flash中运行,但是这也是一个进步了吧,下面详细介绍一下MDK编译的程序下载到Nor Flash运行的步骤。
1、编写程序我的主程序功能是实现UART的输出功能,工程文档结构图如下:需要自己编写的文件有三个main.c uart.c uart.h,下面贴出这三个文件的实验代码:main.c文件#include<s3c2440.h>#include"uart.h"int main(){unsigned int a=10; //系统时钟初始化,FCLK=400MHz,HCLK=100MHz,PCLK=50MHzUart0_Init(115200); //初始化并设置波特率为115 200while(1){Uart0_Printf("Uart0_Printf test output is:%d\n",a);}}uart.c文件#include<s3c2440.h>#include<stdarg.h>#include"uart.h"#define PCLK 50000000#define UART_BRD (int)((PCLK/(baudrate*16))-1)/************************************************函数名称:void Uart0_Init(unsigned int baudrate)*参数说明:baudrate:波特率*返回值:无*全局变量: 无*功能:对UART0进行初始化************************************************/void Uart0_Init(unsigned int baudrate){GPHCON&=~((3<<4)|(3<<6)); //GPH2--TXD0;GPH3--RXD0GPHCON|=((2<<4)|(2<<6)); //设置GPH2、GPH3为TXD0、RXD0功能GPHUP=0x00; //上拉电阻使能ULCON0|=0x03; //设置数据发送格式:8个数据位,1个停止位,无校验位UCON0=0x05; //发送模式和接收模式都使用查询模式UBRDIV0=UART_BRD; //设置波特率,其中波特率作为一个参数传递到该初始化函数URXH0=0; //将URXH0清零}/************************************************函数名称:void putc(unsigned char c)*参数说明:c:通过串口接收到的字符,注意这里是8位数据*返回值:无*全局变量: 无*功能:将通过串口接收到的字符发送给PC机并显示在* 串口调试工具。
图文教程之Keil如何生成bin文件
图文教程之Keil如何生成bin文件
——羽墨
辛辛苦苦的写完程序之后,满怀信心的点击了编译按钮,却没有生成想要的bin文件,这是怎样的一种心情啊……
不用着急,只是你的配置出了一点小小的问题,具体如何配置,请看下文。
一、选中你的Project文件;
二、右键单击,选择Options for Target或者使用快捷键Alt+F7调出;
三、选择User选项卡;
四、找到Run User Programs After Build/Rebuild,即下图所示的模块;
五、在Run #1 后的空白栏里填上下面的语句并在Run #1 前的方框里打勾,即选中该选项;fromelf.exe --bin --output=.\obj\output\BLE.bin .\obj\BLE.axf,效果如下:
六、点击左下方的OK按钮,确定;
七、重新编译,会多出下图方框里的内容;
八、找到工程文件所在目录,打开obj文件夹;
九、打开obj文件夹后你会惊奇的发现多出了一个output文件夹;
十、双击output文件夹,没错,这里就是你朝思暮想的bin文件!。
试图搞懂MDK程序下载到flash(三)--MDK配置选项Linker、Target、Debug的理解分析
试图搞懂MDK程序下载到flash(三)--MDK配置选项Linker、Target、Debug的理解分析在写这一节时,我还是想再重复一下自己写这文章的目的,我的目的就是为了实现将MDK 编写的裸机程序可不可以脱机运行,也就是不用调试的方法,因为调试的话程序默认是在SRAM中运行的,掉电丢失。
而要脱机运行,就得将程序编译后的文件下载到flash中,最好能是nand flash。
如果要下载到nand flash,那么就要编译生成一个bin文件,而不是用axf文件。
那么剩下的问题就是,怎么生成一个完整、正确的bin文件?所以我现在就需要看能否通过编写一个分散加载文件,解决bin文件的地址问题。
生成了bin文件,那么我就可以利用韦东山的方法,利用supervivi的v选项,配合DNW将程序下载到nand flash中并运行!现在咱们就分析一下MDK配置选项,首先解释一下MDK中三种linker之间的区别:1、采用Target对话框中的RAM和ROM地址。
采用此方式,需在Linker选项卡中勾选Use Memory Layout from Target Dialog选项(选中这一项实际上是默认在Target中对Flash和RAM的地址配置,编译链接时会产生一个默认的脚本文件),并且在Target中设置好RAM、ROM地址,图2所示。
MDK会根据Target选项中设定的RAM和ROM地址自动加载生成一个加载文件。
最后链接器会根据此文件中的信息对目标文件进行链接,生成axf镜像文件。
至于ROM和RAM是片内还是片外、容量(Size)多大,就需要根据芯片和开发板来决定了。
2、直接通过Linker选项卡中的R/O Base和R/W Base来设定链接信息。
链接器最后可根据此处指定的地址信息进行链接,链接的文件应该是顺序存放了,最多RO和RW分开。
此时需要注意的是应将Use Memory Layout from Target Diaglog前的勾去掉,且保证Scatter File一栏中未包含分散加载文件,并且要在Misc controls中设定镜像文件的入口点,如:--first 2440init.o(Init) 对于这个括号内的填写依据,我暂时还不懂。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
试图搞懂MDK程序下载到Flash(四)--生成bin文件下载到Nor Flash喜讯啊!!下载到flash中的一种实现了啊!!!鸡冻了!终于可以脱机运行了,尽管是下载到了Nor Flash中运行,还没有下载到Nand Flash中运行,但是这也是一个进步了吧,下面详细介绍一下MDK编译的程序下载到Nor Flash运行的步骤。
1、编写程序我的主程序功能是实现UART的输出功能,工程文档结构图如下:需要自己编写的文件有三个main.c uart.c uart.h,下面贴出这三个文件的实验代码:main.c文件#include<s3c2440.h>#include"uart.h"int main(){unsigned int a=10; //系统时钟初始化,FCLK=400MHz,HCLK=100MHz,PCLK=50MHzUart0_Init(115200); //初始化并设置波特率为115 200while(1){Uart0_Printf("Uart0_Printf test output is:%d\n",a);}}uart.c文件#include<s3c2440.h>#include<stdarg.h>#include"uart.h"#define PCLK 50000000#define UART_BRD (int)((PCLK/(baudrate*16))-1)/************************************************函数名称:void Uart0_Init(unsigned int baudrate)*参数说明:baudrate:波特率*返回值:无*全局变量: 无*功能:对UART0进行初始化************************************************/void Uart0_Init(unsigned int baudrate){GPHCON&=~((3<<4)|(3<<6)); //GPH2--TXD0;GPH3--RXD0GPHCON|=((2<<4)|(2<<6)); //设置GPH2、GPH3为TXD0、RXD0功能GPHUP=0x00; //上拉电阻使能ULCON0|=0x03; //设置数据发送格式:8个数据位,1个停止位,无校验位UCON0=0x05; //发送模式和接收模式都使用查询模式UBRDIV0=UART_BRD; //设置波特率,其中波特率作为一个参数传递到该初始化函数URXH0=0; //将URXH0清零}/************************************************函数名称:void putc(unsigned char c)*参数说明:c:通过串口接收到的字符,注意这里是8位数据*返回值:无*全局变量: 无*功能:将通过串口接收到的字符发送给PC机并显示在* 串口调试工具。
************************************************/void putc(unsigned char c){UTXH0=c;while(!(UTRSTAT0&(1<<2))); //等待发送完成}/************************************************函数名称:unsigned char getc(void)*参数说明:无*返回值:c:通过串口接收到的字符,注意这里是8位数据*全局变量: 无*功能:接收并保存通过串口输入的数据************************************************/unsigned char getc(void){unsigned char c;while(!(UTRSTAT0&(1<<0))); //查询是否接收到有效数据c=URXH0;return c;}/************************************************函数名称:static void Uart0_SendByte(int data)*参数说明:data:一个字节的数据*返回值:无*全局变量: 无*功能:向串口发送一个字节的数据。
这个函数只在本* C文件内使用,不被其他文件所调用,故使用* static来修饰。
************************************************/static void Uart0_SendByte(int data){if(data=='\n') //注意,在超级终端中使用的换行符是'\r',因此当遇到'\n'时 { //需要将其转换为'r'while(!(UTRSTAT0&(1<<2))); //等待发送完成UTXH0='\r';}while(!(UTRSTAT0&(1<<2))); //等待发送完成完成后,将新发送UTXH0=data; //的数据写入发送寄存器}*函数名称:static void Uart0_SendString(char *pt)*参数说明:pt:指针,指向将要发送的数据所在数组的地址*返回值:无*全局变量: 无*功能:发送字符串************************************************/static void Uart0_SendString(char *pt){while(*pt){Uart0_SendByte(*pt++);}}/************************************************函数名称:void Uart0_Printf(const char *fmt,...)*参数说明:可变参数*返回值:无*全局变量: 无*功能:将()的内容通过串口发送并在PC机显示************************************************/void Uart0_Printf(const char *fmt,...){va_list ap; //定义了一个指向可变参数列表指针char string[50]; //存储要发送的内容va_start(ap,fmt); //是参数列表指针ap指向函数参数列表中的第一个可变参数vsprintf(string,fmt,ap);va_end(ap);//清空参数列表Uart0_SendString(string); //将该缓冲区中的数据打印到串口中}//详细讲解请看博客:/mybelief321/article/details/8934635 uart.h文件#ifndef __UART_H__#define __UART_H__*函数名称:void Uart0_Init(unsigned int baudrate)*参数说明:baudrate:波特率*返回值:无*全局变量: 无*功能:对UART0进行初始化************************************************/void Uart0_Init(unsigned int baudrate);/************************************************函数名称:void putc(unsigned char c)*参数说明:c:通过串口接收到的字符,注意这里是8位数据*返回值:无*全局变量: 无*功能:将通过串口接收到的字符发送给PC机并显示在* 串口调试工具。
************************************************/void putc(unsigned char c);/************************************************函数名称:unsigned char getc(void)*参数说明:无*返回值:c:通过串口接收到的字符,注意这里是8位数据*全局变量: 无*功能:接收并保存通过串口输入的数据************************************************/unsigned char getc(void);/************************************************函数名称:void Uart0_Printf(const char *fmt,...)*参数说明:可变参数*返回值:无*全局变量: 无*功能:将()的内容通过串口发送并在PC机显示************************************************/void Uart0_Printf(const char *fmt,...);#endif我已经把整个工程文档放到了网上,可以下载下来直接编译:/detail/mybelief321/54184212、编写可以下载到nor flash的分散加载文件文件内容如下:;**********************************************************;***Scatter-Loading Description File generaed by uVision***;**********************************************************;Run in FlashLR_ROM1 0x00000000 ;load region{ER_ROM1 0x00000000 0x0200000 ;load address=execution address {*.o (RESET,+First)*(InRoot$$Sections).ANY (+RO)}RW_RAM1 0x30000000 0x4000000{.ANY (+RW +ZI)}RW_IRAM1 0x40000000 0x00001000 ;RW data{.ANY (+RW +ZI)}}这个文件配置的Nor大小是2MB,一般程序够用了。
3、配置选项Target选项Linker选项Scatter File一栏中,点击...添加自己上一步编写的Scatter文件RuninFlash.sct3、设置编译生成可以下载到flash的bin文件主要是利用fromelf.exe文件将生成的axf文件转换为bin文件,在User选项卡下的Run #1一栏中,点击...找到fromelf.exe的存放路径,它一般存放在你的安装目录下,然后紧接着你的路径后边输入--bin --output ***.bin ***.axf,其中***是你的工程名。