我有代码示例 msp430g2xxS 3_flashwrite_01.c正在运行并了解其中的大部分内容。 我不能使用现有的INFOA-D (每个64字节)内存段,因为我需要更大的空间。 因此,我尝试在INFOA结束(INFOA-D反向映射)和0xC000 (下一个项目(闪存)开始)之间的可用空间中创建新的句段。
我尝试了几种不同的方法,但都不能使用,所以我把它变得非常简单:从0x1100开始,声明一个与INFOC相同大小的新段(64字节),并将 msp430g2xxS中的SegC地址位置3_flashwrite_01.c替换为0x1100地址。 仍然无法正常工作。 没有什么与原始工作示例不同,因此我得出结论,如果我选择"全部显示",我的新句段将显示在"内存分配"下,这是不可写的。 也许我只是错过了一个设置? 是否有人成功创建了已写入的新句段? 我可以在论坛上找到一些写动画的例子,但没有一个写新片段的例子。
在内存中创建新段:
内存
{
/*首先我们计算*/
SFR:原点= 0x0000,长度= 0x0010
Peripherals_8bit:原始= 0x0010,长度= 0x00F0
Peripherals_16BIT:原点= 0x0100,长度= 0x0100
RAM:原点= 0x0200,长度= 0x0200
/*然后我们倒计时。在INFOC和INFOD中,代码示例在其中工作*/
INFOA:原点= 0x10C0,长度= 0x0040
INFOB:原点= 0x1080,长度= 0x0040
INFOC:原点= 0x1040,长度= 0x0040
INFOD:原点= 0x1000,长度= 0x0040
/*这是我的新内容。 从0x1100 (INFOA结束)到0xC000 (RAM开始)似乎可用*/
XVSEG:原点= 0x1100,长度= 0x0040
/*这是原始资料*/
Flash:Origin = 0xC000,length = 0x3FDE
/*好的,但现在我们要倒计时了吗? */
BSLSIGNATURE:原点= 0xFFDE,长度= 0x0002,填充= 0xFFFF
INT00:原点= 0xFFE0,长度= 0x0002
INT01:原点= 0xFFE2,长度= 0x0002
INT02:原点= 0xFFE4,长度= 0x0002
INT03:原点= 0xFFE6,长度= 0x0002
INT04:原点= 0xFFE8,长度= 0x0002
INT05:原点= 0xFFEA,长度= 0x0002
INT06:原点= 0xFFEC,长度= 0x0002
INT07:原点= 0xFFEE,长度= 0x0002
INT08:Origin = 0xFFF0,length = 0x0002
INT09:原点= 0xFFF2,长度= 0x0002
INT10:原点= 0xFFF4,长度= 0x0002
INT11:原点= 0xFFF6,长度= 0x0002
INT12:原点= 0xFFF8,长度= 0x0002
INT13:原点= 0xFFFA,长度= 0x0002
INT14:原点= 0xFFFC,长度= 0x0002
重置:原点= 0xFFFE,长度= 0x0002
}
/******************************************************************************** /
/*指定分配给内存的部分*/
/******************************************************************************** /
章节
{
.bss :{}> RAM/*全局和静态vars */
数据:{}> RAM/*全局和静态vars */
.TI.noinit :{}> RAM /*用于#pragma noinit */
sysmem :{}> RAM/*动态内存分配区域*/
堆栈:{}> RAM (高)/*软件系统堆栈*/
text :{}> flash /* Code */
.cinit :{}> flash /* Initialization Tables */
const :{}> flash /*常量数据*/
.bslsignature :{}> BSLSIGNATURE /* BSL Signature */
CIO:{}> RAM/* C I/O Buffer */
.Pinit :{}> flash /* C++构造函数表*/
binit :{}> flash /* boot-time Initialization tables */
init_array :{}> flash /* C++构造函数表*/
.mspabi.exidx :{}> flash /* C++构造函数表*/
.mspabi.extab :{}> flash /* C++构造函数表*/
#ifdef __TI_Compiler_version__
#if __TI_Compiler_version__>= 1500.9万
#ifndef __larate_code_model__
.TI.ramfunc :{} load=flash, run=ram, table(BINIT)
#否则
.TI.ramfunc:{} load=flash | FLASH2,run=RAM,table (BINIT)
#endif
#endif
#endif
infoA :{}> INFOA /* MSP430信息闪存段*/
信息B:{}> INFOB.
INFoC :{}> INFOC.
信息D :{}> INFOD.
.xvseg :{}> XVSEG.
/* MSP430中断矢量*/
TRAPINT :{*(.int00)}> INT00类型= VECT_INIT
int01 :{}> INT01
端口1:{*(.int02)}> INT02类型= VECT_INIT
端口2:{*(.int03)}> INT03类型= VECT_INIT
int04:{}> INT04
ADC10 :{*(.int05)}> INT05类型= VECT_INIT
USCIAB0TX:{*(.int06)}> INT06类型= VECT_INIT
USCIAB0RX :{*(.int07)}> INT07类型= VECT_INIT
TIMER0_A1:{*(.int08)}> INT08类型= VECT_INIT
TIMER0_A0:{*(.int09)}> INT09类型= VECT_INIT
WDT:{*(.INT10)}> INT10类型= VECT_INIT
COMPARATORA :{*(.INT11)}> INT11 TYPE = VECT_INIT
Timer1_A1 :{*(.INT12)}> INT12类型= VECT_INIT
Timer1_A0 :{*(.INT13)}> INT13类型= VECT_INIT
NMI :{*(.INT14)}> INT14类型= VECT_INIT
.reset:{}> reset /* MSP430 Reset vector */
}
/******************************************************************************** /
/******************************************************************************** /
-l msp430g2553.cmd
修改的源代码:
//************************************************************************************************
// MSP430G2xx3演示-闪存系统内编程,将SegC复制到SegD
//
//说明:此程序首先擦除闪存设置C,然后全部递增
// seg C中的值,然后擦除seg D,然后将seg C复制到seg D
//假定MCLK 771kHz - 1428kHz。
////*在主循环中的NOP上设置断点,以避免对Flash *//造成压力
//
// MSP430G2xx3
//-----------
///|\\| Xin|-
//||||
//--|RST XOUT|-
//||
//
// D. Dang
//德州仪器(TI)
// 2010年12月
//使用CCS版本4.2 0和IAR嵌入式工作台版本:5.10 构建
//************************************************************************************************
#include <MSP4S.h>
字符值;//要写入A段的8位值
volatile char myTemp =0;
//函数原型
void write_SegC (字符值);
CHAR COPY_C2D (void);
内部主(无效)
{
WDTCTL = WDTPW + WDTHOLD;//停止看门狗计时器
IF (CALBC1_1MHz=0xFF)// If calibration constant erased
{
while (1);//不加载,捕获CPU!!
}
DCOCTL = 0;//选择最低DCOx和MODx设置
BCSCTL1 = CALC1_1MHz;//将DCO设置为1MHz
DCOCTL = CALDCO_1MHz;
FCTL2 = FWKEY + FSSEL0 + FN1;// MCLK/3,用于闪存定时发生器
值= 0;//初始化值
while (1)//永远重复
{
Write_SegC (value++);//写入段C,增量值
myTemp = COPY_C2D();//将段C复制到D
__no_operation();//在此处设置断点
}
}
void write_SegC (字符值)
{
CHAR *Flash_PTR;//闪存指针
无符号int I;
Flash_PTR =(CHAR *) 0x1100;//初始化闪存指针
FCTL1 = FWKEY + ERASE;//设置Erase bit
FCTL3 = FWKEY;//清除锁定位
*Flash_PTR =0;//虚拟写入以擦除闪存段
FCTL1 = FWKEY + WRT;//设置写入操作的WRT位
用于(i=0;i<64;i++)
{
*Flash_PTR++=值;//将值写入闪存
}
FCTL1 = FWKEY;//清除WRT位
FCTL3 = FWKEY + LOCK;//设置锁定位
}
CHAR COPY_C2D (无效)
{
CHAR *Flash_PTRC;//段C指针
char *Flash_ptrD;//段D指针
无符号int I;
字符温度;
FLASH_PTRC =(CHAR *) 0x1100;//初始化闪存段C指针
flash_ptrD =(char *) 0x1000;//初始化闪存段D指针
FCTL1 = FWKEY + ERASE;//设置Erase bit
FCTL3 = FWKEY;//清除锁定位
*Flash_ptrD = 0;//虚拟写入以擦除闪存段D
FCTL1 = FWKEY + WRT;//设置写入操作的WRT位
用于(i=0;i<64;i++)
{
*Flash_ptrD++=*Flash_PTRC+;//将值段C复制到段D
}
temp =*Flash_ptrD-;
FCTL1 = FWKEY;//清除WRT位
FCTL3 = FWKEY + LOCK;//设置锁定位