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

📄 flash.c

📁 实现avr单片机M128对flash的读写
💻 C
字号:
/* 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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -