我继承了专为2272 uC 设计的自定义引导加载程序应用程序、该应用程序已移植到58891。 客户引导加载程序接受从串行端口(eUSCI_A)上运行的 LabVIEW 应用程序下载的映像。 映像成功加载到58891 uC 的 FRAM (0x8000 -0xDfff) 并已验证。 验证成功后、我跳转至下载映像中的 CStart (0x8a38)位置。
//__asm ("mov.w &0xdffe、PC");//lnk430fr58891_operational.xcl -Z (code) reset=dffe-dfff
_asm ("mov.w #0x8a38、PC");//lnk430fr58891_operational.xcl -Z (code) reset=dffe-dfff
此操作生成复位、UC 从引导加载程序应用程序复位矢量(0xFFFE)获取 CStart (0x45fe)、然后继续执行自定义引导加载程序。 我通过在 main()的开头立即调用 MPU_Initialize()来禁用 MPU (如下所示)。 我有 一个__intrinsic int __low_level_init (void)例程,据我了解,该例程由 CStart 执行,也设置为禁用 MPU。 引导加载程序位于 FRAM 地址0x400-63ff。 引导加载程序在 64k 地址空间(复位0xFFFE)的顶部有默认的中断矢量表。
------------------------------------------------------------------
文件名:mpu.c
--------------------------------------------------------
void MPU_Initialize (void){
MPUCTL0 = MPUPW;// 0xa500;// PWD、GIE =禁用、LOCK =打开、 ENA =禁用
}
//这是来自
// MSP430
FRAM 技术–操作方法和最佳实践 SLAA628–2014年6月
//第10页
//请参阅 intrinsics.h
*如果应用程序提供此函
数,则在初始化变量之前由*启动代码调用。 如果函数
*返回0、则不会初始化数据段。
//
//__intrinsic int __low_level_init (void);
//#include "msp430.h"
__intrinsic int __low_level_init (void)
{
//在此处插入低级初始化*/
WDTCTL = WDTPW+WDTHOLD;
//配置 MPU
MPUCTL0 = MPUPW;//将0x4800b
= 0x4MPUPB1 = 0x0002;// MPUCDB1 = 0x0002 = 0x0002 = 0x000b = 0x000b = 0x0004寄存器/ 04800/ 0b = 0x0002;//将 MPU 写入到寄存器
//边界被分配给段
//段1–允许只读和只写
//段2–允许只读
//段3–允许只读和执行
// MPUSAM =(MPUSEG1WE | MPUSEG1RE | MPUSEG2RE | MPUSEG3RE | MPUSEG3XE);
// MPUSCTL0 = MPUSEG1RE | MPUSENA | MPUSENA //启用 MPU 保护
// MPU 寄存
器锁定直到 BOR //*返回值:* 1 -执行数据段初始化。
* 0 -跳过数据段初始化。
*/
返回1;
-------------------------------------------------------
文件名:lnk430fr58891_operation.xcl
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
/******** 8000dfff
//
//// MSP430FR58891的 XLink 配置文件
//
//版权所有1996-2016 IAR Systems AB。
//
//有关详细
//许可证信息,请参阅文件430/doc/licenses/IARSourceLicense.txt。
//
//$Revision:13610 $//
//(英文
//----------------------------
//说明
//
//
////用法:
//
// xlink [文件...] f lnk430fr58891.xcl
//
------------
//器件概要
//
////////内核:MSP430Xv2
//
//中断矢量:56
//
签名存储器:16字节
//
//// JTAG 签名存储器:4字节
//
//// BSL 签名存储器:4字节
//
//// IPE 签名存储器:8字节
//
外围设备:00100-00FFF
//
信息存储器(FRAM): 01800-019FF
//
读/写存储器(RAM):01C00-023FF
//
读/写存储器(TINYRAM):00006-0001F
//
//持久存储器(FRAM):04400-0FFFF
// 10000-23FFF
//
//------
//段
//
//---
//数据读取/写入段
//
////下列段可用于
// DATA16和 DATA20段组。
//
//段使用
//--- ----------------
//数据 _Z 数据初始化为零
//数据 _I 通过从数据复制初始化数据 _ID
//数据 使用__no_init
//数据定义的_N 数据 _P 使用_persistent
//数据定义的数据 堆'malloc'和'free'使用的堆
//
句段用法
//--- ----------------
// CSTACK 运行时堆栈
// TLS16_I 线程-主线程的本地存储
//
---------------
//程序段和数据只读段
//
////下列段可用于
// DATA16和 DATA20段组。
//
//段使用
//--- ----------------
//数据 _C 常量数据、包括字符串文字
//数据 _ID 数据初始化程序 _i
//
//句段用法
//---- ----------------
//信息内存
// INFOA 信息内存,组 A
// INFOB 信息内存,组 B
// INFOC 信息内存,组 C
// INFOD 信息内存, 组 D
// CSTART 程序启动代码
//代码程序代码
//中断服务例程的 ISR_code 程序代码
//由 C++使用的 DIFUNCT 动态初始化矢量
//由-J 选项生成的校验和校验和字节
//签名签名存储
器// JTAGSIGNATURE JTAG 签名存储
器// BSLSIGNATURE BSL 签名存储器
// IPESIGNATURE IPE 签名存储器
// intvec 中断矢量
//重置复位矢量
// TLS16_ID 主线程的本地初始化程序//
MPU_B 存储器保护单元边界
// IPE_B 知识产权封装边界
// IPECODE16 IPE 代码
// IPEDATA16_C IPE 常量数据
//
注:
//
//*段 CSTART、ISR_code 和 DIFFUNCT,
以及// DATA16和 TLS16段组中的段必须放置在范围
// 0000-FFFD 中。
//
//* INFox 和信息段重叠,这允许
//将数据放置在特定的组中或信息存储器中的任何位置。
//
////* INTVEC 和复位段重叠。 这使得一个应用能够
//使用运行时库提供的复位矢量、或者
//通过定义一个
与复位矢量相关联的中断函数来提供复位函数。
//
//*要使用内存保护单元,符号?mpu2_init 应
//包含在应用程序中。 符号'_IAR_430_MPU_base'应
//定义为 MPU 外设寄存
器的位置、//寄存器'_IAR_430_MPUSAM_Value'和'_IAR_430_MPUCTL0_Value'分别初始化为//将寄存器 MPUSAM 和 MPUCTL0的值初始化为//。
//
//*要包含知识产权封装(IPE),
应用程序中必须包含库//标签'__IAR_430_IPE_signature'。
//(一种方法是使用-g XLink 命令行选项。)
必须将//符号'_IAR_430_MPUIPC0_Value'定义为
// MPUIPC0寄存器应初始化为的值。
//
//*要在知识产权封装
//(IPE)区域中包括自定义段,请将它们放在 IPE_B1和 IPE_B2段之间。
//////-----
--------------------------------------
//配置
//
//------
//堆栈和堆大小
//
取消注释以供命令行使用
//-D_STACK_SIZE=160
//-D_DATA16_HIP_SIZE=160
//-D_DATA20_HIP_SIZE=160
//-g?mpu2_init
//-g_IAR_430_IPE_signature
//---
//定义 CPU
//
-cmsp430
//------
//支持将函数放置在读取/写入存储器
中//
-qcode_i=code_ID
//------------
//支持线程本地存储
//
-QTLS16_I=TLS16_ID
//------
//硬件乘法器位置
//
-D_IAR_HWMUL=4C0
//---------------
//放置指令
//
//-----------------
//信息内存
//
-Z (const) info=1800-19FF
-Z (const) INFOA =1980-19FF
-Z (const) INFOB =1900-197F
-Z (const) INFOC =1880-18FF
-Z (const) INFOD =1800-187F
//---
// RAM 内存
//
-Z (data) bootloader_message=1c00-1c05
-Z (data) TINYRAM=0006-001F
-Z (data
) DATA16_I、DATA16_Z、DATA16_N、TLS16_I=1c06-23FF //-Z (data) TINA16-
20-/DATA_I -/DATA- 20-/DATA_Z-
// FRAM 存储
器//
---------
//低内存0-0FFFF
//
------
//在 FRAM 中读取/写入数据
//
-Z (const) DATA16_P、DATA20_P=8000dfff
-Z (data) DATA16_heap+_DATA16_heap_size
-Z (data) DATA20_heap+_DATA20_heap_size
//---
//内存保护单元(MPU)边界
//
-Z (const) MPU_B1
//---
//知识产权封装(IPE)
//
-Z (CONST)IPE_B1=8000dfff
-Z (data)IPEDATA16_N
-Z (code)IPECODE16
-Z (CONST)IPEDATA16_C、IPE_B2
//---
//内存保护单元(MPU)边界
//
-Z (const) MPU_B2
//---
//常量数据
//
-Z (const) DATA16_C、DATA16、TLS16_ID、DIFUNCT_ID、CHECKSUM_8000dfff
//---
//代码
//
-Z (代码) CSTRT,ISR_code,CODE16=8000dfff
//---
//所有内存0-FFFFF
//
------
//代码
//
-P (代码)代码=8000dfff,10000-23FFF
-Z (代码) CODE_PAD
//---
//常量数据
//
-Z (const) DATA20_C、DATA20_ID、CODE_ID=8000dfff、10040-23FFF
//---
//签名存储器和中断矢量
//
-Z (const) signating=DF80-DF8F
-Z (const) JTAGIGNATURE=DF80-DF83
-Z (const) BSLSIGNATE=DF84-DF87
-Z (const) IPESIGNATE=DF88-DF8F -Z (CONST)
代码=DSLSIGNFFE=DZ (DFFF -DZ)复位代码 DFFE =DFFF (DFFF) DZ (DFFF)