📄 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 + -