📄 flash.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 + -