今天转载痞子衡嵌入式的一篇文章,给大家keil mdk工具下i.mxrt的串行nor flash下载算法设计。 在i.mxrt硬件那些事系列之《在串行nor flash xip调试原理》一文中,痞子衡简单提了一下串行nor flash下载算法的概念,并没有介绍具体设计细节,关于nor flash下载算法每个ide/工具都有自己的一套设计,虽然基本设计理念是一样的,但是细节方面还是有区别。上一篇痞子衡介绍了《j-link下算法设计》,今天痞子衡就来细聊keil mdk下的nor flash下载算法:
一、keil mdk5对i.mxrt的支持
keil μvision可以说是mcu开发者最熟悉的ide了,大部分人刚开始入行嵌入式学mcs-51系列单片机应该都是用得keil c51环境(keil μvision2),早期的keil还只是一个小型的独立软件公司。2005年arm收购了keil,并于2006年集成了realview编译器开始支持arm cortex-m处理器,这便是后来的keil mdk(keil μvision3)。 2013年keil μvision5发布,与keil mdk4及之前版本不同,keil mdk5分成mdk core和software packs两部分。mdk core主要包含uvision5 ide集成开发环境和arm compiler5。software packs则可以在不更换mdk core的情况下,单独管理(下载、更新、移除)设备支持包和中间件更新包。
因此首次安装的keil mdk5并没有直接支持i.mxrt,需要通过software packs组件来单独安装i.mxrt的相关软件支持包。
二、使用pack installer添加新i.mxrt型号支持
keil mdk5里默认集成了pack installer,在ide里可以直接打开其界面,手动添加所需的mcu主控相关软件包。软件包主要有两个:device family pack (dfp)和board support pack (bsp) ,前者是对mcu芯片本身的支持,后者是对mcu开发板的支持。
如果你不主动安装mcu软件包也行,当你打开sdk里的任何一个例程(以i.mxrt1060为例),如果该例程对应的mcu软件包没有安装,ide会自动触发pack的安装。dfp是必须要安装的,bsp要看你具体使用哪块板卡,痞子衡用得官方i.mxrt1060-evk,因此还需要再手动安装nxp::evk-mimxrt1060_bsp:
安装完mcu软件包后,便可以正常编译sdk工程,然后在flash下载和调试了。痞子衡使用的是恩智浦官方evk,板子上自带了daplink调试器,当然除了板载调试器,我们也可以外接j-link调试器,在mdk工程选项里无论选择哪种调试器,其默认flash下载算法是一样的,都来自于dfp包(keil_packsnxpmimxrt1062_dfp12.2.0armmimxrt106x_qspi_4kb_sec.flm)
如果默认选择的flash下载算法文件不适用你的板子,那么你需要自己提供合适的算法文件(.flm),并将其放入mdk安装目录下(keil_v5armflash),重新打开工程选项,新增的算法会自动刷新到待选算法列表(还有另一种添加方式,即做一个完整的dfp包,包里包含下载算法,虽然arm写了详尽的文档,但这种方式更适合芯片原厂去做):
搞定了合适的下载算法文件,最后还需要检查下两个地址范围,一个是flash对应的实际映射地址空间,另一个是下载算法文件运行ram地址空间。这点跟上一篇介绍的j-link算法jlinkdevices.xml文件里需要填的两个地址空间设计是一致的。
三、nor flash下载算法设计
keil mdk下flash下载算法是开源的,有较详细的文档,文档在arm-software的github主页,根据这些文档,我们基本可以了解其下载算法设计细节。
算法主页:https://arm-software.github.io/cmsis_5/pack/html/flashalgorithm.html
3.1 下载算法模板工程
keil mdk提供了一个flash下载算法的基础模板工程,工程在keil_v5armflash\_templatenewdevice.uvprojx,该工程仅支持mdk(不支持mdk-lite)编译,除了工程设置外,该模板工程仅包含四个文件:
keil_v5armflashflashos.h keil_v5armflash\_templateflashdev.c keil_v5armflash\_templateflashprg.c keil_v5armflash\_templatetarget.lin拿到基础模板工程,我们需要根据目标mcu内核类型在工程选项里将默认的armcm0内核改掉,然后在flashdev.c和flashprg.c里将算法api函数全部实现(默认是空的),最后编译工程生成.flm即是我们要的算法文件(最终.flm其实是通过after build里的脚本命令将.axf直接改名的,flm文件本质上就是axf格式文件)。
3.2 下载算法结构设计
算法本身结构其实很简单,在flashdev.c文件中有一个名为flashdevice的结构体常量,其原型定义在flashos.h中。该结构体主要给ide提供必要的flash信息,其值必须根据实际板卡情况填写正确。
structflashdeviceconstflashdevice={ flash_drv_vers,//driverversion,donotmodify! newdevice256kbflash,//devicename onchip,//devicetype 0x00000000,//devicestartaddress 0x00040000,//devicesizeinbytes(256kb) 1024,//programmingpagesize 0,//reserved,mustbe0 0xff,//initialcontentoferasedmemory 100,//programpagetimeout100msec 3000,//erasesectortimeout3000msec //specifysizeandaddressofsectors 0x002000,0x000000,//sectorsize8kb(8sectors) 0x010000,0x010000,//sectorsize64kb(2sectors) 0x002000,0x030000,//sectorsize8kb(8sectors) sector_end };除了flashdevice之外,最核心当然是flashprg.c里的7个api函数,这些api函数提供了实际的flash擦写验功能,ide会自动按需调用这些api去实现在线下载。这些api原型是固定的,但具体函数实现是因板卡而异的。
关于算法工程还有一个不得不提的设计,那就是工程选项c/c++(包括asm)下都勾选了read-only position independent 和 read-write position independent,表明下载算法本身不是使用固定地址链接,而是位置无关链接(也叫相对地址链接),算法代码机器码是可以被放到任意地址去执行的,这也是为什么你可以在例程选项里去指定ram for algorithm。
3.3 下载算法api调用流程
当在ide里启动在线下载时,ide会先将算法文件.flm里的可执行机器码加载进指定的ram空间,然后组合调用来实现最重要的flash擦除和写入,只要用户app被正确写入flash,ide就能正常读取flash里代码指令进行单步调试了。如下图便是擦除和写入操作的实际api组合调用流程:
算法api详解:
https://arm-oftware.github.io/cmsis_5/pack/html/algorithmfunc.html
至此,keil mdk工具下i.mxrt的串行nor flash下载算法设计介绍完毕。
AR技术将成为汽车制造商的下一个关注点吗
运放稳定性问题简析
伺服电机规格选用步骤
PIC单片机与串行闪存的SPI接口设计
Epic和苹果的战局进一步扩大
Keil MDK下的NOR Flash下载算法
监控摄像机如何保证家庭的安全
打击盗窃行为出新招,苹果新专利远程操控被盗智能设备“变砖”
美国汽车“三巨头”,罢工!
华硕如何定位Zenbo机器人产品?
大功率升压转换器可自动切换模式并保持轻负载效率
传统产业数字化转型升级亟待进一步提速 疫情进一步刺激企业审视自身数字化水平
富士康在天津成立新公司,拓展车用领域布局
有保障的虚拟货币投资不再只是理想 - 马来西亚发起的新募资模式ACO(合格通证发行)
使用MAX6951/MAX6950 LED显示驱动器与MAXQ2000微控制器通信
开放式FPGA实现仪器的各种特性
长虹陷“增收不增利”怪圈 电视业务不足营收五分之一
英特尔酷睿十一代+惠普战66,商务办公新利器
Infor推出下一代供应链可视化和控制功能
三星S8曝光,虚拟键、后置指纹你更中意哪个?