📄 self_prog.c
字号:
/****************************************Copyright (c)*****************************
文件名: self_prog.c
修改日期: 2006-1-24 13:00
描述: SPM操作函数
版本: V1.0,根据machao程序改编
主控 芯 片: M16 晶振频率:7.3728MHZ
********************************************************************************/
#include<iom16v.h>
#include<macros.h>
#include"define.h"
#include"extern.h"
/**********************************************************************
functionName:void someNop(void)
description: 擦除(code=0x03)和写入(code=0x05)一个Flash页
**********************************************************************/
void boot_page_ew(uint16 pageAddr,uint08 code)
{
asm("mov r30,r16\n"
"mov r31,r17\n"); //将页地址放入Z寄存器和RAMPZ的Bit0中
SPMCR = code; //寄存器SPMCSR中为操作码
asm("spm\n"); //对指定Flash页进行操作
}
/**********************************************************************
functionName:void boot_page_fill(uint16 address,uint16 data)
description: 填充Flash缓冲页中的一个字
**********************************************************************/
void boot_page_fill(uint16 address,uint16 data)
{
asm("mov r30,r16\n"
"mov r31,r17\n" //Z寄存器中为填冲页内地址
"mov r0,r18\n"
"mov r1,r19\n"); //R0R1中为一个指令字
SPMCR = 0x01;
asm("spm\n");
}
/**********************************************************************
functionName:void wait_page_rw_ok(void)
description: 等待一个Flash页的写完成
**********************************************************************/
void wait_page_rw_ok(void)
{
while(SPMCR & 0x40)
{
while(SPMCR & 0x01);
SPMCR = 0x11;
asm("spm\n");
}
}
/**********************************************************************
functionName:void write_lock_bits (unsigned char val)
description:写锁定位
**********************************************************************/
void write_lock_bits (unsigned char val)
{
asm("mov r0,r16\n");
SPMCR=0x09;
asm("spm\n");
while(SPMCR&BIT(0));
SPMCR = 0x11;
asm("spm\n");
}
/**********************************************************************
functionName:uint08 read_program_memory (uint16 addr,uint08 cmd)
description: 返回addr地址数据,以字节为单位
cmd:
0:读flashrom
1:读熔丝位或者锁定位
addr=0x0001 锁定位
addr=0x0000 熔丝位低字节
addr=0x0003 熔丝位高字节
**********************************************************************/
uint08 read_program_memory(uint16 addr,uint08 cmd)
{
asm("mov r30,r16\n"
"mov r31,r17\n");
if(cmd)
{
SPMCR=0x09;
}
asm("lpm r0,z\n");
return(R0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -