代码错误代码0xc004e003

错误代码0xc004e003  时间:2021-02-22  阅读:()

1ZHCAA02–December2015SLAA685—http://www-s.
ti.
com/sc/techlit/SLAA685版权2015,TexasInstrumentsIncorporatedMSP代码保护特性应用报告ZHCAA02–December2015MSP代代码码保保护护特特性性KatiePier.
MSPApplications摘摘要要MSP微控制器(MCU)具备多种特性,可帮助控制器件中的代码可访问性,并增加不同层的代码访问管理和保护策略.
这些特性包括:锁定或用密码保护JTAG/SBW访问、利用不同于程序其余部分的权限借助IP封装(IPE)隔离敏感代码,以及用于现场固件更新的引导加载程序(BSL)访问特性.
本应用报告将详细介绍各个MSP器件系列中的一些可用特性,以及在为器件增额外加保护层时可以考虑的一些重要事项.
如需了解相关源代码和更多信息,请登录http://www.
ti.
com/cn/lit/zip/slaa685.
内内容容1简介.
22不同MSP系列的JTAG锁定23IP封装(IPE)94引导加载程序(BSL)安全性特性.
295参考文献32附附图图目目录录1目标配置62首次加载时的JTAG密码83CCS中的IPE工具144CCS中的调试配置165CCS中的IPE加载配置176CCS中的IPE测试配置187CCS中的IPE内存视图-无保护198CCS中的IPE内存视图-受保护199IAR中的IPE工具.
2310在IAR中生成.
map文件.
2411用于IPE_FR59xx的选项2612在IAR中生成.
txt二进制文件2613IAR中的IPE调试配置2814IAR中的IPE内存视图-受保护.
28附附表表目目录录1不同MSP系列的JTAG锁定特性22F5xx/F6xx上的JTAG锁定.
33FR5xx/FR6xx上的JTAG锁定.
34FR2xx/FR4xx上的JTAG锁定.
45i2xx上的JTAG锁定46FR5xx/FR6xx上的JTAG密码锁定57IPE初始化结构168IPE初始化结构27简介www.
ti.
com.
cn2ZHCAA02–December2015SLAA685—http://www-s.
ti.
com/sc/techlit/SLAA685版权2015,TexasInstrumentsIncorporatedMSP代码保护特性9MSP430FR5xx/FR6xx器件上的BSL签名功能.
3110MSP430F1xx/F2xx/F4xx器件上的BSL签名功能31商商标标MSP430,MSP432,CodeComposerStudioaretrademarksofTexasInstruments.
IAREmbeddedWorkbenchisatrademarkofIARSystems.
1简简介介随着越来越多的产品采用微控制器(MCU)或其他嵌入式器件,嵌入式安全变得越来越重要.
嵌入式系统应用通常需要解决的一个问题是防止读出器件信息,以保护专有代码的知识产权(IP).
但是,没有恰当的解决方案能够防止未经授权而访问代码或对代码进行逆向工程.
设计人员可以采取预防措施,防止外界使用常见的技术或设备轻松访问其代码.
为增加安全保护层、防止他人试图读出器件信息,将分层方法与其他方法相结合来控制代码访问权限是一种不错的方法.
本应用报告将讨论MSP430和MSP432微控制器系列中的部分特性,这些特性有助于提供以下保护层:锁定JTAG、(在支持IP封装功能的器件上)使用IP封装以及引导加载程序(BSL)安全选项.
综合使用这些方法有助于增强器件的分层保护,还会使他人难以读出器件信息.
注注:本应用报告主要介绍了MSP430微控制器的特性.
有关保护MSP432微控制器或在MSP432微控制器上使用引导加载程序的信息,请参阅应用报告ConfiguringSecurityandBootloader(BSL)onMSP432P4xx(SLAA659).
有关MSP432器件的IP保护安全区特性,请参阅应用报告SoftwareIPProtectiononMSP432P4xxMicrocontrollers(SLAA660).
2不不同同MSP系系列列的的JTAG锁锁定定表1列出了每个MSP系列中可用的锁定特性.
表表1.
不不同同MSP系系列列的的JTAG锁锁定定特特性性器器件件系系列列物物理理保保险险丝丝引引导导覆覆盖盖电电子子保保险险丝丝JTAG签签名名可可逆逆利利用用密密码码访访问问JTAGMSP430F1xx/F2xx/F4xxMSP430F5xx/F6xx0x17FC-0x17FF使用引导加载程序MSP430FR5xx/FR6xx0xFF80-0xFF83使用引导加载程序MSP430FR2xx/FR4xx0xFF80-0xFF83使用引导加载程序MSP430i2xx0xFFDC-0xFFDF出厂时未提供引导加载程序MSP432Pxx可以将引导覆盖功能恢复出厂设置2.
1物物理理JTAG保保险险丝丝(F1xx/F2xx/F4xx)可通过物理JTAG安全保险丝保护MSP430F1xx、F2xx和F4xx系列器件的JTAG.
进行JTAG或SBW编程之后,保险丝将由编程工具熔断.
此工具会对TEST引脚(位于带有TEST引脚的器件)或TDI引脚(位于带有TEST引脚的器件)施加保险丝熔断电压(6.
5V±0.
5V)[请参阅MSP430ProgrammingViatheJTAGInterface(SLAU320),了解更多详细信息].
保险丝熔断是一个不可逆的过程,会彻底禁用JTAG端口,而且无法再访问JTAG或SBW.
当物理保险丝熔断后,将只能通过设置密码保护的引导加载程序(如果支持并启用了此功能)来访问器件.
www.
ti.
com.
cn不同MSP系列的JTAG锁定3ZHCAA02–December2015SLAA685—http://www-s.
ti.
com/sc/techlit/SLAA685版权2015,TexasInstrumentsIncorporatedMSP代码保护特性2.
2电电子子保保险险丝丝或或无无密密码码锁锁定定大多数MSP430器件都有一个电子保险丝,此保险丝有时被称为e-Fuse或"JTAG无密码锁定".
通过在内存中将一个值设置为2个字(JTAG签名),可以锁定JTAG/SBW接口.
对JTAG锁定签名进行编程并复位器件之后,将无法再通过JTAG或SBW来访问器件.
在这种情况下,只能通过设置密码保护的引导加载程序来访问器件.
可以利用BSL来重新访问器件并清除JTAG签名,但这样需要输入正确的BSL密码或者批量擦除器件(取决于器件系列).
MSP430不同子系列的电子保险丝实施方式略有不同,以下部分将对此进行说明.
2.
2.
1F5xx/F6xx电电子子保保险险丝丝的的实实施施方方式式在MSP430F5xx/F6xx器件上,JTAG签名位于引导加载程序的内存区域中(F5xx/F6xx器件的闪存受保护区域中包含一个基于闪存的BSL),地址为17FCh-17FFh.
如果将除00000000h或FFFFFFFFh以外的任何内容编程到这些地址,将会锁定JTAG/SBW接口.
要对这些地址进行编程,必须先清除SYSBSLC寄存器中的SYSBSLPE位,以解锁BSL闪存的受保护区域.
对签名编程之后,应重新启用BSL保护.
要清除JTAG/SBW锁定保护,可以使用BSL将JTAG签名清除为00000000h.
BSL由中断矢量表的最后32个字节FFE0h-FFFFh提供密码保护(请参见4节).
由于JTAG签名位于受保护的BSL区域中,因此BSL必须先清除SYSBSLC寄存器中的SYSBSLPE位(向地址0182h写入0003h),才能向JTAG签名写入00000000h.
(1)这些地址位于受保护的BSL闪存区域,此区域必须通过写入0003h将SYSBSLPE清除为地址0182h(SYSBSLC寄存器地址)来解锁,这样才能更改签名.
表表2.
F5xx/F6xx上上的的JTAG锁锁定定名名称称地地址址值值器器件件安安全全JTAG/SBW签名17FCh-17FFh(1)FFFF_FFFFhJTAG/SBW未锁定.
0000_0000h任何其他值JTAG/SBW锁定.
2.
2.
2FR5xx/FR6xx电电子子保保险险丝丝的的实实施施方方式式((无无密密码码锁锁定定))在MSP430FR5xx/FR6xx器件上,JTAG签名位于FRAM的主区域中,地址为FF80h-FF83h.
通过向JTAG签名写入55555555h,可以对JTAG/SBW接口执行无密码锁定.
要清除JTAG/SBW锁定保护,可以使用引导加载程序将JTAG签名清除为除5555h和AAAAh以外的任何值.
BSL受密码保护,中断矢量表的最后32个字节(FFE0h-FFFFh)用作BSL密码(请参见4节).
通过在这些FRAM器件上使用BSL批量擦除命令,可轻松解锁JTAG/SBW访问,因为JTAG签名位于主存储器中(而不是像F5xx/F6xx那样位于受保护的BSL区域中).
(1)请参阅2.
3节,以了解更多详细信息.
表表3.
FR5xx/FR6xx上上的的JTAG锁锁定定名名称称地地址址值值器器件件安安全全JTAG/SBW签名FF80h-FF83h5555h_5555hJTAG/SBW无密码锁定.
@FF80h=AAAAh@FF82h=密码文字长度JTAG/SBW有密码锁定.
(1)任何其他值JTAG/SBW未锁定.
2.
2.
3FR2xx/FR4xx电电子子保保险险丝丝的的实实施施方方式式在MSP430FR2xx/FR4xx器件上,JTAG签名位于FRAM的主区域中,地址为FF80h-FF83h(与其他FRxx器件相同).
通过向JTAG签名写入除00000000h或FFFFFFFFh以外的任何内容,可以对JTAG/SBW接口执行无密码锁定(这不同于其他的FRxx器件).
不同MSP系列的JTAG锁定www.
ti.
com.
cn4ZHCAA02–December2015SLAA685—http://www-s.
ti.
com/sc/techlit/SLAA685版权2015,TexasInstrumentsIncorporatedMSP代码保护特性要清除JTAG/SBW锁定保护,可以使用引导加载程序将JTAG签名清除为00000000h或FFFFFFFFh.
BSL受密码保护,中断矢量表的最后32个字节(FFE0h-FFFFh)用作BSL密码(请参见4节).
通过在这些FRAM器件上使用BSL批量擦除命令,可轻松解锁JTAG/SBW访问,因为JTAG签名位于主存储器中(而不是像F5xx/F6xx那样位于某个受保护的BSL区域中).
表表4.
FR2xx/FR4xx上上的的JTAG锁锁定定名名称称地地址址值值器器件件安安全全JTAG/SBW签名FF80h-FF83hFFFF_FFFFhJTAG/SBW未锁定.
0000_0000h任何其他值JTAG/SBW锁定.
2.
2.
4MSP430i2xx电电子子保保险险丝丝的的实实施施方方式式-启启动动代代码码(SUC)在MSP430i2xx器件上,JTAG/SBW器件安全性由启动代码(SUC)控制.
在执行BOR或POR复位之后,SUC必须在前64个MCLK时钟周期内将器件设置为安全或不安全状态.
SUC会检查地址0xFFDC-0xFFDF的签名,以确定应当启用还是禁用JTAG/SBW访问.
通过向地址FFDCh-FFDFh写入除00000000h或FFFFFFFFh以外的任何值,可以禁用JTAG/SBW接口.
在执行POR或BOR复位之后,SUC会检查这些地址中的值.
如果此值并非00000000h或FFFFFFFFh,则SUC会向SYSJTAGDIS寄存器写入A5A5h,以禁用JTAG/SBW接口并保护器件.
在执行BOR或POR复位之后,SUC必须在前64个MCLK周期内完成此操作.
由于MSP430i2xx器件没有引导加载程序,因此无法清除地址0xFFDC-0xFFDF以重新启用JTAG/SBW访问.
如果用户在主存储器中实施了定制的引导加载程序,他们可以使用此程序向地址FFDCh-FFDFh写入00000000h.
在执行POR或BOR复位之后,SUC会检查这些地址中的值.
如果此值为00000000h或FFFFFFFFh,SUC将不执行任何操作,并继续执行校准例程-在64个MCLK周期之后,会启用JTAG,器件将自动处于不安全状态.
请参阅MSP430i2xxFamilyUser'sGuide(SLAU335)和器件代码示例,了解更多有关SUC的信息.
(1)必须实施正确的SUC代码以检查这些地址,并在启动后的64个MCLK周期内执行锁定或解锁.
使用i2xx代码示例附带的SUC代码(该代码已经实施此操作).
表表5.
i2xx上上的的JTAG锁锁定定名名称称地地址址值值器器件件安安全全JTAG/SBW签名FFDCh-FFDFhFFFF_FFFFhJTAG/SBW未锁定.
(1)0000_0000h任何其他值JTAG/SBW锁定.
(1)www.
ti.
com.
cn不同MSP系列的JTAG锁定5ZHCAA02–December2015SLAA685—http://www-s.
ti.
com/sc/techlit/SLAA685版权2015,TexasInstrumentsIncorporatedMSP代码保护特性2.
3JTAG密密码码锁锁定定(FR5xx/FR6xx)有些MSP430FRAM器件还允许使用JTAG密码锁定选项.
这不同于电子保险丝/JTAG无密码锁定,因为使用这种机制时,无需使用引导加载程序,只需通过工具链提供用户定义的密码即可重新访问.

在MSP430FR5xx/FR6xx器件上,JTAG签名位于FRAM的主区域中,地址为FF80h-FF83h.
通过向JTAG签名1(FF80h)写入AAAAh,并向JTAG签名2(FF82h)写入除5555h以外的任何内容,即可使用密码锁定JTAG/SBW.
写入到JTAG签名2的值用来定义所需密码的文字长度.
密码从地址FF88h开始,并持续JTAG签名2所设置的字数.
请注意,如果密码足够长,可能会与中断矢量表所使用的地址重叠.
这些地址的密码值应是中断矢量表值,只有这样才能正确处理中断和执行代码.
密码保护会对下一个BOR事件生效.
表表6.
FR5xx/FR6xx上上的的JTAG密密码码锁锁定定名名称称地地址址值值器器件件安安全全JTAG/SBW签名FF80h-FF83h5555h_5555hJTAG/SBW无密码锁定.
@FF80h=AAAAh@FF82h=密码文字长度JTAG/SBW有密码锁定.
任何其他值JTAG/SBW未锁定.
JTAG密码FF88h长度用户定义+矢量表配置如果使用密码锁定了JTAG/SBW,则必须由工具链通过JTAG邮箱提供这些地址中定义的密码值.
当使用JTAG密码锁定功能保护器件时,工具链必须提供正确的密码才能访问器件.
提供了正确的密码之后,器件会解锁,直到发生下一个BOR事件为止.
2.
3.
1在在CCS中中使使用用JTAG密密码码锁锁定定相关zip文件(http://www.
ti.
com/cn/lit/zip/slaa685)中的代码示例JTAG_lock_FR5xx_with_password.
c显示了如何在CodeComposerStudioIDE(CCS)中为MSP430FR5969器件设置JTAG密码锁定.
但请注意,有些生产编程工具可能还提供了一个选项,以便从GUI界面设置密码,而不必将密码硬编码到项目中.
对于MSP430TIC/C++编译器,使用#pragmaDATA_SECTION将正确的签名放到链接器文件的.
jtagsignature部分,并将密码放到.
jtagpassword部分.
使用#pragmaRETAIN防止编译器优化数据(因为程序不会使用这些数据).
更多有关这些程序的信息,请参阅MSP430TIC/C++Compilerguide(SLAU132).
#pragmaRETAIN(JTAG_signatures)#pragmaDATA_SECTION(JTAG_signatures,".
jtagsignature")constuint16_tJTAG_signatures[]={0xAAAA,0x0002};.
.
.
#pragmaRETAIN(JTAG_password)#pragmaDATA_SECTION(JTAG_password,".
jtagpassword")constuint8_tJTAG_password[]={0x12,0x34,0x56,0x78};不同MSP系列的JTAG锁定www.
ti.
com.
cn6ZHCAA02–December2015SLAA685—http://www-s.
ti.
com/sc/techlit/SLAA685版权2015,TexasInstrumentsIncorporatedMSP代码保护特性如下示例显示了使用2字密码12h34h56h78h锁定的器件的TI-txt二进制文件的一部分:@ff80AAAA0200FFFFFFFF12345678FFFFFFFF当器件由密码锁定并完成BOR复位(此时设置将会生效)之后,必须提供密码,才能重新访问器件以进行重新编程.
在CCS中提供密码,然后在targetConfigs文件夹中打开器件的.
ccxml文件.
在"AdvancedSetup"下方,单击链接"TargetConfiguration".
然后单击器件型号下方的"MSP430",并在"Password:(HEXformat)"框中输入要在解锁器件时提供的密码.
对于上述示例,密码为12h34h56h78h.
应以文字形式写入密码,先写入最低有效文字,因此对于此示例,输入0x34127856.
要找到为工具链提供密码的正确顺序,一种简单的方法是使用内存浏览器并将视图设置为"16-BitHex–TIStyle",然后在首次加载时查看编程到器件中的密码.
图图1.
目目标标配配置置注注:当加载不同的用户项目时,如果在器件此前加载的代码中启用了JTAG密码锁定,则首次进入器件时,必须在项目设置中提供正确的密码并擦除器件.
擦除器件之后,如果没有在新项目中启用JTAG密码锁定,则会解锁器件并能够正常对其进行调试.
www.
ti.
com.
cn不同MSP系列的JTAG锁定7ZHCAA02–December2015SLAA685—http://www-s.
ti.
com/sc/techlit/SLAA685版权2015,TexasInstrumentsIncorporatedMSP代码保护特性2.
3.
2在在IAR中中使使用用JTAG密密码码锁锁定定相关zip文件中的代码示例JTAG_lock_FR5xx_with_password.
c显示了如何在IAR中的MSP430FR5969器件上设置JTAG密码锁定.
但请注意,有些生产编程工具可能还提供了一个选项,以便从GUI界面设置密码,而不必将密码硬编码到项目中.
对于IARC/C++编译器,使用#pragma位置从地址FF80h开始放置正确的签名,从地址FF88h开始放置密码.
使用__root关键字防止编译器优化数据(因为程序不会使用这些数据).
更多有关这些pragma的信息,请参阅IAR中的"Help"菜单下的IARC/C++CompilerUser'sGuide.
#pragmalocation=0xFF80__rootconstuint16_tJTAG_signatures[]={0xAAAA,0x0002};.
.
.
#pragmalocation=0xFF88__rootconstuint8_tJTAG_password[]={0x12,0x34,0x56,0x78};如下示例显示了使用2字密码12h34h56h78h锁定的器件的TI-txt二进制文件的一部分:@FF80AAAA0200@FF8812345678要在IAR中提供密码,请在Project>Options菜单中转到"Debugger">"FETDebugger",然后选择"Download"选项卡.
在"JTAGpassword"框中,输入要在解锁器件时提供的密码.
对于上述示例,密码为12h34h56h78h.
应以文字形式写入密码,先写入最低有效文字,因此对于此示例,输入0x34127856.
要找到为工具链提供密码的正确顺序,一种简单的方法是使用"内存"视图并将格式设置为"2xUnits",然后在首次加载时查看编程到器件中的密码.
不同MSP系列的JTAG锁定www.
ti.
com.
cn8ZHCAA02–December2015SLAA685—http://www-s.
ti.
com/sc/techlit/SLAA685版权2015,TexasInstrumentsIncorporatedMSP代码保护特性图图2.
首首次次加加载载时时的的JTAG密密码码注注:当加载不同的用户项目时,如果在器件此前加载的代码中启用了JTAG密码锁定,则首次进入器件时,必须在项目设置中提供正确的密码并擦除器件.
擦除器件之后,如果没有在新项目中启用JTAG密码锁定,则会解锁器件并能够正常对其进行调试.
www.
ti.
com.
cnIP封装(IPE)9ZHCAA02–December2015SLAA685—http://www-s.
ti.
com/sc/techlit/SLAA685版权2015,TexasInstrumentsIncorporatedMSP代码保护特性3IP封封装装(IPE)IP封装(IPE)是诸如MSP430FR59xx/69xx系列MSP430FRAM微控制器上提供的一种功能.
(注意:对于MSP432器件上的IP保护安全区特性,请参阅应用报告SoftwareIPProtectiononMSP432P4xxMicrocontrollers(SLAA660).
)IP封装允许用户封装FRAM存储器的某个区域以防止他人读取.
当IPE激活时,即使使用JTAG,也无法从IP封装区域以外的任何位置对IP封装区域中的任何代码或数据进行读取或写入访问.
要去除IPE保护,需要执行由工具链提供支持的特殊批量擦除序列.
任何形式的代码保护都不是无懈可击的,但此功能会为JTAG/SBW或引导加载程序的安全性提供额外一层保护,适用于密钥等敏感数据或者被用户视为知识产权(IP)的专有代码.
IP封装的安全性和存储在其内的代码的安全性是一样的-即使代码位于封装区域内,糟糕的代码安全性措施也会让代码变得更容易受到攻击.
需要特别注意可以读取/写入地址的代码或者不遵循可靠编码实践的代码.

当封装执行结束时,如果需要隐藏代码对所使用的任何硬件模块和外设寄存器或者RAM执行的操作,则还必须将这些模块清除为它们的原始状态.
例如,IPE示例项目包含一个示例,说明了如何清除IPE代码部分所使用的硬件模块寄存器:TA0CCTL0=0;TA0CCR0=0;TA0CCR1=0;TA0CCR2=0;TA0CTL=0;TA0R=0;P4DIR&=~BIT6;P4OUT&=~BIT6;它还包含一个示例,说明了如何清除通用CPU寄存器R4到R15:__asm("mov.
w#0,R4");__asm("mov.
w#0,R5");__asm("mov.
w#0,R6");__asm("mov.
w#0,R7");__asm("mov.
w#0,R8");__asm("mov.
w#0,R9");__asm("mov.
w#0,R10");__asm("mov.
w#0,R11");__asm("mov.
w#0,R12");__asm("mov.
w#0,R13");__asm("mov.
w#0,R14");__asm("mov.
w#0,R15");注注:如果将参数传回给IPE区域以外的代码,则可能需要保留寄存器R12到R15.
请参阅MSP430OptimizingC/C++CompilerUser'sGuide中的"HowaFunctionMakesaCall"和"HowaCalledFunctionResponds"部分,了解更多信息.
对于不同的应用,可能需要采取更多的代码安全性措施;例如清除在函数期间分配的RAM.
另一种可以采取的预防措施是,在IPE执行时对IPE未使用的函数禁用中断(如果可能),然后在IPE结束时重新启用它们.
这样可以确保在服务于IPE区域以外的任何ISR之前清除寄存器或RAM.
这些类型的高级预防措施与应用相关,而且需要隐藏的内容因需求而异,但在所有情况下都应特别注意.

IP封装(IPE)www.
ti.
com.
cn10ZHCAA02–December2015SLAA685—http://www-s.
ti.
com/sc/techlit/SLAA685版权2015,TexasInstrumentsIncorporatedMSP代码保护特性3.
1使使用用CCS中中的的IPE工工具具进进行行IP封封装装CCS具有一个内置的IPE工具,并在链接器文件中提供了预定义的区段,以便于在项目中启用IPE.
尽管《MSP430FR58xx、MSP430FR59xx、MSP430FR68xx和MSP430FR69xx系列用户指南》详细说明了如何设置IPE初始化结构以及如何利用MPU寄存器手动启用IPE,但使用CCS中的内置IPE工具仍不失为更轻松、更自动化的替代方法.
随后的几节将讨论如何使用CCS中的这些工具在项目中启用IPE.
另请参阅相关的来源(http://www.
ti.
com/cn/lit/zip/slaa685),以了解CCS中使用IPE的示例项目.
此代码将在MSP-EXP430FR5969LaunchPad开发套件上运行.
更多有关如何在CCS中使用此工具启用IPE的信息,请参阅CodeComposerStudiov6.
1forMSP430User'sGuide(SLAU157).
3.
1.
1用用于于IPE的的CCS链链接接器器文文件件特特性性注注:这些链接器文件特性在CCSv6.
1.
1发布时是最新的版本.
早期版本的CCS链接器文件并不具备所有这些特性,因此建议在通过这种方法启用IPE时使用CCSv6.
1.
1或更高版本.
对于支持IPE的器件,CCS链接器.
cmd文件包含一些用来放置IPE代码和数据的部分.
用户代码只需告诉编译器应将哪些变量和函数放到这些预定义的部分中.
如下代码片段来自MSP430FR5969链接器cmd文件:GROUP(IPENCAPSULATED_MEMORY){.
ipestruct:{}/*IPEDatastructure*/.
ipe:{}/*IPE*/.
ipe_const:{}/*IPEProtectedconstants*/.
ipe:_isr:{}/*IPEISRs*/.
ipe_vars:type=NOINIT{}/*IPEvariables*/}PALIGN(0x0400),RUN_START(fram_ipe_start)RUN_END(fram_ipe_end)RUN_END(fram_rx_start).
ipestruct-此代码段用于包含IPE初始化结构,此结构包含有关IP封装存储器边界和控制设置的地址位置信息.
《MSP430FR58xx、MSP430FR59xx、MSP430FR68xx和MSP430FR69xx系列用户指南》中提供了更多有关IPE初始化结构的信息.
用户不应将任何数据放在此部分中-当使用内置的CCSIPE工具时,此工具会生成所需的值并将这些值放在这里.
.
ipe-此代码段用于用户希望放在IP封装区域中的任何代码函数.
.
ipe_const-此代码段用于需要封装的任何常量数据.
这些数据可以是加密密钥或校准信息、封装的代码版本号或者应当隐藏的封装代码所使用的任何常数.
取决于应用.
.
ipe:_isr-此代码段用于需要成为IP封装用户代码的一部分的任何中断服务例程(ISR).
.
ipe_vars-此代码段用于需要封装的任何数据变量.
为了获得最高的安全性,只在IP封装代码内使用的任何变量还应放到IP封装区域中,而不是放到RAM中-否则有人可能利用所观察到的RAM变化尝试对封装代码的功能进行逆向工程.
当然,这取决于应用.
继续转到链接器文件的底部,可以看到有一个部分用于为IPE结构计算IPE初始化值:/*MPU/IPESpecificmemorysegmentdefinitions*/#ifdef_IPE_ENABLE#defineIPE_MPUIPLOCK0x0080#defineIPE_MPUIPENA0x0040www.
ti.
com.
cnIP封装(IPE)11ZHCAA02–December2015SLAA685—http://www-s.
ti.
com/sc/techlit/SLAA685版权2015,TexasInstrumentsIncorporatedMSP代码保护特性#defineIPE_MPUIPPUC0x0020//EvaluatesettingsforthecontrolsettingofIPEncapsulation#ifdefined(_IPE_ASSERTPUC1)#ifdefined(_IPE_LOCK)&&(_IPE_ASSERTPUC1==0x08))fram_ipe_enable_value=(IPE_MPUIPENA|IPE_MPUIPPUC|IPE_MPUIPLOCK);#elifdefined(_IPE_LOCK)fram_ipe_enable_value=(IPE_MPUIPENA|IPE_MPUIPLOCK);#elif(_IPE_ASSERTPUC1==0x08)fram_ipe_enable_value=(IPE_MPUIPENA|IPE_MPUIPPUC);#elsefram_ipe_enable_value=(IPE_MPUIPENA);#endif#else#ifdefined(_IPE_LOCK)fram_ipe_enable_value=(IPE_MPUIPENA|IPE_MPUIPLOCK);#elsefram_ipe_enable_value=(IPE_MPUIPENA);#endif#endif//Segmentdefinitions#ifdef_IPE_MANUAL//ForcustomsizesselectedintheGUIfram_ipe_border1=(_IPE_SEGB1>>4);fram_ipe_border2=(_IPE_SEGB2>>4);#else//AutomatedsizesgeneratedbytheLinkerfram_ipe_border2=fram_ipe_end>>4;fram_ipe_border1=fram_ipe_start>>4;#endiffram_ipe_settings_struct_address=Ipe_settingsStruct>>4;fram_ipe_checksum=~((fram_ipe_enable_value&fram_ipe_border2&fram_ipe_border1)|(fram_ipe_enable_value&~fram_ipe_border2&~fram_ipe_border1)|(~fram_ipe_enable_value&fram_ipe_border2&~fram_ipe_border1)|(~fram_ipe_enable_value&~fram_ipe_border2&fram_ipe_border1));#endif用户不必修改这些设置的任何内容,但这展示了链接器文件如何与CCSIPE工具设置协作,以确定要进入到IPE初始化结构中的值.
IP封装(IPE)www.
ti.
com.
cn12ZHCAA02–December2015SLAA685—http://www-s.
ti.
com/sc/techlit/SLAA685版权2015,TexasInstrumentsIncorporatedMSP代码保护特性3.
1.
2在在CCS中中将将代代码码和和数数据据放放到到IPE部部分分中中用户必须为编译器指明应将哪些代码和数据放到链接器文件定义的IPE部分中.
对于MSP430TIC/C++编译器,通过使用CODE_SECTION和DATA_SECTION这两个pragma来启用此操作.
更多有关这些pragma的信息,请参阅MSP430OptimizingC/C++CompilerUser'sGuide(SLAU132).
更多有关如何在CCS中使用此工具启用IPE的信息,请参阅CodeComposerStudiov6.
1forMSP430User'sGuide(SLAU157).
必须在一个或一组函数中包含应当放到IPE区域中的代码.
应将这些函数全部放到.
ipe部分中(请参见如下示例).
#pragmaCODE_SECTION(IPE_encapsulatedInit,".
ipe")voidIPE_encapsulatedInit(void){.
.
.
.
.
.
}#pragmaCODE_SECTION(IPE_encapsulatedBlink,".
ipe")voidIPE_encapsulatedBlink(void){.
.
.
.
.
.
}还应将IP封装代码所使用的任何中断服务例程(ISR)放到IPE区域中,以便同时将它们封装.
应将这些ISR放到.
ipe:_isr部分中(请参见如下示例).
#pragmaCODE_SECTION(TIMER0_A0_ISR,".
ipe:_isr")#pragmavector=TIMER0_A0_VECTOR__interruptvoidTIMER0_A0_ISR(void){.
.
.
.
.
.
}某些应用可能具有加密密钥等常数,建议将这些常数存储在IPE区域中.
CCS链接器文件不允许将常数与变量或代码放在同一个部分中.
应将这些常数值放到.
ipe_const部分中(请参见如下示例).
#pragmaDATA_SECTION(IPE_encapsulatedKeys,".
ipe_const")constuint16_tIPE_encapsulatedKeys[]={0x0123,0x4567,0x89AB,0xCDEF,0xAAAA,0xBBBB,0xCCCC,0xDDDD};最后,还应将IPE代码使用的变量全部放到IPE区域中而不是RAM中,以防止代码的其他部分无法读取或访问这些变量.
#pragmaDATA_SECTION(IPE_encapsulatedCount,".
ipe_vars")www.
ti.
com.
cnIP封装(IPE)13ZHCAA02–December2015SLAA685—http://www-s.
ti.
com/sc/techlit/SLAA685版权2015,TexasInstrumentsIncorporatedMSP代码保护特性unsignedcharIPE_encapsulatedCount;.
.
.
#pragmaDATA_SECTION(IPE_i,".
ipe_vars")uint8_tIPE_i;在链接器文件中,将.
ipe_vars部分设置为NOINIT,以表明放在这里的任何变量不应有任何初始化值,而且不应被启动代码初始化为0.
这是因为,C启动代码和.
cinit初始化表并未放在IPE区域中,因此无法写入到IPE部分以及设置IPE部分中的变量.
对用户来说,这意味着应在放在.
ipe部分中的定制init函数中设置放在.
ipe_vars部分中的任何变量,以使用在IPE区域内运行的代码来初始化这些变量.
随后,应在启动时由用户的主代码调用此init函数,以便在使用这些变量之前(例如在停止看门狗定时器之后)将它们初始化.
#pragmaDATA_SECTION(IPE_encapsulatedCount,".
ipe_vars")unsignedcharIPE_encapsulatedCount;/**main.
c*/voidmain(void){WDTCTL=WDTPW|WDTHOLD;//StopwatchdogtimerIPE_encapsulatedInit();.
.
.
.
.
.
}#pragmaCODE_SECTION(IPE_encapsulatedInit,".
ipe")voidIPE_encapsulatedInit(void){IPE_encapsulatedCount=1;}3.
1.
3在在CCS项项目目选选项项中中启启用用IPE只需转到Project>Properties>General,然后使用MSP430IPE选项卡,即可在CCS项目中启用IPE.
要实现自动化的IPE处理,请选择"EnableIntellectualPropertyEncapsulation(IPE)"和"LetcompilerhandleIPEmemorypartitioningbasedonuser-codeanddataplacement".
单击"OK",这样就设置了IPE(请参见图3).
IP封装(IPE)www.
ti.
com.
cn14ZHCAA02–December2015SLAA685—http://www-s.
ti.
com/sc/techlit/SLAA685版权2015,TexasInstrumentsIncorporatedMSP代码保护特性图图3.
CCS中中的的IPE工工具具3.
1.
4在在CCS中中查查看看编编译译器器选选择择的的IPE分分区区在启用了IPE的CCS中构建了项目之后,如果需要,用户可以使用Debug文件夹中的.
map文件,查看设置了哪些IPE边界以及不同的代码段(例如.
ipe)和代码段内的函数放在了哪些位置.
此外,还可以找到fram_ipe_border1、fram_ipe_settings_struct_address等参数的值.
SECTIONALLOCATIONMAPoutputattributes/sectionpageoriginlengthinputsections.
.
.
.
.
.
.
ipestruct*000004800000000080000480000000008MSPIPE_INIT_LIB_CCS_msp430_large_code_restricted_data.
lib:ipe_init.
o(.
ipestruct:retain).
ipe000004808000000d200004808000000ccIPE_FR59xx.
obj(.
ipe:IPE_encapsulatedBlink)000048d400000006IPE_FR59xx.
obj(.
ipe:IPE_encapsulatedInit).
ipe_const*0000048da00000010000048da00000010IPE_FR59xx.
obj(.
ipe_const)www.
ti.
com.
cnIP封装(IPE)15ZHCAA02–December2015SLAA685—http://www-s.
ti.
com/sc/techlit/SLAA685版权2015,TexasInstrumentsIncorporatedMSP代码保护特性.
ipe:_isr*0000048ea0000000a000048ea0000000aIPE_FR59xx.
obj(.
ipe:_isr:TIMER0_A0_ISR).
ipe_vars*0000048f400000002UNINITIALIZED000048f400000002IPE_FR59xx.
obj(.
ipe_vars).
.
.
GLOBALSYMBOLS:SORTEDALPHABETICALLYBYNameaddressname.
.
.
.
.
.
00004808IPE_encapsulatedBlink000048f4IPE_encapsulatedCount000048d4IPE_encapsulatedInit000048daIPE_encapsulatedKeys000048f5IPE_i0000ff88Ipe_enableSignature00004800Ipe_settingsStruct0000ff8aIpe_structureAddress.
.
.
.
.
.
00000480fram_ipe_border1000004c0fram_ipe_border2fffffffffram_ipe_checksum00000040fram_ipe_enable_value00004c00fram_ipe_end00000480fram_ipe_settings_struct_address00004800fram_ipe_start00004400fram_rw_start00004c00fram_rx_start.
.
.
.
.
.
IPE结构内置在代码的二进制映像中(.
txt或.
hex),以便能够在启动时被器件启动代码找到,如《MSP430FR58xx、MSP430FR59xx、MSP430FR68xx和MSP430FR69xx系列用户指南》(SLAU367)中所述.
也可以转到Project>Properties>Build>MSP430HexUtility来查看此二进制映像.
选择"EnableMSP430HexUtility",然后在"OutputFormatOptions"下方选择"OutputTI-TXThexformat(--ti_txt)".
随后会进行构建,Debug文件夹中应当会出现一个.
txt文件.
当查看此txt文件以查看IPE初始化结构时,请验证以下各项:1.
检查0xFF8A处的值.
这是IPE签名中包含IPE结构地址的那一部分.
请记住,此值已右移4位.
在此示例中,0xFF8A处的值为0x0480,指向IPE结构的地址0x4800.
注意此值如何与.
map文件匹配.
@ff80FFFFFFFFFFFFFFFFAAAA8004FFFFFFFF2.
转到IPE初始化结构的地址(我们在步骤1中发现的地址,在本例中为0x4800),并查看此结构中的值.
它将具有来自用户指南的格式.
IP封装(IPE)www.
ti.
com.
cn16ZHCAA02–December2015SLAA685—http://www-s.
ti.
com/sc/techlit/SLAA685版权2015,TexasInstrumentsIncorporatedMSP代码保护特性表表7.
IPE初初始始化化结结构构字字段段名名称称地地址址偏偏移移量量长长度度说说明明MPUIPC00h文字用于IP封装的控制设置.
值将写入到MPUIPC0MPUIPB22h文字IP封装段的上边界.
值将写入到MPUIPSEGB2MPUIPB14h文字IP封装段的下边界.
值将写入到MPUIPSEGB1MPUCHECK6h文字偶位交错奇偶校验在下面的示例中,您可以看到:MPUIPC0=0x0040→MPUIPENA=1=IPE启用MPUIPB2=0x04C0→地址0x4C00是IPE终点MPUIPB1=0x0480→地址0x4800是IPE起点MPUCHECK=0xFFFF→以前的数据的校验和.
在校验和低位字节=INV(Byte0XORByte2XORByte4)=INV(40XORC0XOR80)=0xFF、校验和高位字节=INV(Byte1XORByte3XORByte5)=INV(00XOR04XOR04)=0xFF时计算得出@48004000C0048004FFFF3.
1.
5在在CCS中中运运行行和和测测试试IPE代代码码此代码将在MSP-EXP430FR5969LaunchPad开发套件上运行.
1.
下载示例(http://www.
ti.
com/cn/lit/zip/slaa685)2.
将项目导入到CCSv6或更高版本中:Project>ImportCCSProjects…浏览.
.
.
并选择您下载并解压缩的代码所在的位置.
确保选中"Copyprojectsintoworkspace"复选框,然后单击"OK".
3.
构建项目.
3.
1.
5.
1在在CCS中中使使用用IPE调调试试设设置置如《MSP430FR58xx、MSP430FR59xx、MSP430FR68xx和MSP430FR69xx系列用户指南》(SLAU367)中所述,只有当复位器件以使启动代码能够运行之后,IPE设置才会生效.
为了测试IPE是否能够防止JTAG访问受保护区域,示例项目提供了两个不同的调试配置,以简化加载器件和测试IPE特性的过程:IPE_FR59xx_load-使用新的代码(包括IPE代码)对器件进行编程.
IPE_FR59xx_test-调试器件,但不对器件重新编程.
用于测试IPE保护.
在CCS中,选择调试错误图标旁边的下拉箭头,然后选择"Debugconfigurations"(请参见图4).
图图4.
CCS中中的的调调试试配配置置www.
ti.
com.
cnIP封装(IPE)17ZHCAA02–December2015SLAA685—http://www-s.
ti.
com/sc/techlit/SLAA685版权2015,TexasInstrumentsIncorporatedMSP代码保护特性在新窗口(请参见图5)中,此项目有两个调试配置:IPE_FR59xx_load和IPE_FR59xx_test.
这两个配置都与默认调试配置有所不同,这样有助于在启用了IPE的情况下进行调试.
IPE_FR59xx_load会将器件配置为在尝试对器件进行编程之前擦除IP受保护区域.
否则,如果存在IPE代码,程序加载将失败,原因在于IPE禁止从JTAG进行编程访问.
不过,工具链可以执行特殊擦除以批量擦除器件,还将擦除受到保护并存储着所保存的IPE结构指针的非易失性系统数据区域[请参阅MSP430FR58xx,MSP430FR59xx,MSP430FR68xx,andMSP430FR69xxFamilyUser'sGuide(SLAU367)中的"TrapdoorMechanismforIPStructurePointerTransfer"].
要进行此设置,请在MSP430Properties>ConnectionOptions下方的Target选项卡上的debugconfiguration中,选择"Onconnect,erasemain,information,andIPprotectedarea".
图图5.
CCS中中的的IPE加加载载配配置置另一方面,IPE_FR59xx_test可确保不执行此连接时擦除操作,以使用户能够观察IPE的行为(请参见图6).
此构建配置不会选中"Onconnect,erasemain,information,andIPprotectedarea"设置.
相反,IPE_FR59xx_test与默认配置之间的区别在于,IPE_FR59xx_test不会尝试加载程序(当启用了IPE之后,此操作会失败).
在本例中,用户需要在不下载的情况下进行调试.
要进行此设置,请在调试配置中的"Program"选项卡上的"Loadingoptions"下方,选择"Loadsymbolsonly".
IP封装(IPE)www.
ti.
com.
cn18ZHCAA02–December2015SLAA685—http://www-s.
ti.
com/sc/techlit/SLAA685版权2015,TexasInstrumentsIncorporatedMSP代码保护特性图图6.
CCS中中的的IPE测测试试配配置置为了便于使用IPE开发启用了IPE的任何CCS项目,TI建议使用此处所示的设置建立两个构建配置.
3.
1.
5.
2在在CCS中中测测试试IPE1.
单击调试图标旁边的下拉箭头,转到"DebugConfigurations",然后选择IPE_FR59xx_load调试配置.
进行调试.
2.
此程序将加载到器件中.
运行代码.
LaunchPad上的LED应当闪烁.
3.
暂停代码.
1.
选择"View>MemoryBrowser以打开"Memory"视图.
在"Memory"视图中,输入IPE受保护变量或函数的名称(IPE_encapsulatedInit、IPE_encapsulatedBlink等等).
2.
注意IP封装变量和函数仍然可见.
这是因为,启动代码必须在首次运行时将IPE结构指针加载到受到保护的内部非易失性系统数据区域,然后从IPE结构加载IPE寄存器,IPE才会生效(需要复位以使启动代码能够运行).
www.
ti.
com.
cnIP封装(IPE)19ZHCAA02–December2015SLAA685—http://www-s.
ti.
com/sc/techlit/SLAA685版权2015,TexasInstrumentsIncorporatedMSP代码保护特性图图7.
CCS中中的的IPE内内存存视视图图-无无保保护护4.
终止调试会话.
5.
对器件执行循环通电.
IPE现在应处于激活状态,并禁止对器件的IPE区域执行读取和写入访问.
6.
单击调试图标旁边的下拉箭头,转到"DebugConfigurations",然后选择IPE_FR59xx_test调试配置.
进行调试.
7.
此时不会加载任何程序,只会加载调试符号.
运行代码.
LaunchPad上的LED应当闪烁.
8.
暂停代码.
选择View>MemoryBrowser以打开"Memory"视图.
在"Memory"视图中,输入IPE受保护变量或函数的名称(IPE_encapsulatedInit、IPE_encapsulatedBlink等等).
注意IP封装变量和函数不再可见.
在这些区域中,此工具只能看见0x3FFF(JMP$).
IP封装处于激活状态,并禁止读取内存区域.
图图8.
CCS中中的的IPE内内存存视视图图-受受保保护护注注:当加载另一个用户项目时,如果在此前加载到器件中的代码中启用了IPE,则IPE区域会导致无法正确加载新项目,并在CCS中报告错误(因为无法擦除或写入到IPE区域).
要首次加载新项目,请在调试设置中为首次加载的新项目选择"Onconnect,erasemain,information,andIPprotectedarea",以擦除IPE代码和设置.
IP封装(IPE)www.
ti.
com.
cn20ZHCAA02–December2015SLAA685—http://www-s.
ti.
com/sc/techlit/SLAA685版权2015,TexasInstrumentsIncorporatedMSP代码保护特性3.
2使使用用IAR中中的的IPE工工具具进进行行IP封封装装IAR具有一个内置的IPE工具,并在链接器文件中提供了预定义的区段,以便于在项目中启用IPE.
尽管《MSP430FR58xx、MSP430FR59xx、MSP430FR68xx和MSP430FR69xx系列用户指南》详细说明了如何设置IPE初始化结构以及如何利用MPU寄存器手动启用IPE,但使用IAR中的内置IPE工具仍不失为更轻松、更自动化的替代方法.
随后的几节将讨论如何使用IAR中的这些工具在项目中启用IPE.
另请参阅zip文件(http://www.
ti.
com/cn/lit/zip/slaa685),以了解IAR中使用IPE的示例项目.
此代码将在MSP-EXP430FR5969LaunchPad开发套件上运行.
更多有关如何使用此工具在IAR中启用IPE的信息,请参阅IAREmbeddedWorkbenchIDE"Help"菜单中的IARC/C++CompilerUserGuide.
3.
2.
1用用于于IPE的的IAR链链接接器器文文件件特特性性注注:这些链接器文件特性在IARv6.
40.
1发布时是最新的版本.
早期版本的IAR链接器文件并不具备所有这些特性,因此建议在通过这种方法启用IPE时使用IARv6.
40.
1或更高版本.
对于支持IPE的器件,CCS链接器.
xcl文件包含一些用来放置IPE代码和数据的部分.
用户代码只需告诉编译器应将哪些变量和函数放到这些预定义的部分中.
如下代码片段来自MSP430FR5969链接器xcl文件://IntellectualPropertyEncapsulation(IPE)//-Z(CONST)IPE_B1=4400-FF7F-Z(DATA)IPEDATA16_N-Z(CODE)IPECODE16-Z(CONST)IPEDATA16_C,IPE_B2(CONST)IPE_B1-此代码段是IPE区域的起点,还包含IPE初始化结构,此结构包含有关IP封装存储器边界和控制设置的地址位置信息.
《MSP430FR58xx、MSP430FR59xx、MSP430FR68xx和MSP430FR69xx系列用户指南》(SLAU367)中提供了更多有关IPE初始化结构的信息.
用户不应将任何数据放在此部分中.
当使用内置的IARIPE工具时,此工具会生成所需的值,并将它们放在此位置.
(DATA)IPEDATA16_N-此代码段用于需要封装的任何数据变量(应使用__no_init选项来声明这些变量).
为了获得最高的安全性,还应将只在IP封装代码内使用的任何变量放到IP封装区域中,而不是放到RAM中.
否则有人可能利用所观察到的RAM变化尝试对封装代码的功能进行逆向工程.
当然,这取决于应用.
(CODE)IPECODE16-此代码段用于用户希望放在IP封装区域中的任何代码函数.
需要成为IP封装用户代码的一部分的任何中断服务例程(ISR)也要放在此位置.
(CONST)IPEDATA16_C-此代码段用于需要封装的任何常量数据.
这可能包括加密密钥或密码等内容或者其他敏感数据.
(CONST)IPE_B2-这是代表IPE区域终点的边界.
3.
2.
2在在IAR中中将将代代码码和和数数据据放放到到IPE部部分分中中用户必须为编译器指明应将哪些代码和数据放到链接器文件定义的IPE部分中.
对于IARC/C++编译器,通过使用#pragma位置来启用此操作.
更多有关此pragma以及如何在IAR中启用IPE的信息,请参阅IAR中的"Help"菜单下的IARC/C++CompilerUserGuide.
www.
ti.
com.
cnIP封装(IPE)21ZHCAA02–December2015SLAA685—http://www-s.
ti.
com/sc/techlit/SLAA685版权2015,TexasInstrumentsIncorporatedMSP代码保护特性必须在一个或一组函数中包含应当放到IPE区域中的代码.
应将这些函数全部放到IPECODE16部分中(请参见如下示例).
#pragmalocation="IPECODE16"voidIPE_encapsulatedInit(void){.
.
.
.
.
.
}#pragmalocation="IPECODE16"voidIPE_encapsulatedBlink(void){.
.
.
.
.
.
}还应将IP封装代码所使用的任何中断服务例程(ISR)放到IPE区域中,以便同时将它们封装.
还应将这些ISR放到IPECODE16部分中(请参见如下示例).
#pragmalocation="IPECODE16"#pragmavector=TIMER0_A0_VECTOR__interruptvoidTIMER0_A0_ISR(void){.
.
.
.
.
.
}某些应用可能具有加密密钥等常数,建议将这些常数存储在IPE区域中.
IAR链接器文件不允许将常数与变量或代码放在同一个部分中.
应将这些常数值放到IPEDATA16_C部分中(请参见如下示例).
#pragmalocation="IPEDATA16_C"constuint16_tIPE_encapsulatedKeys[]={0x0123,0x4567,0x89AB,0xCDEF,0xAAAA,0xBBBB,0xCCCC,0xDDDD};最后,还应将IPE代码使用的变量全部放到IPEDATA16_N部分中而不是RAM中,以防止代码的其他部分无法读取或访问这些变量.
请注意,应使用__no_init关键字标记这些变量.
#pragmalocation="IPEDATA16_N"__no_initunsignedcharIPE_encapsulatedCount;IP封装(IPE)www.
ti.
com.
cn22ZHCAA02–December2015SLAA685—http://www-s.
ti.
com/sc/techlit/SLAA685版权2015,TexasInstrumentsIncorporatedMSP代码保护特性应使用__no_init关键字标记这些变量,以表明放在这里的任何变量不应有任何初始化值,而且不应被启动代码初始化为0.
这是因为,C启动代码和.
cinit初始化表并未放在IPE区域中,因此无法写入到IPE部分以及设置IPE部分中的变量.
对用户来说,这意味着应在放在IPECODE16部分中的定制init函数中设置放在IPEDATA16_N部分中的任何变量,以使用在IPE区域内运行的代码来初始化这些变量.
随后,应在启动时由用户的主代码调用此init函数,以便在使用这些变量之前(例如在停止看门狗定时器之后)将它们初始化.
#pragmalocation="IPEDATA16_N"__no_initunsignedcharIPE_encapsulatedCount;/**main.
c*/voidmain(void){WDTCTL=WDTPW|WDTHOLD;//StopwatchdogtimerIPE_encapsulatedInit();.
.
.
.
.
.
}#pragmalocation="IPECODE16"voidIPE_encapsulatedInit(void){IPE_encapsulatedCount=1;}www.
ti.
com.
cnIP封装(IPE)23ZHCAA02–December2015SLAA685—http://www-s.
ti.
com/sc/techlit/SLAA685版权2015,TexasInstrumentsIncorporatedMSP代码保护特性3.
2.
3在在IAR项项目目选选项项中中启启用用IPE只需转到Project>Options>GeneralOptions,然后使用MPU/IPE选项卡,即可在IAR项目中启用IPE.
要实现自动化的IPE处理,请选择"SupportIPE"和"EnableIPE".
单击"OK",这样就设置了IPE.
图图9.
IAR中中的的IPE工工具具3.
2.
4在在IAR中中查查看看编编译译器器选选择择的的IPE分分区区在启用了IPE的IAR中构建了项目之后,如果需要,用户可以使用Output文件夹中的.
map文件,查看设置了哪些IPE边界以及不同的代码段(例如IPECODE16)和代码段内的函数放在了哪些位置.
此外,还可以找到__iar_430_MPUIPC0_value(此参数会显示IPE寄存器设置值)、IPE_B1和IPEB2边界等参数的值.
要生成.
map文件,请转到Project>Options>Linker,然后在"List"选项卡上选择"Generatelinkerlisting".
"Segmentmap"应当也已被选中.
随后会进行构建,Output文件夹中应当会出现一个.
map文件.
IP封装(IPE)www.
ti.
com.
cn24ZHCAA02–December2015SLAA685—http://www-s.
ti.
com/sc/techlit/SLAA685版权2015,TexasInstrumentsIncorporatedMSP代码保护特性图图10.
在在IAR中中生生成成.
map文文件件***MODULEMAP***.
.
.
.
.
.
IPEDATA16_NRelativesegment,address:4808-4808(0x1bytes),align:0Segmentpart17.
Intramodulerefs:IPE_encapsulatedBlinkIPE_encapsulatedInitENTRYADDRESSREFBYIPE_encapsulatedCount4808IPEDATA16_NRelativesegment,address:4809-4809(0x1bytes),align:0Segmentpart18.
Intramodulerefs:IPE_encapsulatedBlinkENTRYADDRESSREFBYIPE_i4809IPEDATA16_CRelativesegment,address:48DE-48ED(0x10bytes),align:1www.
ti.
com.
cnIP封装(IPE)25ZHCAA02–December2015SLAA685—http://www-s.
ti.
com/sc/techlit/SLAA685版权2015,TexasInstrumentsIncorporatedMSP代码保护特性Segmentpart19.
Intramodulerefs:IPE_encapsulatedBlinkENTRYADDRESSREFBYIPE_encapsulatedKeys48DE.
.
.
.
.
.
IPECODE16Relativesegment,address:480A-480F(0x6bytes),align:1Segmentpart25.
Intramodulerefs:mainENTRYADDRESSREFBYIPE_encapsulatedInit480AIPECODE16Relativesegment,address:4810-48D3(0xc4bytes),align:1Segmentpart24.
Intramodulerefs:mainENTRYADDRESSREFBYIPE_encapsulatedBlink4810IPECODE16Relativesegment,address:48D4-48DD(0xabytes),align:1Segmentpart23.
Intramodulerefs:TIMER0_A0_ISR::INTVEC90ENTRYADDRESSREFBYTIMER0_A0_ISR48D4interruptfunction.
.
.
.
.
.
***SEGMENTSINADDRESSORDER***SEGMENTSPACESTARTADDRESSENDADDRESSSIZETYPEALIGN.
.
.
.
.
.
IPE_B14800-48078rel10IPEDATA16_N4808-48092rel0IPECODE16480A-48DDD4rel1IPEDATA16_C48DE-48ED10rel1IPE_B24C00rel10IPE结构内置在代码的二进制映像中(.
txt或.
hex),以便能够在启动时被器件启动代码找到,如《MSP430FR58xx、MSP430FR59xx、MSP430FR68xx和MSP430FR69xx系列用户指南》(SLAU367)中所述.
也可以转到Project>Options>Linker,然后在"Output"选项卡上选择"AllowC-SPY-specificextraoutputfile",以查看此二进制文件.
IP封装(IPE)www.
ti.
com.
cn26ZHCAA02–December2015SLAA685—http://www-s.
ti.
com/sc/techlit/SLAA685版权2015,TexasInstrumentsIncorporatedMSP代码保护特性图图11.
用用于于IPE_FR59xx的的选选项项在"ExtraOutput"选项卡上,选择"Generateextraoutputfile",并将"输出"格式设置为"msp430-txt".
随后会进行构建,Output文件夹中应当会出现一个.
txt文件.
图图12.
在在IAR中中生生成成.
txt二二进进制制文文件件www.
ti.
com.
cnIP封装(IPE)27ZHCAA02–December2015SLAA685—http://www-s.
ti.
com/sc/techlit/SLAA685版权2015,TexasInstrumentsIncorporatedMSP代码保护特性当查看此txt文件以查看IPE初始化结构时,请验证以下各项:1.
检查0xFF8A处的值.
这是IPE签名中包含IPE结构地址的那一部分.
请记住,此值已右移4位.
在此示例中,0xFF8A处的值为0x0480,指向IPE结构的地址0x4800.
@FF88AAAA80042.
转到IPE初始化结构的地址(在步骤1中发现的地址,在本例中为0x4800),并查看此结构中的值.
它具有来自用户指南的格式.
表表8.
IPE初初始始化化结结构构字字段段名名称称地地址址偏偏移移量量长长度度说说明明MPUIPC00h文字用于IP封装的控制设置.
值将写入到MPUIPC0MPUIPB22h文字IP封装段的上边界.
值将写入到MPUIPSEGB2MPUIPB14h文字IP封装段的下边界.
值将写入到MPUIPSEGB1MPUCHECK6h文字偶位交错奇偶校验在下面的示例中,您可以看到:MPUIPC0=0x0040-MPUIPENA=1=IPE启用MPUIPB2=0x04C0→地址0x4C00是IPE终点MPUIPB1=0x0480→地址0x4800是IPE起点MPUCHECK=0xFFFF→以前的数据的校验和.
在校验和低位字节=INV(Byte0XORByte2XORByte4)=INV(40XORC0XOR80)=0xFF、校验和高位字节=INV(Byte1XORByte3XORByte5)=INV(00XOR04XOR04)=0xFF时计算得出@48004000C0048004FFFF3.
2.
5在在IAR中中运运行行和和测测试试IPE代代码码此代码将在MSP-EXP430FR5969LaunchPad开发套件上运行.
1.
下载示例(http://www.
ti.
com/cn/lit/zip/slaa685).
2.
在IAREW4306.
30.
2或更高版本中打开工作区IPE_FR59xx.
eww.
3.
构建项目.
3.
2.
5.
1在在IAR中中使使用用IPE调调试试设设置置项目必须将器件配置为在尝试对器件进行编程之前擦除IP受保护区域.
否则,如果存在IPE代码,程序加载将失败,原因在于IPE禁止从JTAG进行编程访问.
不过,工具链可以执行特殊擦除以批量擦除器件,还将擦除受到保护并存储着所保存的IPE结构指针的非易失性系统数据区域[请参阅MSP430FR58xx,MSP430FR59xx,MSP430FR68xx,andMSP430FR69xxFamilyUser'sGuide(SLAU367)中的"TrapdoorMechanismforIPStructurePointerTransfer"].
请在"Download"选项卡上的Project>Options>Debugger>FETDebugger中进行此设置.
选择"ErasemainandInformationmemoryinc,包括IPPROTECTEDarea".
IP封装(IPE)www.
ti.
com.
cn28ZHCAA02–December2015SLAA685—http://www-s.
ti.
com/sc/techlit/SLAA685版权2015,TexasInstrumentsIncorporatedMSP代码保护特性图图13.
IAR中中的的IPE调调试试配配置置3.
2.
5.
2在在IAR中中测测试试IPE1.
单击"DownloadandDebug"图标.
2.
此程序将加载到器件中,并运行代码.
LaunchPad上的LED应当闪烁.
3.
暂停代码.
1.
选择"View>Memory以打开"Memory"视图.
在"Memory"视图中,输入IPE受保护变量或函数的名称(IPE_encapsulatedInit、IPE_encapsulatedBlink等等)或者诸如0x4800的地址.
2.
注意IP封装变量和函数不可见.
在这些区域中,此工具只能看见0x3FFF(JMP$).
IP封装处于激活状态,并禁止读取内存区域.
图图14.
IAR中中的的IPE内内存存视视图图-受受保保护护www.
ti.
com.
cn引导加载程序(BSL)安全性特性29ZHCAA02–December2015SLAA685—http://www-s.
ti.
com/sc/techlit/SLAA685版权2015,TexasInstrumentsIncorporatedMSP代码保护特性注注:当加载另一个用户项目时,如果在此前加载到器件中的代码中启用了IPE,则IPE区域会导致无法正确加载新项目,并在IAR中报告错误(因为无法擦除或写入到IPE区域).
要首次加载新项目,请在调试设置中为首次加载的新项目选择"ErasemainandInformationmemoryinc.
包括IPPROTECTEDarea",以擦除IPE代码和设置.
4引引导导加加载载程程序序(BSL)安安全全性性特特性性即使已锁定或禁用JTAG/SBW访问,用户也可以使用MSP430引导加载程序执行现场固件更新.
当用户尝试在最终客户现场退回的器件(已在生产时锁定或禁用JTAG/SBW访问)上读取存储器或执行测试时,此工具也会非常有用.
BSL提供了多种特性,有助于防止此BSL访问功能被滥用.
更多有关特定器件上的BSL实施方法的信息,请参阅特定器件的相应BSL用户指南[MSP430ProgrammingWiththeBootloader(BSL)(SLAU319)或MSP430FR57xx,FR58xx,FR59xx,FR68xx,andFR69xxBootloader(BSL)User'sGuide(SLAU550)].
另请参阅器件数据表,以确定器件是否具有内置的默认BSL.
大多数MSP430器件都实施了BSL,但有些器件(例如MSP430G2xx1/G2xx2和MSP430i2040)不支持内置的BSL.
注注:有关如何保护MSP432器件或使用MSP432器件BSL的信息,请参阅应用报告ConfiguringSecurityandBootloader(BSL)onMSP432P4xx(SLAA659).
4.
1密密码码保保护护所有MSP430引导加载程序都为一些命令提供了密码保护.
任何允许读取器件的命令(例如TX_DATA_BLOCK)或控制器件的命令(例如LoadPC或RX_DATA_BLOCK)通常都受到保护,除非已经提供正确的密码,否则它们不会执行.
仅有的几个不受保护的命令通常包括RX_PASSWORD(用于接收BSL密码和解锁其他命令)、CHANGE_BAUD_RATE(用于更改BSL波特率以便于进行BSL通信)和MASS_ERASE(用于彻底擦除器件存储器).
密码由多个字节(通常32个字节)组成,位于中断矢量表的末尾,往前不超过存储器地址0xFFFF(请参阅BSL用户指南,详细了解器件的具体地址信息).
几乎所有MSP430BSL的密码都由地址0xFFE0-0xFFFF的数据组成(唯一的例外是MSP430F54xx非A器件,这些器件只有一个16字节的密码).
由于BSL密码由来自器件中断矢量表(IVT)的值组成,因此在已编程的器件上,对于地址0xFFFE处的复位矢量(除应用程序中使用的任何其他中断矢量以外),IVT始终具有至少一个除0xFFFF以外的值,这样就总是有一个BSL密码是通过将程序加载到器件中而设置的.
在CCS中,如果任何中断矢量没有用户定义的ISR,则TIC/C++编译器会自动添加一个陷阱ISR,以捕捉所有这些未使用的矢量.
因此,未使用的矢量具有一个除0xFFFF以外的值,但此值对于所有未使用的矢量都是相同的.
这样就为密码添加了更多的值,但如果用户代码未使用太多中断,则它可能仍未出现明显的变化.
@FFE01A4C1A4C1A4C1A4C1A4C9C481A4C1A4C1A4C1A4C1A4C1A4C1A4C1A4C1A4C004C引导加载程序(BSL)安全性特性www.
ti.
com.
cn30ZHCAA02–December2015SLAA685—http://www-s.
ti.
com/sc/techlit/SLAA685版权2015,TexasInstrumentsIncorporatedMSP代码保护特性在上述的TI-txt文件代码片段中,观察包含BSL密码的IVT区域-在0xFFE0-0xFFFF之间有32个字节.
本例中的489Ch和4C00h这两个值以绿色文本突出显示(这两个值用在中断矢量中),分别用于计时器ISR之一以及复位矢量.
注意FFFEh处的复位矢量表明启动代码始于4C00h.
所有其他未使用的IVT条目中填充了4C1Ah-这是陷阱ISR的地址.
在.
map文件中也可以找到陷阱ISR的地址,此地址标记为__TI_ISR_TRAP.
在_isr部分的下方还可以找到其他ISR地址.
.
text:_isr*000004c000000002000004c000000001arts430x_lc_rd_eabi.
lib:boot_special.
obj(.
text:_isr:_c_int00_noargs_noexit)00004c1a00000006:isr_trap.
obj(.
text:_isr:__TI_ISR_TRAP)如果需要定制BSL密码,可以将IVT的未使用条目修改为密码的其他值.
但这种情况的危险性在于,如果发生中断,会将IVT条目用作执行代码时要跳转到的地址,因此在这里放置随机值可能会导致代码胡乱运行或者将器件复位,当出现错误的中断时尤其如此(例如当意外启用了中断时).
尽管这种情况不太可能出现,但仍会构成风险,因此用户必须根据自己的系统和应用做出决定.
用户也可以使用BSL密码区域FFE0h-FFFFh中的IVT条目,为所有未使用的中断定义单独的ISR,并利用链接器文件修改和pragma将这些ISR放到所需的地址,以创建所需的BSL密码.
4.
2密密码码错错误误时时批批量量擦擦除除默认情况下,在大多数MSP430引导加载程序上,错误的BSL密码会导致器件批量擦除.
批量擦除操作会擦除全部代码.
此特性有助于防止他人利用"蛮力破解"尝试每一组的32个字节以猜测密码,因此提供了额外的一层安全性.
如果首次尝试时的密码不正确,将会批量擦除器件,这样现在就没有任何可读取的代码了.

VirMach:$27.3/月-E3-1240v1/16GB/1TB/10TB/洛杉矶等多机房

上次部落分享过VirMach提供的End of Life Plans系列的VPS主机,最近他们又发布了DEDICATED MIGRATION SPECIALS产品,并提供6.5-7.5折优惠码,优惠后最低每月27.3美元起。同样的这些机器现在订购,将在2021年9月30日至2022年4月30日之间迁移,目前这些等待迁移机器可以在洛杉矶、达拉斯、亚特兰大、纽约、芝加哥等5个地区机房开设,未来迁移的时...

星梦云:四川100G高防4H4G10M月付仅60元

星梦云怎么样?星梦云资质齐全,IDC/ISP均有,从星梦云这边租的服务器均可以备案,属于一手资源,高防机柜、大带宽、高防IP业务,一手整C IP段,四川电信,星梦云专注四川高防服务器,成都服务器,雅安服务器。星梦云目前夏日云服务器促销,四川100G高防4H4G10M月付仅60元;西南高防月付特价活动,续费同价,买到就是赚到!点击进入:星梦云官方网站地址1、成都电信年中活动机(成都电信优化线路,封锁...

香港站群多ip服务器多少钱?零途云香港站群云服务器怎么样?

香港站群多ip服务器多少钱?想做好站群的SEO优化,最好给每个网站都分配一个独立IP,这样每个网站之间才不会受到影响。对做站群的站长来说,租用一家性价比高且提供多IP的香港多ip站群服务器很有必要。零途云推出的香港多ip站群云服务器多达256个IP,可以满足站群的优化需求,而且性价比非常高。那么,香港多ip站群云服务器价格多少钱一个月?选择什么样的香港多IP站群云服务器比较好呢?今天,小编带大家一...

错误代码0xc004e003为你推荐
u盘无法读取U盘为什么不能显示回收站在哪手机回收站在哪里打开唱吧电脑版官方下载唱吧有没有电脑版的啊?网店推广网站什么平台适合做淘宝店铺推广苹果5怎么越狱苹果5怎么越狱godaddyGO DADDY服务器空间域名怎么样xv播放器下载xv播放器怎么下载?怎么点亮qq空间图标怎么点亮QQ空间的图标srv记录SRV记录的简介qq等级表谁能告诉我QQ等级列表?
子域名查询 快速域名备案 免费申请域名 yardvps 外国域名 12u机柜尺寸 双拼域名 天翼云盘 鲁诺 我的世界服务器ip 数据库空间 测试网速命令 江苏徐州移动 windowsserver2012r2 globalsign apachetomcat 热云 bwg 监控主机 主机系统 更多