在MDK中添加自己的FLASH编程算法
在RealView MDK中使用J-Link对STM32F130ZET6外部Nor Flash烧写的方法

在RealView MDK中使用J-Link对STM32F130ZET6外部Nor Flash烧写的方法by 314forever文章中以STM32F103ZET6外接SST39VF6401B为例,在红牛实验板上操作成功。
图例中用到的地址需要根据你自己的情况作相应调整。
新建一个工作目录。
将x:\Keil\ARM\Flash\STM32F10x\下的所有文件拷进来,将x:\Keil\ARM\Flash\SST39x640x\下的FlashPrg.c文件拷进来并覆盖同名文件,将x:\Keil\ARM\Flash\下的FlashOS.h文件拷进来。
如果你使用的Nor Flash 不在MDK自带驱动的范围内,那么需要根据FlashPrg.c文件自行编写相关函数打开工程STM32Fx,在FlashDev.c中添加如下代码,有关这段代码请参考x:\Keil\ARM\Flash\SST39x640x\FlashDev.c修改FlashDev.c和FlashPrg.c中的头文件引用在目标属性中修改宏定义和输出文件编译此工程,将得到的STM32F10x_NOR.FLM文件拷入x:\Keil\ARM\Flash\文件夹中。
然后在MDK的Flash下载设置中就出现了NOR Flash的选项这样我们就得到了MDK对Nor Flash的接口文件,接下来是如何在工程中将数据弄到Nor Flash上。
新建工程,将要烧入Nor Flash中的数据单独存放在一个文件中然后自定义分散加载文件在这里把数据定义到Nor Flash中,注意地址要根据你自己的情况来设置在程序中要对数据进行使用,否则编译后未用到的数据可能会被优化掉编译结果添加Flash烧写算法,MDK会根据不同的地址采用不同的算法设置初始化操作文件,文件中的Bank初始化要根据你的情况来调整点击Load就可以把程序和数据分别烧入STM32和Nor Flash中,在烧写过程中可以看到最下方进度条中对不同地址烧写的情况(这个图始终截不到合适的)以后程序中就可以使用Nor Flash中的数据了如此操作后数据文件也就没什么用了,可以从工程中删除,同时还要修改分散加载文件(不改也没什问题,但是会有烦人的警告)用这个方法只能对Nor Flash进行写,没法读。
STM32 RVMDK JLINK下flash和RAM调试方法

STM32 RVMDK JLINK 下flash 和RAM 调试方法stm32f107vc 开发板,uvision V4.00u,JLINK V8,J-Link ARMV4.08l。
flash 下调试方法:1.打开要调试的工程,左栏工程上右击options for target。
进入debug 中选择jlink.2. utility 中选择jlink.3. 用JLINK 连接PC 和开发板,打开开发板电源。
进入旁边的settings,添加flash 烧写方法。
4。
一路OK 回去,rebuild,ctrl+F5 进入调试,可以单步和断点。
根据ST 公司的reference manual 2.3.3 embedded flash,知道flash 的地址从0x0800 0000 开始。
在调试窗口中看到汇编的地址为0x0800 开头,说明代码段烧进了flash。
SRAM 下调试方法:1. 将Keil 安装目录下D:\Keil\ARM\Boards\Keil\MCBSTM32\STLIB_Blinky的ram.ini 拷贝到需要调试的工程目录下,并把需要载入的文件改为需调试工程AXF 文件的位置和名称,此处工程为GPIO。
2. 根据reference manual 2.3.1,SRAM 的起始地址为0x2000 0000。
要将代码段放入SRAM 中,必须设置程序只读段从SRAM 起始位置开始,一定长度(此处设置为0X4000)后,数据段RAM 开始。
注意两端的长度不能超过SRAM 的总大小。
3. 同flash 下调试的步骤1 和2,选择jlink。
4. 在debug 页下添加ram.ini。
5. 选择不要擦除flash,修改代码段和数据段的位置和大小。
6. 一路OK,rebuild,ctrl+F5 进入调试。
可以单步,step in 和断点。
看汇编。
试图搞懂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程序下载到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机并显示在* 串口调试工具。
MDK下直接使用NAND_FLASH的方法

三ቤተ መጻሕፍቲ ባይዱ如果以后程序加大会出现下载失败,那是因为下载设置中对于NAND设置的大小太小了,因为如果设置太大会每次都按照设置擦除一次,有点太慢了。所以我设置的比较小。
一般我们开发的时候,如果有仿真器的话,选择SDRAM方式,不用写进FLASH里面,直到调试成功再写。
对于用NANDFLASH方式,会在每次仿真的时候自动下载。
注意:!!
一、不允许修改测试程序中的初始化汇编程序前面指令的结构,因为在这些数据里面有些参数引导程序要读取判断,并且要修改。
三、解压软件测试到一个文件夹中,同样用MDK打开相应的工程文件,也是自己编译一下,然后点击下载,程序就可以工作了。
以后自己写的用户程序,只要修改这个软件测试的工作就可以了。这个测试程序有三种工作模式,一种是完全软件仿真,一种是程序直接写到SDRAM里面运行,另外一种就是普通的写到FLASH里面。
请按照以下顺序操作就可以:
一、将压缩文件中的S3C2440_NAND_MY.FLX拷贝到MDK软件安装目录下的FLASH目录下就可以了。
二、解压bootloader到一个文件夹中,然后用MDK打开相应的工程文件,自己编译一下,然后点击下载,或者是从菜单选择(Flash->DownLoad)也可以。下载成功后关闭此项目。
试图搞懂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.Realview MDK常见问题及解决方法

Realview MDK常见问题及解决方法解决方法:使用RVCT的fromelf.exe工具进行转换。
也就是说首先将源文件编译链接成*.axf的文件,然后使用fromelf.exe工具将*.axf格式的文件转换成*.bin格式的文件。
假设工程文件的名字为Axf_To_Bin,下面将具体说明这个操作步骤:1.打开Axf_To_Bin文件中的Axf_To_Bin.uv2工程文件;2.打开Options for Target‘Axf_To_Bin’对话框,选择User标签页;3.构选Run User Programs After Build/Rebuild框中的Run#1多选框,在后边的文本框中输入C:\Keil\ARM\BIN31\fromelf.exe--bin-o./output/Axf_To_Bin.bin./output/Axf_To_Bin.axf命令行;4.重新编译文件,在./output/文件夹下生成了Axf_To_Bin.bin文件。
在上面的步骤中,有几点值得注意的是:1.C:\Keil\ARM\BIN31\表示RV MDK的安装目录;2.fromelf.exe命令的具体语法格式如下:命令的格式为:fromelf[options]input_file命令选项如下:--help显示帮助信息--vsn显示版本信息--output file输出文件(默认的输出为文本格式)--nodebug在生成的映象中不包含调试信息--nolinkview在生成的映象中不包含段的信息二进制输出格式:--bin生成Plain Binary格式的文件--m32生成Motorola32位十六进制格式的文件--i32生成Intel32位十六进制格式的文件--vhx面向字节的位十六进制格式的文件t--base addr设置m32,i32格式文件的基地址--text显示文本信息文本信息的标志-v打印详细信息-a打印数据地址(针对带调试信息的映象)-d打印数据段的内容-e打印表达式表print exception tables-f打印消除虚函数的信息-g打印调试表print debug tables-r打印重定位信息-s打印字符表-t打印字符串表-y打印动态段的内容-z打印代码和数据大小的信息解决方法:用户可以自定义flash烧写算法,并把它们集成到Realview MDK中。
【STM32H7教程】第84章STM32H7的SPI总线应用之SPIFlash的MDK下载算法制作

【STM32H7教程】第84章STM32H7的SPI总线应⽤之SPIFlash的MDK下载算法制作完整教程下载地址:第84章 STM32H7的SPI 总线应⽤之SPI Flash的MDK下载算法制作本章节为⼤家讲解MDK下载算法制作⽅法。
84.1 初学者重要提⽰84.2 MDK下载算法基础知识84.3 创建MDK下载算法通⽤流程84.4 SPI Flash的MDK下载算法制作84.5 SPI Flash的MDK下载算法使⽤⽅法84.6 实验例程说明84.7 总结84.1 初学者重要提⽰1. SPI Flash的相关知识点可以看第78章和79章。
2. SPI Flash下载算法⽂件直接采⽤HAL库制作,⽅便⼤家⾃⼰修改。
84.2 MDK下载算法基础知识Flash编程算法是⼀种⽤于擦除应⽤程序或将应⽤程序下载到Flash的程序代码。
MDK本⾝⽀持的各种器件都⾃带下载算法,存放在MDK各种器件的软件包⾥⾯,以STM32H7为例,算法存放在\Keil\STM32H7xx_DFP\2.6.0\CMSIS\Flash(软件包版本不同,数值2.6.0不同),但不⽀持的需要我们⾃⼰制作,本章教程为此⽽⽣。
84.2.1 程序能够通过下载算法下载到芯⽚的核⼼思想认识到这点很重要:通过MDK创建⼀批与地址信息⽆关的函数,实现的功能主要有初始化,擦除,编程,读取,校验等,然后MDK调试下载阶段,会将算法⽂件加载到芯⽚的内部RAM⾥⾯(加载地址可以通过MDK设置),然后MDK通过与这个算法⽂件的交互,实现程序下载,调试阶段数据读取等操作。
84.2.2 算法程序中擦除操作执⾏流程擦除操作⼤致流程:加载算法到芯⽚RAM。
执⾏初始化函数Init。
执⾏擦除操作,根据⽤户的MDK配置,这⾥可以选择整个芯⽚擦除或者扇区擦除。
执⾏Uinit函数。
操作完毕。
84.2.3 算法程序中编程操作执⾏流程编程操作⼤致流程:针对MDK⽣成的axf可执⾏⽂件做Init初始化,这个axf⽂件是指的⼤家⾃⼰创建应⽤程序⽣成的。
100分嵌入式系统考试参考答案

一、单项选择1. 串口中断中下列哪一个中断的优先级最低的:()(A) RDA中断(B) THRE中断(C) C TI中断(D) RLS中断2. 外设时钟PCLK为24MHz,定时时间为100us,不使用预分频,则匹配寄存器的值为:()(A) 1200(B) 2000(C) 2400(D) 48003. 配置串口通信数据格式时应该访问下列哪一个寄存器:()(A) UnTHR(B) UnLCR(C) U nIIR(D) UnLSR4. 控制引脚P1.16应该访问哪一个引脚功能选择寄存器:()(A) PINSEL3(B) PINSEL1(C) P INSEL0(D) PINSEL25. 当需要往引脚上同时输出高电平和低电平时应该访问哪一个寄存器:()(A) FIOSET(B) FIODIR(C) F IOCLR(D) FIOPIN6. LPC1768微控制器属于什么内核:()(A) Cortex-M4(B) Cortex-M3(C) C ortex-A(D) Cortex-M07. 锁相环0倍频后输出的时钟的最高频率不超过:()(A) 300MHz(B) 275MHz(C) 550MHz(D) 500MHz8. 安装完MDK软件后,下列哪一个文件夹包含了Flash编程算法:()(A) Flash(B) Boards(C) S tartup(D) Hlp9. GPIO中断和哪一个外部中断共用一个中断通道:()(A) 外部中断1(B) 外部中断3(C) 外部中断2(D) 外部中断010. 上电复位后下列哪一个外设的功率控制默认是不使能:()(A) 定时器0(B) GPIO模块(C) U SB模块(D) 串口011. 串口模块中哪一个串口具备RS485通信功能:()(A) UART2(B) UART3(C) U ART0(D) UART112. 异步串行通信的字符格式中起始位是什么电平:()(A) 高电平(B) 低电平(C) 高阻态(D) 不定态13. 前后台编程模式中,后台程序指的是:()(A) 主程序(B) 中断服务程序(C) 引导程序(D) 初始化程序14. LPC1768微控制器的引脚在上电复位后处于什么模式:()(A) 上拉模式(B) 开漏模式(C) 下拉模式(D) 中继模式15. 在MDK软件的仿真界面查看存储器应该使用下列哪一个调试窗口:()(A) Watch窗口(B) 外设窗口(C) U ART窗口(D) Memory窗口16. LPC1768微控制器的Flash大小为:()(A) 128KB(B) 64KB(C) 256KB(D) 512KB17. 当引脚配置为下列哪一种功能时无法使用FIOPIN读取引脚的状态:()(A) A/D功能(B) 定时器功能(C) 串口通信功能(D) GPIO功能18. 串口通信采用查询方式接收数据时应该访问下列哪一个寄存器:()(A) UnIIR(B) UnLCR(C) U nTHR(D) UnLSR19. UnFCR寄存器的值为0x87,则FIFO的触发点是多少字节:()(A) 1字节(B) 14字节(C) 4字节(D) 8字节20. 设置外部中断的中断极性应该访问下列哪一个寄存器:()(A) EXTMODE(B) EXIINT(C) F IODIR(D) EXTPOLAR21. 在一般的工程应用中LPC1768微控制器采用哪一个振荡器作为时钟源:()(A) 主振荡器(B) 外加时钟信号(C) R TC振荡器(D) 内部RC振荡器22. LPC1751微控制器的SRAM大小为:()(A) 64KB(B) 32KB(C) 8KB(D) 128KB23. GPIO模块中要让引脚输出高电平应该向FIOSET寄存器写入什么:()(A) 0xFF(B) 1(C) 0(D) 0x5524. LPC1768微控制器的P1.31引脚一共有几种功能:()(A) 1种(B) 2种(C) 3种(D) 4种25. LPC1768微控制器的GPIO引脚最多有:()(A) 100个(B) 70个(C) 90个(D) 60个26. 在MDK软件开发工程时,如果要求硬件系统掉电后下一次上电仍然能够运行程序,应该使用下列哪一种模板:()(A) Flash模板(B) Ram模板(C) S imulate模板(D) HEX模板27. 当使用P1.27作为捕获引脚时,捕获值存放在哪一个捕获寄存器中:()(A) CR0(B) CR3(C) C R1(D) CR228. 外部中断3对应的引脚为:()(A) P2.13(B) P2.10(C) P2.12(D) P2.1129. LPC1768有多少个定时器/计数器:()(A) 4个(B) 3个(C) 2个(D) 1个30. 在MDK软件的工程设置栏中,下面哪一个选项卡中包含RL-RTX实时内核的选择:()(A) Option(B) Debug(C) D evice(D) Target31. 配置锁相环0的参数应该访问下列哪一个寄存器:()(A) PLL1STAT(B) PLL0STAT(C) P LL0CON(D) PLL0CFG32. 在RL-RTX实时内核中,内核的初始化函数是下列哪一个:()(A) OS_DLY_WAIT(B) OS_TSK_CREATE© OS_TSK_DELETE_SELF(D) OS_SYS_INIT()33. 11位数据位的异步串行通信的波特率误差最大不能超过多少:()(A) 6.25%(B) 5.56%© 4.50%(D) 4%分值:2.5这个在教材中答案就是4.5%啊,不知系统为啥给错了34. 下列嵌入式操作系统中哪一个是国产的:()。
【经验分享】KL25在MDK中将函数指定到flash地址

【经验分享】KL25在MDK中将函数指定到flash地址一,经验分享描述在之前的经验分享中写了些在KE02下,CW,IAR以及keil的编译环境中,如何定义constant到指定的flash地址。
但是实际上,大家在使用我们kinetis的过程中,可能也希望能够灵活的将某个函数直接定义到指定的flash地址,这样,如果改变这个函数,实际上,只需要改变函数所在的flash,而不需要更新所有的flash。
所以,为了方便大家操作,我们论坛里已经推出了在CW以及IAR下,如何指定函数到具体的flash地址,本文就讲解下,在MDK的环境下如何实现指定函数到具体的flash地址。
二,经验分享在MDK环境下实现该经验分享要在MDK中实现函数的绝对地址指定,一共有两点需要注意:scatter文件中函数绝对地址的开辟以及程序中将函数定义到定义的绝对地址处。
下面来仔细讲解这两点1.在.sct文件中定义函数要存放的地址.sct文件可以在工程的UV4Build文件夹中找到,找到后可以拖进MDK界面中即可以打开,可以使用如下格式定义这个地址:ER_IROM2 绝对地址 FIXED{*.o (段地址名)}例如,在本次试验中,希望将函数定义到flash地址:0x0001E000这个地址,靠近flash空间的尾部。
实际我们的定义如下图:另外,每次编译之后,编译器都会重新生成.sct文件,所以为了避免写的代码被刷掉,需要做一些配置,禁止使用编译器每次生成的.sct文件,而是使用指定的.sct 文件。
修改方法:project->options for target->linker, 不勾选 use memory layout from target dialog. 如下图所示:这样,你每次修改后的platinum_flash.sct在编译之后就不会被改变掉了。
2. 在主函数中定义函数接下来要做的就是将所定义的函数放到1里面所定义的flash地址段中。
S3C2440开发板MDK下向S3C2440 nand flash烧写程序程的实现

MDK下向S3C2440 nand flash烧写程序程的实现发布时间:2009-7-23 阅读次数:1739 字体大小: 【小】【中】【大】当大家看到题目时也许会觉得很简单,用J-LINK来烧写程序到NAND FLASH很简单,我想说的是,如果是学习,那么就应该不光要知其然,更要知其所以然。
如果你是老手,建议就不要看下去了,因为这块你已经熟悉的不能再熟悉了,而对于新手来说的确很有用。
注:所使用的开发环境为Keil MDK 3.50,需要了解的部分有Bootloader,分散加载一工作任务1、向S3C2440 NAND FLASH烧写程序这点对ARM入门的人来说都不是件难事。
先说说我的硬件配置吧,64M NAND FLASH,64M SDRAM,2M NOR FLASH。
当程序下载到NAND FLASH时,系统上电运行后由NAND FLASH的控制器把前4K程序拷贝到SRAM来运行。
如果程序大于4K,那么仅仅把程序下载到NAND FLASH中是不能完全运行的,这是因为程序不能在NAND FLASH中运行,必须利用SRAM把程序从NAND FLASH搬移到SDRAM中,搬移过程完成后再把PC指向SDRAM中的程序所放置的起始位置,此时bootloader的使命才算完成。
2、Bootloader的编写要实现上述功能,必须编写一个小于4K的启动或者Bootloader程序。
在Bootloader中应包含有中断向量表,异常向量表,时钟初始化,SDRAM初始化,GPIO及堆栈初始化等工作,另外还要有相应的代码将程序从NAND FLASH搬移到SDRAM的功能。
3、程序下载虽然实现了Bootloader,也将其下载到了NAND FLASH中,也可以将程序从NAND FLASH搬移到SDRAM中,并且将PC交给SDRAM的程序首地址处,但程序并不能正确运行。
为什么呢?这是因为下载到NAND FLASH的可执行程序中包含有绝对地址,尽管程序从NAND FLASH搬移到了SDRAM中,但当运行到绝对地址是,程序就会跑飞,从而不能正确运行。
试图搞懂MDK程序下载到flash(二)--分散加载文件scatter

试图搞懂MDK程序下载到flash(二)--分散加载文件scatter分散加载文件概念对于分散加载文件的概念,在《ARM体系结构与编程》书第11章有明确介绍。
分散加载文件(即scatter file,后缀为 .scf)是一个文本文件,通过编写一个分散加载文件来指定ARM连接器在生成映像文件时如何分配RO、RW、ZI等数据的存放地址。
如果不用SCATTER文件指定,那么ARM连接器会按照默认的方式来生成映像文件,一般情况下我们是不需要使用分散加载文件的。
但在某些场合,我们希望把某些数据放在知道那个的地址处,那么这时候SCATTER文件就发挥了非常大的作用,而且SCATTER文件用起来非常简单好用。
我越看这个分散加载文件越感觉它的作用和uboot的连接脚本lds 一样。
分散加载文件的格式分散加载描述文件是一个文本文件,它向链接器描述目标系统的存储器映射。
如果通过命令行使用链接器,则描述文件的扩展名并不重要。
分散加载文件指定:①每个加载区的加载地址和最大尺寸;②每个加载区的属性;③从每个加载区派生的执行区;④每个执行区的执行地址和最大尺寸;⑤每个执行区的输入节。
从描述文件的格式就可以看出加载区、执行区和输入节的层次关系。
分散加载文件基本点①编译后输出的映像文件中各段是首尾相连的,中间没有空闲的区域,他们的先后关系是根据链接时参数的先后次序决定的armlinker -file1.o file2.o ...② scatter用于将编译后的映像文件中的特定段加载到多个分散的指定内存区域③有两类域(region):执行域(execution region,一般是ram区域)和加载域(load region,一般是rom区域)④加载域:就是编译之后得到的二进制文件烧写到rom中的这一段区域,所有的代码R0、预定义变量RW、堆栈之类和清不清空无关紧要的大片内存区域ZI,都包括在其中。
⑤执行域:就是把加载域进行“解压缩”后的样子。
在MDK中添加自己的FLASH编程算法

在MDK中添加自己的FLASH编程算法在MDK中添加自己的FLASH编程算法在Realview MDK中,Flash烧写算法不是通用的,都是针对具体的Flash存储芯片的。
由于市面上的Flash种类比较多,所以Realview MDK不可能包含所有的Flash芯片烧写程序。
但是在具体的应用中,开发者在Realview MDK中可能会找不到自己所需要的Flash烧写程序,这时,用户就必须自己添加Flash烧写程序。
本文将详细的探讨这种方法。
Realview MDK已经定义好了添加到其中的Flash烧写算法的接口,包括1个描述Flash芯片的结构体和6个对Flash芯片操作的函数定义。
详细的内容可以参考下面的代码。
struct FlashDevice {unsigned short Vers; // 体系结构及版本号;char DevName[128]; // 设备的名称及描述;unsigned short DevType; // 设备的类型,例如: ONCHIP, EXT8BIT, EXT16BIT等等;unsigned long DevAdr; // 默认设备的起始地址;unsigned long szDev; // 设备的总容量;unsigned long szPage; // 页面的大小;unsigned long Res; // 保留,以便将来扩展之用;unsigned char valEmpty; // Flash擦除后储存单元的值;unsigned long toProg; // 页写函数超时的时间;unsigned long toErase; // 扇区擦除函数超时的时间;struct FlashSectors sectors[SECTOR_NUM]; //扇区的起始地址及容量设置数组。
};extern int Init (unsigned long adr, unsigned long clk, unsigned long fnc);extern int UnInit (unsigned long fnc);extern int BlankCheck (unsigned long adr, unsigned long sz, unsigned char pat);extern int EraseChip (void);extern int EraseSector (unsigned long adr);extern int ProgramPage (unsigned long adr, unsigned long sz, unsigned char *buf);extern unsigned long Verify (unsigned long adr, unsigned long sz, unsigned char *buf);在Realview MDK中,添加Flash烧写算法的实质就是填充上面的那个结构体以及实现那6个函数。
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没有太⼤的区别。
MDK5新建工程MDK5使用技巧STM32F4在线调试

MDK5新建⼯程MDK5使⽤技巧STM32F4在线调试建⽴相关⽂件夹如图所⽰FWLIB放官⽅固件库⽂件,HARDWARE放⾃⼰编写的.C,.H⽂件,USER放主函数⽂件,⼯程,启动⽂件等。
1,⾸先,打开 MDK(以下将 MDK5 简称为 MDK)软件。
然后点击 Project---New uVision Project ,然后保存在USER⽂件夹下,⼯程名⾃取。
2,选择 STMicroelectronics--STM32F4 Series--STM32F407--STM32F407ZGT6(如果使⽤的是其他系列的芯⽚,选择相应的型号就可以了,特别注意:⼀定要安装对应的器件 pack才会显⽰这些内容哦!!)。
3,点击 OK, MDK 会弹出 Manage Run-Time Environment 对话框。
这是 MDK5 新增的⼀个功能,在这个界⾯,我们可以添加⾃⼰需要的组件,从⽽⽅便构建开发环境,不过这⾥我们不做介绍。
所以在图 3.2.4 所⽰界⾯,我们直接点击 Cancel,即可。
得到如图所⽰界⾯:4,到这⾥,我们还只是建了⼀个框架,还需要添加启动代码,以及.c ⽂件等。
这⾥我们先介绍⼀下启动代码:启动代码是⼀段和硬件相关的汇编代码。
是必不可少的!这代码主要作⽤如下:1、堆栈(SP)的初始化;2、初始化程序计数器(PC);3、设置向量表异常事件的⼊⼝地址;4、调⽤ main 函数。
感兴趣的朋友可以⾃⼰去分析这部分代码。
ST 公司为 STM32F40x 和 STM32F41x 系列的 STM32F4 提供了⼀个共同的启动⽂件,名字为: startup_stm32f40_41xxx.s。
我们开发板使⽤的是 STM32F407ZGT6,属于 STM32F40x 系列⾥⾯的,所以直接使 startup_stm32f40_41xxx.s 这个启动⽂件即可。
不过这个启动⽂件,我们做了⼀点点修改,具体是 Reset_Handler 函数,该函数修改后代码如下:Reset_Handler PROCEXPORT Reset_Handler [WEAK];IMPORT SystemInit ;寄存器代码,不需要在这⾥调⽤ SystemInit 函数,;故屏蔽掉,库函数版本代码,可以留下;不过需要在外部实现 SystemInit 函数,否则会报错.IMPORT __mainLDR R0, =0xE000ED88 ;使能浮点运算 CP10,CP11LDR R1,[R0]ORR R1,R1,#(0xF << 20)STR R1,[R0];LDR R0, =SystemInit ;寄存器代码,未⽤到,屏蔽;BLX R0 ;寄存器代码,未⽤到,屏蔽LDR R0, =__mainBX R0ENDP这段代码,我们主要加⼊了开启 STM32F4 硬件 FPU 的代码,以使能 STM32F4 的浮点运算单元。
stm32g0 flash编程例程

下属单位免息报告
下属单位免息报告
尊敬的领导:
我谨代表本单位,向您提交关于下属单位免息的报告。
本报告旨在请求贵单位对下属单位进行免息扶持,以缓解其经济压力,并促进单位的健康发展。
下属单位作为本单位的重要组成部分,一直以来都在积极履行其职责,为本单位的发展做出了重要贡献。
然而,由于市场环境的变化和经营成本的不断增加,下属单位的经营状况面临较大的压力。
为了确保下属单位的正常运转和持续发展,本单位希望能得到贵单位的免息扶持。
免息扶持将为下属单位提供以下益处:
1. 缓解经济压力:免息扶持将减轻下属单位的财务负担,使其能够更好地专注于业务发展,提高经营效益。
2. 增强竞争力:免息扶持将使下属单位有更多的资金用于设备更新、技术研发等方面,提高其市场竞争力。
3. 促进健康发展:免息扶持将为下属单位提供稳定的资金来源,有助于其建立稳健的财务基础,促进单位的健康发展。
为了确保免息扶持的有效实施,本单位将与下属单位签订相关协议,明确双方的权利和义务。
同时,本单位将加强对免息资金的使用监管,确保其合理、合规地用于下属单位的经营发展。
在此,我们诚挚地请求贵单位对下属单位进行免息扶持,以共同推动本单位的发展。
如有任何疑问或需要进一步了解详情,请随时与我们联系。
谢谢!
此致
敬礼!
(您的姓名)
(您的职务)
(日期)null。
试图搞懂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之间。
KEIL+MDK370+JLINK+V8在STM32的SRAM和FLASH中的调试方法

KEIL MDK370 JLINK V8在STM32的SRAM和FLASH中的调试方法本文以STM32F103VE芯片为例,根据STM32F103VE Datasheet可知芯片的片内FLASH 基址为0x08000000,大小为512K(0x80000);片内RAM基址为0x20000000,大小为64K (0x10000)。
芯片启动模式如下:(一) 图解KEIL MDK370 JLINK V8在STM32的SRAM中的调试方法:(1)打开一个工程,选择Flash菜单下的Configure Flash Tools,打开选项对话框。
如上图所示,在target选项中修改IROM1的Start值为:0x20000000,Size:0x8000 (32K);IRAM1的Start值为0x20008000,Size:0x8000 (32K)。
即把64K的内存分为32K的FLASH和32K的RAM。
(2)Output选项卡中选中Create HEX File,如下图所示。
(3)在Debug选项中仿真器选择Cortex-M3 J-LINK,Initialization File一栏中点击按钮选择RAM.ini文件(D:\Keil\ARM\Boards\Keil\MCBSTM32\STLIB_Blinky中的RAM.ini)。
设置如下:并点击仿真器一栏Settings按钮,进一步设置,如下图,注意Debug选项中interface中选择USB,如下图所示,在Flash Download中配置,选中Do not Erase,在RAM for Algorithm中Start 设置为0x20008000,Size设置为0x8000,设置STM32F10x-High-density Flash 的地址Start:0x20000000,size:0x00008000,点击OK。
注意:如果在Programming Algorithm中没有STM32F10x-High-density Flash,就单击Add按钮添加,然后修改即可。
EEPW ARM DIY手记之软件设计(一)——MDK_ARM工程的搭建

EEPW ARM DIY手记之软件设计(一)——MDK_ARM工程的搭建作者:胡恩伟时间:2012年3月17日星期六从本篇博客起,我将带领大家进入本次ARM DIY活动的软件设计世界。
首先介绍MDK_ARM(V4.23)中工程的搭建,然后结合本次DIY板,依次介绍各功能模块及嵌入式操作系统移植相关的软件设计。
可能大家觉得之前得几片DIY手记之硬件功夫整片都是文字,看着有点头大了,以后我的博客将图文并茂,力争在有限的文字中为大家呈现更多的精彩内容。
今天先介绍一下MDK_ARM(V4.23)中STM32软件工程的搭建,最后将得到一个工程模板,以后的工程都将基于此建立。
关于本次ARM DIY活动所使用软件设计的编程环境详细信息请参见我之前的博客《EEPW ARM DIY手记之软硬件设计使用软件说明》,这里不再赘述,软件环境MDK_ARM(V4.23) 的下载、安装也不在本博客的内容之列,敬请查看相关书籍或网络博客。
以下是在MDK_ARM(V4.23)中搭建STM32软件工程的详细步骤:目录一、下载、安装及破解MDK_ARM(V4.23)(此处略); (2)二、新建STM32工程 (2)三、设置工程选项 (6)四、配置工程调试工具 (9)五、编译工程 (11)六、注意事项 (12)一、下载、安装及破解MDK_ARM(V4.23)(此处略);二、新建STM32工程下载并解压STM外设支持库STM32F10x_StdPeriph_Lib_V3.5.0至某一新建文件夹Example(可任意命名):如下图:然后,在Example目录下新建工程目录:My_STM32_MDK_Prj_Template。
随后,打开MDK 软件,Project->New uVision project,如下图,打开刚刚新建的工程目录,新建工程My_STM32_MDK_Prj_Template,保存。
接下来,选择目标器件Target CPU:选择STM32F103ZE接着弹出是否复制STM32的启动汇编代码startup_stm32f10x_hd.s(也就是boot loader)到工程,点击是;在新建工程目录下就可以发现多有一个文件startup_stm32f10x_hd.s(如下右图所示):接着,将\Examples\stm32f10x_stdperiph_lib\STM32F10x_StdPeriph_Lib_V3.5.0\Project\ STM32F10x_StdPeriph_Template目录下的stm32f10x_conf.h,stm32f10x_it.hc,stm32f10x_it.h 以及system_stm32f10x.c四个用户可配置文件复制到新建的工程目录下:点击菜单栏工程目录快捷管理图标如下图所示:在弹出的对话框中新建Default、User、StdPeriph_Driver、CMSIS、Onbaord_Parts五个文件组(Group),分别用于管理启动代码,用户代码、标准外设库代码、ARM提高的底层CMSIS 代码硬件与DIY板子上外扩功能模块相关的驱动程序代码,并将相应的代码添加到对应的组:添加文件示例添加当前工程目录下的启动代码startup_stm32f10x_hd.s到Default组添加刚刚拷贝到工程目录下得四个用户可配置文件到User组添加\Examples\stm32f10x_stdperiph_lib\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\ STM32F10x_StdPeriph_Driver\src目录下的所有代码文件到StdPeriph_Driver组添加\Examples\stm32f10x_stdperiph_lib\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries \CMSIS\CM3目下所有文件(*.c)到CMSIS组点击OK,回到工程界面,得到如下工程目录:至此,整个STM32工程的目录建立完成,还需要进行一下工程设置才能顺利编译工程,否则会出现如下错误:..\stm32f10x_stdperiph_lib\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_ Driver\src\stm32f10x_bkp.c(23): error: #5: cannot open source input file "stm32f10x_bkp.h": No such file or directory三、设置工程选项选中Target1,右键选中Option for Target1,弹出如下工程选项窗口:切换至Output,配置如下:此时,点击设置工程编译生成目标文件保存目录为\Examples\My_STM32 _MDK_Prj_Template\obj\(此处obj文件夹为新建目录),这样的设置可以避免在工程根目录下生产编译的之间文件,便于工程管理。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
struct FlashSectors sectors[SECTOR_NUM]; //扇区的起始地址及容量设置数组。
};
extern int Init (unsigned long adr, unsigned long clk, unsigned long fnc);
extern int UnInit (unsigned long fnc);
1. 在C:\Keil\ARM\Flash下新建一个空的子文件夹;
2. 在Flash文件夹中选择一个已存在的,且和欲添加的Flash算法相近的内容(如 ..\ARM\Flash\LPC_IAP_256) 拷贝到这个新文件中,并将此算法作为新算法的模板;
3. 重命名工程文件LPC_IAP_256.UV2以表示新的Flash ROM设备名,如29F400.UV2并用μVision IDE将其打开;
extern int BlankCheck (unsigned long adr, unsigned long sz, unsigned char pat);
extern int EraseChip (void);
extern int EraseSector (unsigned long adr);
unsigned short DevType; // 设备的类型,例如: ONCHIP, EXT8BIT, EXT16BIT等等;
unsigned long DevAdr; // 默认设备的起始地址;
unsigned long szDev; // 设备的总容量;
unsigned long szPage; // 页面的大小;
4. 在对话框Project - Options for Target - Output 中将所有的输出文件名(如 LPC_IAP_256)替换为新的设备名;
5. 编辑FlashPrg.C文件并为EraseChip, EraseBlock及ProgramBlock定义函数代码。在函数Init和UnInit中编写定义好了添加到其中的Flash烧写算法的接口,包括1个描述Flash芯片的结构体和6个对Flash芯片操作的函数定义。详细的内容可以参考下面的代码。
struct FlashDevice {
unsigned short Vers; // 体系结构及版本号;
char DevName[128]; // 设备的名称及描述;
在MDK中添加自己的FLASH编程算法
在Realview MDK中,Flash烧写算法不是通用的,都是针对具体的Flash存储芯片的。由于市面上的Flash种类比较多,所以Realview MDK不可能包含所有的Flash芯片烧写程序。但是在具体的应用中,开发者在Realview MDK中可能会找不到自己所需要的Flash烧写程序,这时,用户就必须自己添加Flash烧写程序。本文将详细的探讨这种方法。
在Realview MDK中,添加Flash烧写算法的实质就是填充上面的那个结构体以及实现那6个函数。至于几个函数是如何被Realview MDK调用的,用户不必关心,这些是由Realview MDK自动管理的,只要正确的实现了上面的那些内容,开发者就可以将Realview MDK编译链接后的程序下载到自己的Flash芯片中去。下面是添加一个Flash烧写的详细步骤:
extern int ProgramPage (unsigned long adr, unsigned long sz, unsigned char *buf);
extern unsigned long Verify (unsigned long adr, unsigned long sz, unsigned char *buf);
unsigned long Res; // 保留,以便将来扩展之用;
unsigned char valEmpty; // Flash擦除后储存单元的值;
unsigned long toProg; // 页写函数超时的时间;
unsigned long toErase; // 扇区擦除函数超时的时间;
6. 在文件FlashDev.C中的struct FlashDevice结构体中定义设备参数;
7. 重新编译工程,将在C:\Keil\ARM\Flash文件夹下生成*.FLX 格式的Flash编程算法。此文件即为所添加的Flash编程算法;
8. 使用Configure Flash Download 中的Add按钮可将此编程算法文件添加到目标应用工程中。