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

📄 self_prog.c

📁 ATEMEL AVR128 BOOT程序
💻 C
字号:
#include "init.h"

/**********************************************************************
擦除(code=0x03)和写入(code=0x05)一个Flash页 
特别说明,MEGA128为128K容量,分为两个64K空间。
两个空间之间的选择通过RAMPZ的Bit0位来实现。
**********************************************************************/
void boot_page_ew(unsigned long pageAddr,unsigned 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,unsigned int data) {

	asm("mov r30,r16\n"
		"mov r31,r17\n"             		/*Z寄存器中为填冲页内地址*/
		"mov r0,r18\n"
		"mov r1,r19\n");            		/*R0R1中为一个指令字*/
	SPMCSR = (1 << SPMEN);					/*SPM使能位*/
	asm("spm\n");							/*执行SPM操作*/
}

/*等待一个Flash页的写完成 */
void wait_page_rw_ok(void) {

	while (SPMCSR & (1 << RWWSB)) {			/*等待忙信号*/
		while (SPMCSR & (1 << SPMEN));		/*等待EN信号完成*/
		SPMCSR = (1 << RWWSRE) | (1 << SPMEN);/*SPM读使能*/
		asm("spm\n");						/*执行SPM操作*/
		}
} 

/*写锁定位*/
void write_lock_bits (unsigned char val) {

	asm("mov r0,r16\n");
	SPMCSR=(1 << BLBSET) | (1 << SPMEN);
	asm("spm\n");
	while (SPMCSR & (1 << SPMEN));			/*等待EN信号完成*/
	SPMCSR = (1 << RWWSRE) | (1 << SPMEN);	/*SPM读使能*/
	asm("spm\n"); 
}

/**********************************************************************
functionName:unsigned char read_program_memory (unsigned int addr,unsigned char cmd)
description: 返回addr地址数据,以字节为单位
cmd:
0:读flashrom
1:读熔丝位或者锁定位 
addr=0x0001		锁定位
addr=0x0000		熔丝位低字节
addr=0x0003 	熔丝位高字节
**********************************************************************/
unsigned char read_program_memory(unsigned int addr,unsigned char cmd) {

	asm("mov r30,r16\n"
		"mov r31,r17\n");
	if (cmd) {
		SPMCSR=(1 << BLBSET) | (1 << SPMEN);
		}
	asm("lpm r0,z\n");
	return(R0);
}

⌨️ 快捷键说明

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