📄 wflash.c
字号:
#define WFLASH_GLOBAL
#include "includes.h"
// Boot section subprogram
#asm
.cseg
.org 0xf100
.equ SPMCSR = 0x68
.equ SPMEN = 0
#endasm
// .equ ASPMCSR = 0x68
#pragma warn-
/*** Wait finish of the SPM operation ***/
void check_SPMEN(void)
{
#asm
Wait_spm:
LDS r22, SPMCSR
sbrc r22, SPMEN
rjmp Wait_spm
#endasm
}
//in
/*** Re-enable the Read-While-Write(RWW) section ***/
void enable_RWW(void)
{
check_SPMEN();
#asm
LDI R22,0x11
STS SPMCSR,R22
SPM
#endasm
}
//out
/*** Flash Page Write/Erase ***/
void write_page(unsigned int adr,unsigned char function)
{
check_SPMEN();
#asm
Wait_ee:
sbic EECR, EEWE
rjmp Wait_ee
ldd R31,y+2
ldd R30,y+1
ld r22,y
STS SPMCSR,R22
SPM
#endasm
enable_RWW();
}
//OUT
/*** Fill the temporary page buffer ***/
void fill_temp_buffer(unsigned int data,unsigned int adr)
{
check_SPMEN();
#asm
ldd R31,y+1
ld R30,y
ldd R1,y+3
ldd R0,y+2
LDI R22,0x01
STS SPMCSR,R22
SPM
#endasm
}
//OUT
/*** Read char from flash ***/
unsigned char read_flash(unsigned int adr)
{
#asm
cli
ldd R31,y+1
ld R30,y
lpm r30,z
clr R31
sei
#endasm
}
#pragma warn+
/*** Save parameter to flash ***/
unsigned char write_flash(unsigned char *p,unsigned char n,unsigned int pagead)
{
unsigned char i,j;
for (j = 0 ; j < 5 ; j++)
{
PORTB.7 = ~PORTB.7;
#asm("cli")
write_page(pagead,0x03);
for (i = 0 ; i < n ; i += 2)
fill_temp_buffer(((int)(*(p + i + 1)) << 8 ) | (*(p + i)),(int)i);
write_page(pagead,0x05);
#asm("sei");
delay_ms(5);
PORTB.7 = ~PORTB.7;
for (i = 0 ; i < n ; i++)
if (read_flash(pagead + i) != (*(p + i))) break;
if (i >= n) return 0;
}
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -