📄 main.asm
字号:
//======================================================
// The information contained herein is the exclusive property of
// Sunnnorth Technology Co. And shall not be distributed, reproduced,
// or disclosed in whole in part without prior written permission.
// (C) COPYRIGHT 2006 SUNNORTH TECHNOLOGY CO.
// ALL RIGHTS RESERVED
// The entire notice above must be reproduced on all authorized copies.
//========================================================
//============================================================
// 工程名称: Exa09_Flash_ASM
// 功能描述: Flash模式设置、擦除操作、写单字操作
// 以及写多字操作的子程序段
// 组成文件: main.asm
// spmc75f2413a.inc
// 硬件连接: SPMC75F2413A的新版EVM板
// 完成日期: 2006-3-17
//============================================================
//============================================================
.INCLUDE spmc75f2413a.inc
.CODE
//======================================================
// 主函数
//======================================================
.PUBLIC _main
_main:
r1 = 0x00ff
[P_IOD_Dir] = r1 //IOD[0~7]设置为输出
r1 = 0x00ff
[P_IOD_Attrib] = r1 //IOD[0~7]设置为非反向
r1 = 0x0000
[P_IOD_Buffer] = r1 //IOD[0~7]输出为0
r5 = 0x00ff //出错标志位初始化
call _Flash_RW_Enable //FLASH写使能设置
r1 = 0xf000 //擦除块的首地址
call _FlashErase //擦除第14页第一块
r1 = 0xf000 //擦除块的首地址
r3 = 256 //读出的数据个数寄存器
?_VerifyErase: //擦除块中数据读出校验
r4 = [r1] //读数据
cmp r4,0xffff //判断是否擦除
jz ?_ReadErase //对了则跳转
r5 &= 0xfffe //错了则错误标志位第0位清0
?_ReadErase: //没有写错
r1 += 1 //地址加1
r3 -= 1 //读出数据计数器减1
jnz ?_VerifyErase //256个数据没读完则跳转
r1 = 0xf000 //要写入数据的Flash首地址
r2 = 0 //要写入的数据
r3 = 10 //写入数据个数计数器
?_WriteWord: //单字写入
call _FlashWriteWord //将r2里面的数据写入r1地址中
r1 += 1 //地址加1
r2 += 1 //数据加1
r3 -= 1 //写入数据个数计数器减1
jnz ?_WriteWord //写完10个数据了吗
r1 = 0xf000 //写入数据的块的首地址
r2 = 0 //校验数据初始化
r3 = 10 //读出的数据个数寄存器
?_VerifyWord: //单字写入的数据读出校验
r4 = [r1] //读数据
cmp r4,r2 //判断是否写错
jz ?_ReadWord //写对了则跳转
r5 &= 0xfffd //写错了则错误标志第1位清0
?_ReadWord: //没有写错
r1 += 1 //地址加1
r2 += 1 //数据加1
r3 -= 1 //读出数据计数器减1
jnz ?_VerifyWord //单字写入的10个数据没读完
r1 = 0xf00a //多字写入的首地址
r2 = 10 //写入数据初始化
r3 = 30 //要写入的数据个数寄存器
call _FlashWritePage //多字写入
call _Flash_RW_Disable //Flash些功能禁止
r1 = 0xf00a //多字写入的数据读出校验
r2 = 10
r3 = 30
?_VerifyPage:
r4 = [r1]
cmp r4,r2
jz ?_ReadPage
r5 &= 0xfffb //错误则错误标志第2位清0
?_ReadPage:
r1 += 1
r2 += 1
r3 -= 1
jnz ?_VerifyPage
[P_IOD_Buffer] = r5 //显示错误状态,没有错误则LED全亮
?_Loop:
nop
jmp ?_Loop
//======================================================
// 汇编格式: _Flash_RW_Disable
// 实现功能: FLASH卸功能禁止
// 入口参数: 无
// 出口参数: 无
// 破坏寄存器: 无
//======================================================
.PUBLIC _Flash_RW_Disable
_Flash_RW_Disable:
push r1 to [sp]
r1 = 0x5a5a
[P_Flash_RW] = r1 //第一次写入控制命令
r1 = 0x4000
[P_Flash_RW] = r1 //第二次写入设置字,只读
pop r1 from [sp]
retf
//======================================================
// 汇编格式: _Flash_RW_Disable
// 实现功能: FLASH卸功能使能
// 入口参数: 无
// 出口参数: 无
// 破坏寄存器: 无
//======================================================
.PUBLIC _Flash_RW_Enable
_Flash_RW_Enable:
push r1 to [sp]
r1 = 0x5a5a
[P_Flash_RW] = r1 //第一次写入控制命令
r1 = 0x0000
[P_Flash_RW] = r1 //第二次写入设置字,读写
pop r1 from [sp]
retf
//======================================================
// 语法格式: _FlashErase
// 功能描述: 擦除一块flash
// 参数: r1--要擦除的块中的任意一个地址
// 返回值: 无
// 出口参数: 无
// 破坏寄存器: 无
//======================================================
.PUBLIC _FlashErase
_FlashErase:
push r2 to [sp]
r2 = 0xAAAA
[P_Flash_Cmd] = r2 //写入控制命令
r2 = 0x5511
[P_Flash_Cmd] = r2 //写入擦除命令
[r1] = r1 //向要擦除块中任一地址地址写入0
pop r2 from [sp]
retf
//======================================================
// 语法格式: _FlashWrite
// 功能描述: 向指定地址写入指定的数
// 参数: r1--要写入数据的地址,r2--要写入的数据
// 返回值: 无
// 破坏寄存器: 无
// 注意: 写入前保证对应地址已擦除
//======================================================
.PUBLIC _FlashWriteWord
_FlashWriteWord:
push r4 to [sp]
r4 = 0xAAAA
[P_Flash_Cmd] = r4 //写入控制命令
r4 = 0x5533
[P_Flash_Cmd] = r4 //写入单字编程命令
[r1] = r2 //向sectorAddress地址写入数据word
pop r4 from [sp]
retf
//======================================================
// 语法格式: _FlashWrite
// 功能描述: 向指定地址写入多个数据
// 参数: r1--要写入的数据块的首地址,
// r2--要连续写入数据的初值
// r3--要写入数据的个数
// 返回值: 无
// 破坏寄存器: 无
// 注意: 写入前保证对应地址已擦除
//======================================================
.PUBLIC _FlashWritePage
_FlashWritePage:
push r4 to [sp]
r4 = 0xAAAA
[P_Flash_Cmd] = r4 //写入控制命令
?_Write:
r4 = 0x5544
[P_Flash_Cmd] = r4 //写入多字编程命令
[r1] = r2 //将数据写入目标地址
r1 += 1 //地址加1
r2 += 1 //数据加1
r3 -= 1 //写入数据计数器减1
jnz ?_Write
r4 = 0xFFFF
[P_Flash_Cmd] = r4 //结束连续字写入操作
pop r4 from [sp]
retf
//======================================================
//======================================================
.END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -