目录
概述
本文主要是使用AT32F403A开发板,基于V2库实现安全库slib的功能。
串口工具使用的Atlink-ez自带的串口功能。
工程建立、调试工具配置在前面章节有详细介绍。
硬件
硬件方面使用的是参考官方AT32F437 SURF板子而设计的一个AT32F403A开发板,板子上的芯片是AT32F403AVGT7的型号,开发板上面还板载了一个atlink-ez的仿真器,atlink-ez除了可以在线仿真和下载之外还有一个串口的功能,硬件上是通过跳线帽接到了MCU的串口1,pa9/10上面。
如下图是开发板pcb图,以及硬件资源。(左边上角的就是atlink-ez,用usb线接到pc即可):
如下为实物图:
本章是使用的安全库的功能,属于内部功能。
安全库区
设定以密码保护主存中指定范围的程式区,即安全库区,此区域仅能被执行,无法读取(I-Code, D-Code 总线除外),以及写入与删除,除非输入指定密码。安全库区划分为 指令安全库区与数据安全库区,并可选部分或是整个安全库区存放指令,但不支持整个安全库区存放数据。解除安全库时,输入正确密码后自动删除区域内的代码。
设定安全库区的益处:
以密码保护安全库区,方案商可刻录核心算法到此区域;
安全库区仅能执行,无法被读取,除非输入方案商指定密码,也无法删除(包含 ISP/IAP/SWD);
其余空白程序区可以提供给方案商客户进行二次开发;
方案商可以藉由安全库功能销售核心算法, 不需要每个客户都开发完整方案;
设定安全库区,可防止蓄意破坏或更改终端产品应用程序代码。
使用方法
使用流程:
主体的主要是把核心算法c文件生成只执行代码,设置分散加载地址,也就是用户代码和安全库代码,以及用户代码和安全库代码的ram的分布,然后生成符号定义文件供给第三方的工程使用,最后通过icp工具,开启安全库区,并设定代码区和数据区地址,这个地址要和前面设置分散加载地址要对应上,最后下载到芯片中即可。第三方拿到已经烧录好安全库区算法的芯片后,软件方面用户区代码也要设置分散加载,安全库区的地址肯定是不能保存代码,然后把算法的头文件以及符号定义文件加入到项目工程中就可以调用安全库区里面的算法了。
注意点:
算法调用的函数,必须使用算法c文件里面定义的;
AT32F403A安全库的区域的单位是2K;
中断向量表不能放到安全库区;
AT32F403A的前面4k地址不能设定为安全库;
最重要的一点,安全区的开启密码千万要记住,不然开启后就无法解除。
工程:
本文会建立两个工程项目,一个是算法的保存到安全库区,一个是使用安全库区的算法。算法就是一个简单的加法,根据输入参数和保存的数据相加,最后返回和。
代码地址分布:
用户区代码0~4k、12k~1M,安全库区4k~12k,其中代码区是4k~8k,数据区8k~12k。
RAM地址分布:
0~92k为用户使用,92k~96k为安全库区使用。
工程1:
先建立一个正常的工程项目,可正常运行,然后添加安全库的算法源码也就是自行添加一个.c文件。
生成只执行文件
把这个.c文件设置成只执行文件。
配置分散加载文件
设置程序地址分布,也就是设置分散加载地址,对分散加载文件进行编辑,把算法放到安全库代码区域。
生成符号定义文件
生成符号定义文件,在 Misc controls 这一栏,添加--symdefs=slib_fun.txt (等于号后面可自行随意命名的)命令,然后编译。
编译完后在objects文件里面找slib_fun.txt文件。
对slib_fun.txt 进行删减,只保留算法里面所定义的函数。
icp开启安全库并下载
通过icp 然后添加工程编译后产出的HEX或BIN文件,进入下载界面,并对安全库进行配置,要注意的是安全库的结束扇区要比上面我们设定的结束地址要小2k,也就是一个扇区。最后下载进去即可。
工程2:
配置分散加载文件
建立一个工程,编译正常后对分散加载文件进行配置,设定代码分布,以及ram使用分布。
添加头文件和符号定义文件
把头文件和符号定义文件加入到工程的群组当中,头文件包含即可,符号定义文件也就是工程1生成的slib_fun.txt。
符号定义文件加入群组后,必须将它的文件类型更改为Object文件,而不是原来的文本txt文件。需要右键文件选择options for file选项卡,然后file type中选择object类型的即可。
编译下载
都添加后,就可以调用算法函数,并且编译都通过。
最后烧录进已经烧录好算法的芯片即可。可以通过keil或者icp进行下载,keil下载的时候下载擦除选项中选择仅擦除。
测试
下载完成后,看串口打印,程序成功运行:
最后
有问题的可以加QQ群技术交流,同时相关代码上传到QQ群中。