flash.c

来自「实现avr单片机M128对flash的读写」· C语言 代码 · 共 72 行

C
72
字号
/* AVR FLASH.H   */

#ifndef   FLASH
#define   FLASH



#include <stdio.h>
#include <iom128V.h>
#define SPM_PAGESIZE 256
/*M128的一个Flash页为256字节(128字)*/


#define DATA_BUFFER_SIZE SPM_PAGESIZE
/*定义接收缓冲区长度*/

char data[DATA_BUFFER_SIZE]; 
long address=0;
 
/*擦除(code=0x03)和写入(code=0x05)一个Flash页*/

void boot_page_ew(long p_address,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,int data) 
{ 
    asm("mov r30,r16\n" 
        "mov r31,r17\n"             /*Z寄存器中为填冲页内地址*/
        "mov r0,r18\n" 
        "mov r1,r19\n");            /*R0R1中为一个指令字*/
    SPMCSR=0x01;
    asm("spm\n"); 
} 

/*等待一个Flash页的写完成 */
void wait_page_rw_ok(void) 
{ 
      while(SPMCSR&0x40)
     { 
         while(SPMCSR&0x01);
         SPMCSR=0x11;
         asm("spm\n"); 
     } 
}
 
/*更新一个Flash页的完整处理*/
void main()
{
void write_one_page(void) 
{ 
    int i; 
    boot_page_ew(address,0x03);                   /*擦除一个Flash页*/
    wait_page_rw_ok();                            /*等待擦除完成*/
    for(i=0;i    { 
        boot_page_fill(i, data[i]+(data[i+1]<<8)); 
    } 
    boot_page_ew(address,0x05);                  /*将缓冲页数据写入一个Flash页*/
    wait_page_rw_ok();                            /*等待写入完成*/
}         

}

#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?