⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wflash.c

📁 在mega128中可编程使用片内FLASH
💻 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 + -