|
原出自<<单片机与嵌入式系统应用>> 作者:宋强 微控论坛网络首发
在过去,如果一个项目做完后。将交付客户检收时往往需将芯片进行加密保护措施,如果要买一个专业的TI编程器带加密功能的设备价格可达1000-2000RMB左右。如果认为太贵的话,大家不防考虑一下采用以简单的方法为你的芯片。成本也较专业级的低得多,同时也可以直接应用于产品生产时之用。
以下是宋强先生为大家编写的教大家如何制作的MSP430加密熔丝烧断器的制作主要要点,有兴趣的朋友不防一起动手试试制作。大家可以在微控论坛进各项交流和分享制作经验心得。谢谢宋强先生!
提出MSP430 系列单片机在代码保护及加密方面的解决方案;在此方案的基础上,对MSP430 系列单片机的JTAG结构及加密熔断的应用范围、原理、条件参数、操作时序及具体的方法进行阐述;结合实际对一款MSP430系列加密熔断器的功能特征、硬件结构、软件流程及部分程序进行详细的说明。
引言
MSP430系列单片机是德州仪器(TI)公司推出的一款16位超低功耗单片机。它能够在1.8~3.6V电压、1MHz频率的条件下运行,耗电电流在0.1~400μA。在运算速度上,MSP430系列单片机能在8 MHz 晶振的驱动下,实现125ns的指令周期。16位的数据宽度、125ns的指令周期以及多功能的硬件乘法器相配合,能实现数字信号处理的某些算法(如FFT等) 。
在整合方面,MSP430系列单片机将大量的CPU外围模块集成在片内,有如下一些模块:看门狗(WDT) 、模拟比较器、串口、硬件乘法器、液晶驱动器、10位/12位/14位ADC、端口0~6 、基本定时器。其中定时器A、B均带有多个捕获/ 比较寄存器,同时可实现多路PWM 输出;模拟比较器与定时器配合,可方便地实现ADC;液晶驱动多达160 笔段;硬件ADC 模块在小于10 μs的速率下实现10~14 位的高速、高精度转换,同时提供采样/保持与参考电压;端口0、1、2能够接收外部上升沿或下降沿的中断输入。
MSP430系列单片机的开发调试有多种技术方案,其中以JTAG和BOOTSTRAP(简称“BSL”) 方式最为方便。对于Flash型的MSP430单片机初期开发进行的仿真,只需要1台PC 机和1个JTAG控制器即可实现。进入产品级开发阶段,为了保护用户代码,烧断Flash的保护熔丝以后就无法再通过J TAG 口访问单片机, 这时用户对Flash中的程序再进行检查或更新就只能通过BOOT2STRAP 进行。不用担心用户代码会泄露,BOOTSTRAP提供了32字节256位的密码保护,能完全确保代码的安全性。
1 熔断加密原理
MSP430 系列单片机采用JTAG(实际上称为IEEE1149.1或边界扫描)接口技术,实现对单片机全部存储器的访问,包括程序Flash 、ROM、RAM ,并可对其进行擦除、读写。它能用于程序的下载,监测程序使用情况和各个变量与寄存器的使用情况, 并可对其进行修改。
JTAG接口需要4 根信号线、地线和电源线。具体信号线的定义如表1 所列。
表1 JTAG接口信号线
---------------------------------------------
引脚 方向 描述
TMS 输入 JTAG状态机控制信号线
TCK 输入 JTAG时钟输入线
TDI/TCLK 输入 JTAG数据输入线/ TCL K输入
TDO 输出 JTAG数据输出线
---------------------------------------------
JTAG接口为程序的调试、仿真及监控带来了很大的方便,大大提高了编程效率,缩短了开发周期;但在程序测
试完成转换为产品推向市场时,就必须对程序代码进行加密处理,防止程序代码的泄漏。JTAG接口的安全性很差,只要符合J TAG 标准的控制器就可以将程序代码读出,所以必须禁止J TAG 功能。对于MSP430 系列单片
机,禁止J TAG功能的途径是将单片机内部的加密保险丝熔断,熔断后的单片机就无法再使用JTAG功能,从而达到加密程序代码的目的。具体的JTAG及加密保险丝结构框图如图1所示。
MSP430系列单片机在上电复位时会通过TDI/TCLK端对保险丝进行检测,当保险丝完好时,在TDI/TCL K和地之间会有1mA 的电流流过。保险丝检测出现在上电复位以后TMS 端的第一个下降沿上,在第二个下降沿上会解除保险丝的检测,直到下一次的上电复位再进行保险丝检测,即在每一次的上电复位都会对保险丝进行检测。保险丝检测电流只有在保险丝检测方式时才会流过TDI/TCLK端,当检测不到保险丝电流时,JTAG功能就会失效,且这种加密方式是硬件方式的加密,一旦保险丝熔断,JTAG功能就永久失效了,无法再通过JTAG口访问单片机,从而保证了单片机内代码的安全。
2 熔断加密的时序及方法
MSP430单片机保险丝的熔断必须在特定的条件下进行。表2 列出了熔断保险丝所需的条件及具体参数。
表2 保险丝熔断条件及参数
---------------------------------------------------------
保险丝电参数 min nor max
熔断时单片机供电电压VCC(fb)/V 2.5 3.3 3.6
熔断时施加在TDI/TCLK端的电压Vfb/V 6 6.5 7
熔断时施加在TDI/TCLK端的电流Ifb/mA 100
熔断时间tfb/ms 1
---------------------------------------------------------
在满足表2 所列的条件下,简单地将6.5V电压加在TDI/TCLK端上时,是无法熔断保险丝的,必须在一定的时序及指令下才可以完成。下面是熔断保险丝所需的指令及时序:
IR_SHIFT(" IR_CN TRL_SIG_16BIT" )
DR_SHIFT_IN(0x7201) ;TDO 信号切换为TDI 功能。TDI信号端释放, TDO 切换为TDI
IR_SHIFT(" IR_PREPARE_BLOW" ) ;通过TDO 信号端传输
MsDelay(1) ;延时1ms。等待,连接Vpp至TDI信号端
IR_SHIFT(" IR_EX_BLOW") ;通过TDO 信号端给目标板发送指令
MsDelay(1) ;延时1 ms ,将Vpp 从TDI 信号端
;移开;切换TDI 信号端返回TDI
;功能,同时复位J TA G状态机
IR_SHIFT(" IR_CNTRL_SIG_16BIT" )为切换J TAG进入16位数据接收模式;DR_ SHIFT_ IN(0x7201)为将TDO 信号切换为TDI功能,TDI信号释放,为接入熔断电压Vpp作准备;IR_SHIFT(" IR_ PREPARE_BLOW" )为设置MSP430 进入保险丝熔断方式;MsDelay(1)为延时1ms,同时连接熔断电压Vpp 至TDI信号端;IR_ SHIFT("IR_BX_BLOW" )为执行保险丝熔断;MeDelay(1) 为延时1ms,同时断开TDI端的熔断电压Vpp,TDI信号端切换回TDI功能,JATG状态机复位。保险丝加密熔断完成。
3 熔断加密器的设计与实现
熔断加密器可以实现对MSP430Flash单片机的编程、烧熔丝和BSL下载。可以选择编程后是否熔断芯片内熔丝,进行加密;可自行设置密码,彻底保护芯片内容;可进行完全擦除编程和保留编程,通过BSL 方式读出目标CPU内的代码。
熔断加密器的硬件采用了MSP430F1111A作为系统芯片,实现对目标JTAG口的通信控制、熔断电压V pp的加载与分离、目标MSP430 单片机中保险丝熔断指令的控制。在电源部分,熔断电压V pp 及100mA的熔断电流是在7806三端稳压芯片与地之间串接二极管IN4001来实现的;熔断电压Vpp的加载与分离通过继电器的通断来实现,并使用了3 个LED分别指示目标单片机保险丝未熔断、正在熔断及已熔断的状态。熔断加密器系统控制部分的电路如图2 所示。
软件部分是通过C 语言来实现熔丝加密器与目标单片机之间的数据通信及指令控制的。具体软件流程如图3所示。
以下为加密熔断器主程序:
Microcontrol CODE |
#include "MSP430x11x.h"
void main (void)
{
unsigned char k ;
WDTCTL = WDTPW + WDTHOLD ;
P1DIR = 0xFE;
P1OUT &= ~BIT2 ; // 断开Vpp
P1OUT &= ~BIT3 ; // 保险丝准备指示灯(黄色) 亮
P2OUT |= BIT5 ; // 保险丝熔断成功指示(绿色) 灭
P2DIR = 0xEF ;
while (1)
{
if ((P1IN&0x01)==0)
{
ResetTAP1(); //?
delay(50000);
IR_SHIFT(0x14);
DR_SHIFT16 (0xAAAA);
if(tdovalue != 0x5555)
{ // 保险丝未熔断
P1OUT |= BIT3; // 保险丝准备指示灯(黄色) 灭
IR_SHIFT(0x13);
DR_SHIFT16(0x7201) ;
delay(10000);
tdopin="1";
P2DIR |= BIT4;
IR_SHIFT(0x22);
P1OUT |= BIT2; // 接通Vpp,断开TDI
delay(50000);
IR_SHIFT(0x24);
delay(10000);
P1OUT &= ~BIT2; // 断开Vpp
tdopin = 0;
P2DIR &= ~BIT4;
ResetTAP();
delay(50000);
IR_SHIFT(0x14);
DR_SHIFT16 (0xAAAA);
if (tdovalue == 0x5555)
{ // 保险丝熔断成功
P2OUT &= ~BIT5 ; // 保险丝熔断成功指示(绿色)
for (k=1; k<=3; k++)
delay(50000) ; // 绿灯常亮
}
else
{ // 保险丝未熔断黄灯闪烁3 次
for(k=1;k<=3;k++)
{
P1OUT &= ~BIT3 ; // 保险丝准备指示灯(黄色)亮
delay(50000) ;
P1OUT |= BIT3 ; // 保险丝准备指示灯(黄色)灭
delay(50000) ;
}
}
}
else
{ // 保险丝已熔断
for(k=1;k<=3;k++)
{
P1OUT &=~BIT3 ; // 保险丝准备指示灯(黄色) 亮
P2OUT &=~BIT5 ; // 保险丝熔断成功指示(绿色)亮
delay(50000) ;
P1OUT |= BIT3 ; // 保险丝准备指示灯(黄色) 灭
P2OUT |= BIT5 ; // 保险丝熔断成功指示(绿色)灭
delay(50000) ;
}
}
P1OUT &= ~BIT3 ; // 保险丝准备指示灯(黄色)亮
}
}
}
|
本加密熔断器在实际应用中取得了非常理想的效果,可对MSP430 系列单片机的保险丝进行可靠而有效的熔
断,完全保护了MSP430单片机中的代码安全。在实际的使用中达到非常好的经济效益和社会效益。
结语
本系统可应用于整个MSP430系列单片机,具有功能强大、性能可靠、成本低、体积小等特点。完全可以替代目前市场上售价高达1000~2000元的编程器,具有非常广阔的应用前景和推广价值 |
|