📄 self_prog.c
字号:
#include "init.h"
/**********************************************************************
擦除(code=0x03)和写入(code=0x05)一个Flash页
特别说明,MEGA128为128K容量,分为两个64K空间。
两个空间之间的选择通过RAMPZ的Bit0位来实现。
**********************************************************************/
void boot_page_ew(unsigned long pageAddr,unsigned char code) {
asm("mov r30,r16\n"
"mov r31,r17\n"
"out 0x3b,r18\n"); /*将页地址放入Z寄存器和RAMPZ的Bit0中*/
SPMCSR = code; /*寄存器SPMCSR中为操作码*/
asm("spm\n"); /*对指定Flash页进行操作 */
}
/*填充Flash缓冲页中的一个字*/
void boot_page_fill(unsigned int address,unsigned int data) {
asm("mov r30,r16\n"
"mov r31,r17\n" /*Z寄存器中为填冲页内地址*/
"mov r0,r18\n"
"mov r1,r19\n"); /*R0R1中为一个指令字*/
SPMCSR = (1 << SPMEN); /*SPM使能位*/
asm("spm\n"); /*执行SPM操作*/
}
/*等待一个Flash页的写完成 */
void wait_page_rw_ok(void) {
while (SPMCSR & (1 << RWWSB)) { /*等待忙信号*/
while (SPMCSR & (1 << SPMEN)); /*等待EN信号完成*/
SPMCSR = (1 << RWWSRE) | (1 << SPMEN);/*SPM读使能*/
asm("spm\n"); /*执行SPM操作*/
}
}
/*写锁定位*/
void write_lock_bits (unsigned char val) {
asm("mov r0,r16\n");
SPMCSR=(1 << BLBSET) | (1 << SPMEN);
asm("spm\n");
while (SPMCSR & (1 << SPMEN)); /*等待EN信号完成*/
SPMCSR = (1 << RWWSRE) | (1 << SPMEN); /*SPM读使能*/
asm("spm\n");
}
/**********************************************************************
functionName:unsigned char read_program_memory (unsigned int addr,unsigned char cmd)
description: 返回addr地址数据,以字节为单位
cmd:
0:读flashrom
1:读熔丝位或者锁定位
addr=0x0001 锁定位
addr=0x0000 熔丝位低字节
addr=0x0003 熔丝位高字节
**********************************************************************/
unsigned char read_program_memory(unsigned int addr,unsigned char cmd) {
asm("mov r30,r16\n"
"mov r31,r17\n");
if (cmd) {
SPMCSR=(1 << BLBSET) | (1 << SPMEN);
}
asm("lpm r0,z\n");
return(R0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -