📄 flash_routines.c
字号:
/**********************************************************************
* 程序说明
*
* 该文件包括用于擦除和烧写一行flash内存(32个指令字)的子程序,
* flash内存用于保存BLDC起始和运行参数。
**********************************************************************/
#include "general.h"
void erase_flash_row(unsigned int );
void program_flash(unsigned int, unsigned int);
//擦除一行flash内存子程序
void erase_flash_row(unsigned int address)
{
//允许擦除行
asm("mov #0x4041,W1");
asm("mov W1,NVMCON");
// 清地址高字节
asm("clr NVMADRU");
// 采用PSV,屏蔽地址(置于W0中)的MS位
asm("bclr W0,#15");
asm("mov W0,NVMADR");
// 擦除flash
asm(" bset NVMCON,#14");
asm(" mov #0x55,W1");
asm(" mov W1,NVMKEY");
asm(" mov #0xaa,W1");
asm(" mov W1,NVMKEY");
asm(" bset NVMCON,#15");
Nop();
Nop();
return;
}
//把值写到flash中指定地址的子程序
void program_flash(unsigned int destination, unsigned int values)
{
//允许写行
asm("mov #0x4001,W3");
asm("mov W3,NVMCON");
// 采用PSV,屏蔽地址(置于W0中)的MS位
asm("bclr W0,#15");
// 采用PSV,设定TBLPAG值为零
asm("clr TBLPAG");
// 清W3,以便写0到MS字节
asm("clr W3");
// 装入32个数值
asm("tblwtl.w [w1++], [w0]");
asm("tblwth.w W3, [w0++]"); // 字 1
asm("tblwtl.w [w1++], [w0]");
asm("tblwth.w W3, [w0++]"); // 字 2
asm("tblwtl.w [w1++], [w0]");
asm("tblwth.w W3, [w0++]"); // 字 3
asm("tblwtl.w [w1++], [w0]");
asm("tblwth.w W3, [w0++]"); // 字 4
asm("tblwtl.w [w1++], [w0]");
asm("tblwth.w W3, [w0++]"); // 字 5
asm("tblwtl.w [w1++], [w0]");
asm("tblwth.w W3, [w0++]"); // 字 6
asm("tblwtl.w [w1++], [w0]");
asm("tblwth.w W3, [w0++]"); // 字 7
asm("tblwtl.w [w1++], [w0]");
asm("tblwth.w W3, [w0++]"); // 字 8
asm("tblwtl.w [w1++], [w0]");
asm("tblwth.w W3, [w0++]"); // 字 9
asm("tblwtl.w [w1++], [w0]");
asm("tblwth.w W3, [w0++]"); // 字 10
asm("tblwtl.w [w1++], [w0]");
asm("tblwth.w W3, [w0++]"); // 字 11
asm("tblwtl.w [w1++], [w0]");
asm("tblwth.w W3, [w0++]"); // 字 12
asm("tblwtl.w [w1++], [w0]");
asm("tblwth.w W3, [w0++]"); // 字 13
asm("tblwtl.w [w1++], [w0]");
asm("tblwth.w W3, [w0++]"); // 字 14
asm("tblwtl.w [w1++], [w0]");
asm("tblwth.w W3, [w0++]"); // 字 15
asm("tblwtl.w [w1++], [w0]");
asm("tblwth.w W3, [w0++]"); // 字 16
asm("tblwtl.w [w1++], [w0]");
asm("tblwth.w W3, [w0++]"); // 字 17
asm("tblwtl.w [w1++], [w0]");
asm("tblwth.w W3, [w0++]"); // 字 18
asm("tblwtl.w [w1++], [w0]");
asm("tblwth.w W3, [w0++]"); // 字 19
asm("tblwtl.w [w1++], [w0]");
asm("tblwth.w W3, [w0++]"); // 字 20
asm("tblwtl.w [w1++], [w0]");
asm("tblwth.w W3, [w0++]"); // 字 21
asm("tblwtl.w [w1++], [w0]");
asm("tblwth.w W3, [w0++]"); // 字 22
asm("tblwtl.w [w1++], [w0]");
asm("tblwth.w W3, [w0++]"); // 字 23
asm("tblwtl.w [w1++], [w0]");
asm("tblwth.w W3, [w0++]"); // 字 24
asm("tblwtl.w [w1++], [w0]");
asm("tblwth.w W3, [w0++]"); // 字 25
asm("tblwtl.w [w1++], [w0]");
asm("tblwth.w W3, [w0++]"); // 字 26
asm("tblwtl.w [w1++], [w0]");
asm("tblwth.w W3, [w0++]"); // 字 27
asm("tblwtl.w [w1++], [w0]");
asm("tblwth.w W3, [w0++]"); // 字 28
asm("tblwtl.w [w1++], [w0]");
asm("tblwth.w W3, [w0++]"); // 字 29
asm("tblwtl.w [w1++], [w0]");
asm("tblwth.w W3, [w0++]"); // 字 30
asm("tblwtl.w [w1++], [w0]");
asm("tblwth.w W3, [w0++]"); // 字 31
asm("tblwtl.w [w1++], [w0]");
asm("tblwth.w W3, [w0++]"); // 字 32
//开始烧写
asm(" bset NVMCON,#14");
asm(" mov #0x55,W1");
asm(" mov W1,NVMKEY");
asm(" mov #0xaa,W1");
asm(" mov W1,NVMKEY");
asm(" bset NVMCON,#15");
Nop();
Nop();
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -