完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
给单片机下载程序的原理
给单片机下载程序一般有两种方法: 1,使用厂家提供的bootloader,使用特定软件通过串口等方式下载二进制文件到单片机的内置flash,这种方法的局限性是只能下载到厂家bootloader定义的存储器上; 2,使用调试器通过SWD/JTAG接口下载二进制文件。这种方式原理相对复杂,分为以下几步: 1)下载运行在ram中的bootloader程序到目标单片机的ram中 2)下载部分数据到目标单片机的ram中做数据缓冲 3)bootloader把缓冲区中的数据搬运到存储器上 4)重复2-3步直到所有数据下载完成 实用性 使用KEIL下载文件到单片机外置FLASH的方法适用于: 1,项目开发中目标板没有预留其他通信接口,或者处于开发初期,没有文件传输的对应上位机又急需下载数据做项目开发用。 2,JLINK,STLINK等调试器都提供了下载二进制文件到自定义存储器的接口,但每种不同的调试器接口都不同,需要分别适配,并且JLINK并没有提供开发bootloader的SDK。使用KEIL可以不受这些限制。 3,较小的数据文件可以直接下载到单片机的内置存储器,或者首先下载到单片机的内置flash然后通过单片机程序搬运到外置存储器来间接实现。本方法同样适用于要下载的数据文件大于或远大于单片机内置存储器的情况。 要解决的难点 1,怎样编写bootloader程序 2,KEIL软件只能下载编译好的axf程序文件,怎样把要下载的数据文件转化为axf文件 怎样编写bootloader 在KEIL里,这段bootloader程序被称为flash算法,打开KEIL的设置面板 看到flash算法一部分来自于芯片的package包,一部分来自于mdkcore,选中一个package包中的flash算法,复制其文件路径用文件管理器打开(去掉末尾的文件名): 其中有两个文件夹,是flash算法的工程模板,复制一份出来做修改,我这里已经复制好了: 。然后打开工程,修改生成的文件名: 精简FlashPrg.c文件,删除其中所有宏定义和函数的具体实现,因为我们用不到,然后保留以下函数的定义: 针对自己的存储器实现这些接口函数,主要是Init,EraseSector,EraseChip和ProgramPage这4个函数,其他函数直接返回成功即可。 然后修改FlashDev.c文件中的结构体参数,我这里使用的flash芯片是w25q128,根据具体的存储器做修改: 现在可以编译程序,生成如下文件: 现在打开KEIL发现我们自定义的算法还是没有出现,这时打开Keil.STM32L4xx_DFP.pdsc文件,文件路径为D:Keil_v5ARMPackKeilSTM32L4xx_DFP2.2.0, 我这里使用notpad++打开,Ctrl+F搜索单片机型号,我这里搜索STM32L4R9ZIY,看到了想要的东西 红框中是我添加的,同时修改flash起始地址为0x09000000和大小为0x01000000。然后保存,打开keil,发现我们的自定义flash出现在了选择框内: 使用KEIL下载文件 KEIL只能下载axf文件,因此我们要想办法生成axf为文件,可以自己制作,但最方便的还是使用KEIL自己编译,主要有以下几步: 1,使用bin2C软件把要下载的文件转化为C语言数组 2,把此C语言数组添加进KEIL工程中,工程中只能有这个C语言数组,不能包含任何函数或其他数据 3,修改链接脚本,设置程序编译地址,注释掉*.o (RESET, +First)这一行 4,编译 会产生一个没有程序入口的警告,不管他,如图编译成功。 5,下载 选择自定义的flash算法,然后下载axf文件(跟平时下载程序没有任何区别) |
|
|
|
只有小组成员才能发言,加入小组>>
2513 浏览 0 评论
1083浏览 2评论
700浏览 1评论
452浏览 0评论
193浏览 0评论
329浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 06:33 , Processed in 1.147185 second(s), Total 79, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号