⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flash.s43

📁 MSP430系列单片机资料-7册-46.3M-pdf.zip
💻 S43
字号:
//////////////////////////////////////////////////////////////////////////////
//                                                                           /
// IAR MSP430 C/C++ Compiler V3.20A/W32  [Evaluation]  03/Mar/2005  15:53:33 /
// Copyright 1996-2004 IAR Systems. All rights reserved.                     /
//                                                                           /
//    __rt_version  =  2                                                     /
//    __double_size =  32                                                    /
//    __reg_r4      =  free                                                  /
//    __reg_r5      =  free                                                  /
//    __pic         =  no                                                    /
//    __core        =  64kb                                                  /
//    Source file   =  K:\书\例\6-8\flash.c                                  /
//    Command line  =  -I "C:\Program Files\IAR Systems\Embedded Workbench   /
//                     Evaluation 4.0\430\INC\" -I "C:\Program Files\IAR     /
//                     Systems\Embedded Workbench Evaluation                 /
//                     4.0\430\INC\CLIB\" -lB K:\书\例\6-8\Debug\List\ -o    /
//                     K:\书\例\6-8\Debug\Obj\ -z2 --no_cse --no_unroll      /
//                     --no_inline --no_code_motion --no_tbaa --debug -e     /
//                     --double=32 K:\书\例\6-8\flash.c                      /
//    List file     =  K:\书\例\6-8\Debug\List\flash.s43                     /
//                                                                           /
//                                                                           /
//////////////////////////////////////////////////////////////////////////////

        NAME flash

        RSEG CSTACK:DATA:SORT:NOROOT(1)

        EXTERN ?cstart_init_zero
        EXTERN ?longjmp_r4
        EXTERN ?longjmp_r5
        EXTERN ?setjmp_r4
        EXTERN ?setjmp_r5

        PUBWEAK ?setjmp_save_r4
        PUBWEAK ?setjmp_save_r5
        PUBWEAK FCTL1
        PUBWEAK FCTL3
        PUBLIC FlashBusy
        PUBLIC FlashErase
        PUBLIC FlashWB
        PUBLIC FlashWW
        PUBLIC FlashWWA
        PUBWEAK WDTCTL
        PUBLIC dd
        PUBLIC main

// K:\书\例\6-8\flash.c
//    1 /****************************************************************************\ 
//    2                                 北京东方美源公司
//    3                             版权所有(c)2005~2007
//    4 
//    5 文件名:flash.c
//    6 编写者:czhang
//    7 描述:用于MSP430F149。
//    8 	  FLASH存储器读写、擦除。时钟源:ACLK 32.768KHz
//    9 
//   10 版本:	1.0	2005-2-19
//   11 \****************************************************************************/
//   12 #include  <msp430x14x.h>

        ASEGN DATA16_AN:DATA:NOROOT,0120H
// unsigned short volatile __data16 WDTCTL
WDTCTL:
        DS8 2

        ASEGN DATA16_AN:DATA:NOROOT,0128H
// unsigned short volatile __data16 FCTL1
FCTL1:
        DS8 2

        ASEGN DATA16_AN:DATA:NOROOT,012cH
// unsigned short volatile __data16 FCTL3
FCTL3:
        DS8 2
//   13 #include "flash.h"
//   14 
//   15 #define ADR 0xEE00

        RSEG DATA16_Z:DATA:SORT:NOROOT(1)
	REQUIRE ?cstart_init_zero
//   16 unsigned int dd[600];
dd:
        DS8 1200
//   17 

        RSEG CODE:CODE:REORDER:NOROOT(1)
//   18 void main(void)
main:
//   19 {
	PUSH.W	R10
	PUSH.W	R11
	SUB.W	#0x4, SP
//   20 	unsigned char *pflash;
//   21 	unsigned char q0;
//   22 	unsigned int iq0,iq1;
//   23 	WDTCTL = WDTPW + WDTHOLD;             // Stop WDT
	MOV.W	#0x5a80, &0x120
//   24 
//   25 	for(iq0=0;iq0<600;iq0++)
	MOV.W	#0x0, R10
??main_0:
	CMP.W	#0x258, R10
	JC	??main_3
//   26 		dd[iq0]=0xAA;
	MOV.W	R10, R15
	RLA.W	R15
	MOV.W	#0xaa, dd(R15)
	ADD.W	#0x1, R10
	JMP	??main_0
//   27 	_NOP();
??main_3:
	NOP
//   28 //	FlashErase(ADR);
//   29 	_NOP();
	NOP
//   30 	FlashWWA(ADR,dd,2);
	PUSH.W	#0x2
	MOV.W	#dd, R14
	MOV.W	#0xee00, R12
	CALL	#FlashWWA
//   31 //   iq0=*((unsigned int *)ADR);
//   32 //	FlashWW(ADR,0xBB00);
//   33 //	_NOP();
//   34 //	iq0=*((unsigned int *)ADR);
//   35 //	_NOP();
//   36 //	FlashWB(ADR,0xCC);
//   37 //	_NOP();
//   38 //	q0=*((unsigned char *)ADR);
//   39   for(iq0=0;iq0<600;iq0++)
	MOV.W	#0x0, R10
	ADD.W	#0x2, SP
??main_1:
	CMP.W	#0x258, R10
	JC	??main_4
//   40 		dd[iq0]=0;
	MOV.W	R10, R15
	RLA.W	R15
	MOV.W	#0x0, dd(R15)
	ADD.W	#0x1, R10
	JMP	??main_1
//   41 	iq1=ADR;
??main_4:
	MOV.W	#0xee00, R11
//   42 	for(iq0=0;iq0<600;iq0++)
	MOV.W	#0x0, R10
??main_2:
	CMP.W	#0x258, R10
	JC	??main_5
//   43 	{
//   44 		dd[iq0]=*((unsigned int *)iq1);
	MOV.W	R10, R15
	RLA.W	R15
	MOV.W	@R11, dd(R15)
//   45 		iq1+=2;
	ADD.W	#0x2, R11
//   46 	}
	ADD.W	#0x1, R10
	JMP	??main_2
//   47 	_NOP();
??main_5:
	NOP
//   48 }
	ADD.W	#0x4, SP
	POP.W	R11
	POP.W	R10
	RET
//   49 /***************************************************************************
//   50 段擦除
//   51 adr:要擦除的段内的任一地址
//   52 ***************************************************************************/

        RSEG CODE:CODE:REORDER:NOROOT(1)
//   53 void FlashErase(unsigned int adr)
FlashErase:
//   54 {
	PUSH.W	R10
	PUSH.W	R11
	MOV.W	R12, R10
//   55 	unsigned char *p0;
//   56 
//   57 	FCTL1=FWKEY+ERASE;
	MOV.W	#0xa502, &0x128
//   58 	FCTL3=FWKEY;
	MOV.W	#0xa500, &0x12c
//   59 	p0=(unsigned char *)adr;
	MOV.W	R10, R11
//   60 	*p0=0;				//向段内地址任意写,启动擦除操作
	MOV.B	#0x0, 0(R11)
//   61 	FCTL1=FWKEY;
	MOV.W	#0xa500, &0x128
//   62 	FCTL3=FWKEY+LOCK;
	MOV.W	#0xa510, &0x12c
//   63 	while(FlashBusy()==1)	//等待FLASH存储器完成操作
??FlashErase_0:
	CALL	#FlashBusy
	CMP.B	#0x1, R12
	JEQ	??FlashErase_0
//   64 	;
//   65 }
	POP.W	R11
	POP.W	R10
	RET
//   66 
//   67 /**************************************************************************
//   68 测试FLASH是否忙
//   69 返回值:  1:忙   0:不忙
//   70 **************************************************************************/

        RSEG CODE:CODE:REORDER:NOROOT(1)
//   71 unsigned char FlashBusy()
FlashBusy:
//   72 {
//   73 if((FCTL3&BUSY)==BUSY)
	BIT.W	#0x1, &0x12c
	SUBC.B	R12, R12
	ADD.B	#0x1, R12
//   74 		return 1;
//   75 	else
//   76 		return 0;
	RET
//   77 }
//   78 
//   79 /**************************************************************************
//   80 字编程
//   81 Adr:要编程的地址,注意:不是指针类型,应当是偶地址
//   82 DataW:要编程的字
//   83 **************************************************************************/

        RSEG CODE:CODE:REORDER:NOROOT(1)
//   84 void FlashWW(unsigned int Adr,unsigned int DataW)
FlashWW:
//   85 {
	PUSH.W	R10
	PUSH.W	R11
	MOV.W	R12, R10
	MOV.W	R14, R11
//   86 	FCTL1=FWKEY+WRT;
	MOV.W	#0xa540, &0x128
//   87 	FCTL3=FWKEY;
	MOV.W	#0xa500, &0x12c
//   88    *((unsigned int *)Adr)=DataW;
	MOV.W	R11, 0(R10)
//   89 	FCTL1=FWKEY;
	MOV.W	#0xa500, &0x128
//   90 	FCTL3=FWKEY+LOCK;
	MOV.W	#0xa510, &0x12c
//   91 	while(FlashBusy()==1)	//等待FLASH存储器完成操作
??FlashWW_0:
	CALL	#FlashBusy
	CMP.B	#0x1, R12
	JEQ	??FlashWW_0
//   92 	;
//   93 }
	POP.W	R11
	POP.W	R10
	RET
//   94 
//   95 /**************************************************************************
//   96 字节编程
//   97 Adr:指向要编程的地址,注意:不是指针类型
//   98 DataB:要编程的字节
//   99 **************************************************************************/
//  100 

        RSEG CODE:CODE:REORDER:NOROOT(1)
//  101 void FlashWB(unsigned int Adr,unsigned char DataB)
FlashWB:
//  102 {
	PUSH.W	R10
	PUSH.W	R11
	MOV.W	R12, R10
	MOV.B	R14, R11
//  103 	FCTL1=FWKEY+WRT;
	MOV.W	#0xa540, &0x128
//  104 	FCTL3=FWKEY;
	MOV.W	#0xa500, &0x12c
//  105 	*((unsigned char *)Adr)=DataB;
	MOV.B	R11, 0(R10)
//  106 	FCTL1=FWKEY;
	MOV.W	#0xa500, &0x128
//  107 	FCTL3=FWKEY+LOCK;
	MOV.W	#0xa510, &0x12c
//  108 	while(FlashBusy()==1)	//等待FLASH存储器完成操作
??FlashWB_0:
	CALL	#FlashBusy
	CMP.B	#0x1, R12
	JEQ	??FlashWB_0
//  109 	;
//  110 }
	POP.W	R11
	POP.W	R10
	RET
//  111 
//  112 /**************************************************************************
//  113 多字编程
//  114 Adr:指向要编程的地址,注意:不是指针类型,应当是偶地址
//  115 pDataW:指向要编程的字节的数组的指针
//  116 nWord:编程的字数
//  117 **************************************************************************/
//  118 //#pragma location="MYSET" 
//  119 

        RSEG MYSET:CODE:REORDER:NOROOT(1)
//  120 void FlashWWA(unsigned int Adr,unsigned int *pDataW,unsigned int nWord)  @ "MYSET"
FlashWWA:
//  121 {
	SUB.W	#0x6, SP
	MOV.W	0x8(SP), R15
//  122 	unsigned int iq0,iq1;
//  123 	unsigned int *piq0;
//  124 
//  125 //	piq0= (unsigned int*)Adr;
//  126 //
//  127 //	while(FlashBusy()==1)	//等待FLASH存储器完成操作
//  128 //	;
//  129 //	FCTL3=FWKEY;				 //复位LOCK位,为FLASH解锁
//  130 //
//  131 //	FCTL1=FWKEY+WRT+SEGWRT;  //选择段编程,进入编程状态
//  132 //	*piq0 = 0xAA00;
//  133 //	while((FCTL3&WAIT)==0)  //等待FALSH存储器可以接受新的编程数据
//  134 //	;
//  135 
//  136 /*
//  137 	FCTL1=FWKEY+WRT+SEGWRT;  //选择段编程,进入编程状态
//  138 	FCTL3=FWKEY;				 //复位LOCK位,为FLASH解锁
//  139 
//  140 	piq0= (unsigned int*)Adr;
//  141 	for(iq0=0;iq0<nWord;iq0++)
//  142 	{
//  143 		while((FCTL3&WAIT)==0)  //等待FALSH存储器可以接受新的编程数据
//  144 		;
//  145 
//  146 //		piq0= (unsigned int*)Adr;
//  147 		*piq0 = 0xAA00;//(*pDataW);
//  148 		piq0++;
//  149 //		pDataW++;
//  150 		//判断是否到达段边界
//  151 //		iq1=(Adr>>9)+1;
//  152 //		if((iq1&0x1)==0)
//  153 //		{
//  154 //			//到达段边界
//  155 //			while((FCTL3&WAIT)==0)  //等待FALSH存储器可以接受新的编程数据
//  156 //			;
//  157 //			FCTL1=FWKEY;	//WRT、SEGWRT复位
//  158 //			while(FlashBusy()==1)
//  159 //			;
//  160 //			FCTL1=FWKEY+WRT+SEGWRT;  //选择段编程,进入编程状态
//  161 //		}
//  162 //		Adr+=2;
//  163 	}
//  164 	while((FCTL3&WAIT)==0)  //等待FALSH存储器可以接受新的编程数据
//  165 	;
//  166 	FCTL1=FWKEY;	//WRT、SEGWRT复位
//  167 	FCTL3=FWKEY+LOCK;
//  168 	while(FlashBusy()==1)	//等待FLASH存储器完成操作
//  169 	;
//  170 	*/
//  171 }
	ADD.W	#0x6, SP
	RET

        RSEG CODE:CODE:REORDER:NOROOT(1)
?setjmp_save_r4:
	REQUIRE ?setjmp_r4
	REQUIRE ?longjmp_r4

        RSEG CODE:CODE:REORDER:NOROOT(1)
?setjmp_save_r5:
	REQUIRE ?setjmp_r5
	REQUIRE ?longjmp_r5

        END
// 
//   270 bytes in segment CODE
//     6 bytes in segment DATA16_AN
// 1 200 bytes in segment DATA16_Z
//    14 bytes in segment MYSET
// 
//   284 bytes of CODE memory
// 1 200 bytes of DATA memory (+ 6 bytes shared)
//
//Errors: none
//Warnings: 6

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -