avr bootloader 源码

发布者:光明2599最新更新时间:2021-06-18 来源: eefocus关键字:avr  bootloader  源码 手机看文章 扫描二维码
随时随地手机看文章

assembly.s


  .text
  
SPMCR = 0x57   ;RWW区忙标志,读RWW区允许,允许写程序存储区

; void write_page (unsigned int adr, unsigned char function);
; bits 8:15 adr addresses the page...(must setup RAMPZ beforehand!!!)
_write_page::
    XCALL __WAIT_SPMEN__
    movw    r30, r16        ;move address to z pointer (R31 = ZH, R30 = ZL)
    STS     SPMCR, R18      ;argument 2 decides function
    SPM                     ;perform pagewrite
    RET

;-----------------------------------------

; void fill_temp_buffer (unsigned int data, unsigned int adr);
; bits 7:1 in adr addresses the word in the page... (2=first word, 4=second word etc..)
_fill_temp_buffer::
    XCALL __WAIT_SPMEN__
    movw    r30, r18        ;move adress to z pointer (R31=ZH R30=ZL)
    movw    r0, r16         ;move data to reg 0 and 1
    LDI     R19, 0x01
    STS     SPMCR, R19
    SPM                     ;Store program memory
    RET     
 
;----------------------------------------- 

;unsigned char read_flash(unsigned int add);
_read_flash::
    mov r31,r17
    mov r30,r16
    lpm r16,z
    clr r17
    ret 
  
;unsigned int read_program_memory (unsigned int adr ,unsigned char cmd);
_read_program_memory::
    movw    r30, r16        ;move adress to z pointer
    SBRC    R18, 0          ;read lockbits? (second argument = 0x09)
    STS     SPMCR, R18      ;if so, place second argument in SPMEN register
    LPM     r16, Z+
    LPM     r17, Z
    RET
 
;-----------------------------------------
       
_enableRWW::
 XCALL __WAIT_SPMEN__
    LDI R27,0x11
    STS SPMCR,R27
    SPM
    RET  
 
;-----------------------------------------          

__WAIT_SPMEN__:
    LDS     R27,SPMCR       ; load SPMCR to R27
    SBRC    R27,0           ; check SPMEN flag
    RJMP    __WAIT_SPMEN__  ; wait for SPMEN flag cleared       
    RET
 
;-----------------------------------------



assembly.h



void write_page (unsigned int adr, unsigned char function);
void fill_temp_buffer (unsigned int data,unsigned int adr);
unsigned int read_program_memory (unsigned int adr,unsigned char cmd);
//void write_lock_bits (unsigned char val);
void enableRWW(void);
unsigned char read_flash(unsigned int add);




main.c


/******************************************************************************
Atmega16 BootLoad程序 
日  期:2004年的最后一天

/*****************************************************************************/
#include
#include
#include "assembly.h"//包含汇编代码头文件

//×××××××××××××××××××××××××××××××××××××××××××××××××××××××××
//请根据目标板选择芯片型号
//#define  ChipType     Atmega8      
#define  ChipType     Atmega16      
//#define  ChipType     Atmega32      
//#define  ChipType     Atmega64      
//#define  ChipType     Atmega128      
//#define  ChipType     Atmega8535      
//*********************************************************
//选择BOOT区大小
//#define  BootSize     'a'    //128  
//#define  BootSize     'b'    //256
//#define  BootSize       'c'    //512
//#define  BootSize     'd'    //1024
//#define  BootSize     'e'    //2048(不知道是否有2048字BOOT空间的芯片)
//选择BootLoad版本号
//#define  BootVer        'f'    //1.0版本
//#define  BootVer      'g'    //1.1版本
//#define  BootVer      'h'    //1.2版本
//#define  BootVer      'i'    //1.3版本
//#define  BootVer      'j'    //1.4版本
//#define  BootVer      'k'    //1.5版本
//#define  BootVer      'l'    //1.6版本
//#define  BootVer      'm'    //1.7版本
//#define  BootVer      'n'    //1.8版本
//#define  BootVer      'o'    //1.9版本
//#define  BootVer      'p'    //2.0版本(应该是最终版本了)
//**********************************************************

#define  Atmega16       0x31

//*****************************************************************************
//#define  InteClk                 //是否使用内部时钟
//#define  OscAddress     0x1fff   //时钟校准值存储地址
//#define  OscAddress     0x3fff   //时钟校准值存储地址
//*****************************************************************************
//8时钟下的波特率设置
//#define  BAU  103    //4800
//#define  BAU  51       //9600
//#define  BAU  34     //14400
//#define  BAU  25     //19200

//16M时钟下的波特率设置
#define  BAU  103   //9600

//使用的EEPROM
#define EEPROM_UPDATE_0X00_0X06 7
#define EEPROM_REPEAT_ENTER_BOOT_TIMES 0x07
#define EEPROM_DEBUG0 0x08
#define EEPROM_DEBUG1 0x09
#define ERASE_FLASH_PAGE_NUM 112//擦除页数


const unsigned char ucEepromWriteSuccess[EEPROM_UPDATE_0X00_0X06]={"success"};
const unsigned char ucEepromWriteUpdates[EEPROM_UPDATE_0X00_0X06]={"updates"};


//*****************************************************************************

#if (ChipType == Atmega16)
  #include  "iom16v.h"
  #define   PageByte     128   
  #define   AddressShift   7
#endif

void FlashLoad(void);
unsigned char GetPageNumber(void);
void ExecCode(void);
char GetOnePageData(void);
unsigned char WriteFlash(void);
char CheckFlash(void);
void SendChar(unsigned char c);
void delay(void);                 //1ms延时函数
//unsigned char RecChar(void);
static unsigned int GetCRC16Code(unsigned char* pCalcBuf, unsigned char ucSize);


//unsigned char PageBuffer[PageByte+2];
unsigned int  PageAddress=0;

#define BUFLEN 200
char uRxData;
char ucRecvBuf[BUFLEN];
unsigned int uiBufLen=0;
unsigned int uiStartBufDateLen=0;


//读EEPROM函数
static void EEPROM_Write(unsigned int Add,unsigned char Data)
{
 if(Add<512) //如果地址大于512,无效
 {
  while(EECR&BIT(EEWE)); //查询上一次EEPROM写操作是否完成
  EEAR=Add;    //写入地址
  EEDR=Data;    //写入数据
  EECR|=BIT(EEMWE);  //EEPROM写主机使能:准备
  EECR|=BIT(EEWE);  //EEPROM写使能:写入
 }
}

//读EEPROM函数
static unsigned char EEPROM_Read(unsigned int Add)
{
 unsigned char Temp=0;
 if(Add<512)  //如果地址大于512,读取0值
 {
  while(EECR&BIT(EEWE)); //查询上一次EEPROM写操作是否完成
  EEAR=Add;    //写入地址
  EECR|=BIT(EERE);  //EEPROM读使能:读出
  Temp=EEDR;    //读取数据
 } 
 return Temp;    //返回数据
}

#if 0
void PrintfStringToArm(char * str)
{
 int i=0;
 for(i=0;i {
  SendChar(*(str+i));
 }
}
#endif


/*****************************************************************************/
//Flash编程                            
/*****************************************************************************/
void FlashLoad(void)
{
 unsigned int i;

 unsigned char ucPageDateSuccessFlag=0;
 SendChar('!');
 while (1)
 {
  if(!GetPageNumber())//获取页地址
  {
   return;
  }
  else
  {
   if (PageAddress == 0xff80)//写结束
   {
    SendChar('$');
    CLI();
    
    for(i=0;i    {
     EEPROM_Write(i,ucEepromWriteSuccess[i]);
    }
    SEI();

[1] [2] [3]
关键字:avr  bootloader  源码 引用地址:avr bootloader 源码

上一篇:基于AVR单片机Atmega16的ADC采集数码管显示仿真程序
下一篇:AVR系列之键盘扫描

推荐阅读最新更新时间:2024-11-09 21:32

AVR单片机nrf24l01驱动程序
avr单片机源程序如下: //ICC-AVR application builder : 2018/6/1 21:34:07 // Target : M16 // Crystal: 8.0000Mhz #include iom16v.h #include macros.h #include SPI.h #include key.h #define uint unsigned int #define uchar unsigned char #define IRQ 0 //输入 #define MISO 1 //输入 #define MOSI 2 //输出 #define SCK 3 //输出 #defin
[单片机]
avr单片机eeprom初始化配置及说明
ATmega16 包含 512 字节的 EEPROM 数据存储器。它是作为一个独立的数据空间而存在的,可以按字节读写。 EEPROM 的寿命至少为 100,000 次擦除周期。 EEPROM 的访问 由地址寄存器、数据寄存器和控制寄存器决定。 /* EEPROM 数据存储器 EEPROM 地址寄存器(EEARH 和 EEARL) bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 EEAR7 EEAR6 EEAR5 EEAR4 EEAR3 EEAR2 EEAR1 EEAR0 Res: 保留 保留位,读操作返回值为零。 EEAR8..0
[单片机]
马潮老师关于正确配置AVR熔丝位的建议
对AVR熔丝位的配置是比较细致的工作,用户往往忽视其重要性,或感到不易掌握。下面给出对AVR熔丝位的配置操作时的一些要点和需要注意的相关事项。有关ATmega128熔丝位的具体定义和功能请查看本书相关章节,在附录中将给出一个完整的汇总表。 (1)在AVR的器件手册中,对熔丝位使用已编程(Programmed)和未编程(Unprogrammed)定义熔丝位的状态,“Unprogrammed”表示熔丝状态为“1”(禁止);“Programmed”表示熔丝状态为“0”(允许)。因此,配置熔丝位的过程实际上是“配置熔丝位成为未编程状态“1”或成为已编程状态“0””。 (2)在使用通过选择打钩“√”方式确定熔丝位状态值的编程工具软件时,
[单片机]
单片机CRC源码
1 /****************************************************************************************** 2 * 函数功能:CRC校验用函数 3 * 函数输入:puchMsgg是要进行CRC校验的消息,usDataLen是消息中字节数 4 * 函数输出:计算出来的CRC校验码。 5 ****************************************************************8*************************/ 6 uint16_t CRC16(uint8_t *puchMsgg,uint
[单片机]
Stm32 Bootloader整理
一. 基本概念 1.IAP IAP是In Applica ti on Programming的首字母缩写,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的 通信 口对产品中的 固件 程序进行更新升级。 通常在用户需要实现IAP功能时,即用户程序运行中作自身的更新操作,需要在设计固件程序时编写两个项目代码,第一个项目程序不执行正常的功能操作,而只是通过某种通信管道(如USB、 USART )接收程序或数据,执行对第二部分代码的更新;第二个项目代码才是真正的功能代码。 2.Bootloader 在上述IAP的概念中,bootloader就是其第一个项目程序。b
[单片机]
基于AVR单片机的博物馆防盗保护器系统设计
引言 博物馆内的藏品常常受到人为盗窃的威胁,周围环境的变化也会对其造成破坏,因此需要极为可靠的防盗系统及完善的空调系统,本设计的目的就是实现对馆藏品的智能化防盗和保护。博物馆关闭时便可将此防盗保护器启动,通过CMOS传感器对博物馆进行扫描,图像信号在微处理器中进行处理筛选压缩,并与被监控信号(人形信号)进行比较,一旦出现类人形信号,便将数据进行存储(这样可以大大节省存储空间),并进行报警。被监控信号可以增加,可以是其它任何可能对馆藏品造成损害的动物,只不过在进行筛选比较处理时要复杂一些。另外,通过温度传感器对温度信号进行采集监控,通过控制馆内空调来达到调节温度的效果,以避免馆内文物因为温度的变化而造成损害。 图1 系统功能框
[单片机]
基于<font color='red'>AVR</font>单片机的博物馆防盗保护器系统设计
AVR驱动3.2英寸tft LCD(ssd1289)
管脚连接 D0 PA0 D5 PA5 D10 PD2 D15 PD7 D1 PA1 D6 PA6 D11 PD3 CS PB0 D2 PA2 D7 PA7 D12 PD4 RS PB1 D3 PA3 D8 PD0 D13 PD5 WR PB2 D4 PA4 D9 PD1 D14 PD6 RD PB3 RESET PB4 #inc
[单片机]
一种采用AVR单片机的天然气发动机系统设计
1 燃料供给系统   对原机的改造主要是燃料供应及喷射系统的改造,用一套完整的天然气供给系统和电控系统来实现改造目的。所使用的天然气是由高压气瓶(CNG)提供的压缩天然气, 出口压力达到20 MPa。图1所示为供气系统示意图。该设计实现了高压天然气的可靠存储和压力转换,并可对供气压力进行实时监测 。 图1 CNG供气系统示意图   2 电控单元   电控单元选用Atmel公司的AVR单片机,利用单片机C语言进行程序开发,并且采用了多片式ECU设计。   (1) 多片式ECU 图2 多片式ECU结构简图   多片式ECU是指在一个电控单元ECU中使用多个单片机(MCU)。各个MCU分别承担不同的工作内
[单片机]
一种采用<font color='red'>AVR</font>单片机的天然气发动机系统设计
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved