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

📄 bootldr.h

📁 AVR 通用 Bootloader 使用说明 *支持多种型号的AVR单片机 *支持多串口的AVR单片机 *支持RS232/RS485/RS422模式 *支持多种通信波特率和时钟频率 *自动计
💻 H
字号:
/*

                           e Y8b    Y8b Y88888P888 88e                       
                          d8b Y8b    Y8b Y888P 888 888D                      
                         d888b Y8b    Y8b Y8P  888 88"                       
                        d8WuHan888b    Y8b Y   888 b,                        
                       d8888888b Y8b    Y8P    888 88b,                      
             e88'Y88                                                         
            d888  'Y e88 88e 888 888 8e 888 888 8e  e88 88e 888 8e           
           C8888    d888 888b888 888 88b888 888 88bd888 888b888 88b          
            Y888  ,dY888 8Shao88 zi8 8yang8 888 888Y888 888P888 888          
             "88,d88 "88 88" 888 888 888888 888 888 "88 88" 888 888          
 888 88b,                    d8  888                         888             
 888 88P' e88 88e  e88 88e  d88  888     e88 88e  ,"Y88b e88 888 ,e e, 888,8,
 888 8K  d888 888bd888 888bd20078888    d888 888b"8" 888d888 888d88 88b888 " 
 888 88b,Y888 888PY888 888P 888  888  ,dY888 888P,ee 888Y888 888888   ,888   
 888 88P' "88 88"  "88 88"  888  888,d88 "88 88" "88 888 "88 888 "YeeP"888   


  Project:       AVR Common BootLoader
                 AVR 通用 Bootloader
  File:          bootldr.h
                 必要的宏定义和参数声明
  Version:       1.0

  Compiler:      GCC 4.1.1 + AVR Studio 4.13.528

  Author:        Shaoziyang
                 Shaoziyang@126.com
                 http://shaoziyang.bloger.com.cn
  Date:          2007.3

  Modify:        Add your modify log here

  See readme.txt to get more information.

*/

#ifndef _BOOTLDR_H_
#define _BOOTLDR_H_        1

#include <avr/io.h>
#include <avr/wdt.h>
#include <avr/boot.h>
#include <avr/pgmspace.h>


//某些版本的头文件中没有包含此定义
#ifndef SPM_PAGESIZE
#error "Not define SPM_PAGESIZE, please define below or update your WinAVR"
//#define SPM_PAGESIZE       XXX
#endif

//某些版本的头文件中没有包含此定义
#ifndef FLASHEND
#error "Not define FLASHEND, please define below or update your WinAVR"
//#define FLASHEND           XXX
#endif

//两个缓冲区之间必须是倍数或约数关系
#if BUFFERSIZE >= SPM_PAGESIZE
#if (BUFFERSIZE / SPM_PAGESIZE * SPM_PAGESIZE) != BUFFERSIZE
#error "Result of (BUFFERSIZE / SPM_PAGESIZE) is not a Integer!"
#error "Please check and set 'BUFFERSIZE SPM_PAGESIZE' Macro again!"
#endif
#else
#if (SPM_PAGESIZE /BUFFERSIZE * BUFFERSIZE) != SPM_PAGESIZE
#error "Result of (BUFFERSIZE / SPM_PAGESIZE) is not a Integer!"
#error "Please check and set 'BUFFERSIZE SPM_PAGESIZE' Macro again!"
#endif
#endif

#define BAUDREG            ((unsigned int)(F_CPU / (16UL * BAUDRATE) - 1))

//检查波特率误差
//下面的定义在不同的C编译器之间可能会有差异
#define FreqTemp           (16UL * BAUDRATE * (F_CPU / (16 * BAUDRATE)))
#if ((FreqTemp * 50) > (51 * F_CPU) || (FreqTemp * 50) < (49 * F_CPU))
#error "BaudRate error > 2%! Please check BaudRate and F_CPU value."
#endif

#define True               1
#define False              0
#define TRUE               1
#define FALSE              0


//内部使用的宏定义
#define CONCAT(a, b)       a ## b
#define CONCAT3(a, b, c)   a ## b ## c

//端口以及位定义
#define PORTREG(No)        CONCAT(PORT, No)
#define PINREG(No)         CONCAT(PIN, No)
#define UDRREG(No)         CONCAT(UDR, No)
#define DDRREG(No)         CONCAT(DDR, No)
#define TXCBIT(No)         CONCAT(TXC, No)
#define RXCBIT(No)         CONCAT(RXC, No)
#define RXENBIT(No)        CONCAT(RXEN, No)
#define TXENBIT(No)        CONCAT(TXEN, No)

//串口初始化需要寄存器
#define UBRRHREG(No)       CONCAT3(UBRR, No, H)
#define UBRRLREG(No)       CONCAT3(UBRR, No, L)
#define UCSRAREG(No)       CONCAT3(UCSR, No, A)
#define UCSRBREG(No)       CONCAT3(UCSR, No, B)
#define UCSRCREG(No)       CONCAT3(UCSR, No, C)
#define UCSZBIT(No1, No2)  CONCAT3(UCSZ, No1, No2)

//部分AVR单片机设置串口时需要使用URSEL位
#ifdef URSEL
#define USEURSEL           (1 << URSEL)
#else
#define USEURSEL           0
#endif

//串口初始化
#define ComInit()                                                         \
        {                                                                 \
                           UBRRHREG(COMPORTNo) = BAUDREG/256;             \
                           UBRRLREG(COMPORTNo) = BAUDREG%256;             \
                           UCSRAREG(COMPORTNo) = 0;                       \
                           UCSRBREG(COMPORTNo) = (1 << RXENBIT(COMPORTNo))|(1 << TXENBIT(COMPORTNo)); \
                           UCSRCREG(COMPORTNo) = USEURSEL|(1 << UCSZBIT(COMPORTNo, 1))|(1 << UCSZBIT(COMPORTNo, 0));\
        }

//提示信息
#if VERBOSE
#if LEVELMODE
const char msg6[] = "升级模式.";
const char msg7[] = "正常启动.";
#else
//wait for update
const char msg1[] = "等待接收密码.";
#endif
//Timeout
const char msg2[] = "超时.";
//wait for file
const char msg3[] = "等待接收文件.";
//update success
const char msg4[] = "升级成功.";
//update terminal
const char msg5[] = "升级失败.";
#endif

//以下内容不要随便修改,除非你知道需要做什么和在做什么

//使LED输出状态取反
#define LEDAlt()           PORTREG(LEDPORT) ^= (1 << LEDPORTNo)

//使用定时器1:1024分频,CTC模式4,产生以毫秒为单位的时间
#define TimerInit()                                                       \
        {                                                                 \
                           OCR1A  = (unsigned int)(timeclk * (F_CPU  / (1024 * 1000.0f)));\
                           TCCR1A = 0;                                    \
                           TCCR1B = (1 << WGM12)|(1 << CS12)|(1 << CS10); \
        }

#ifdef TIFR
#define TIFRREG            TIFR
#else
#define TIFRREG            TIFR1
#endif

//定义Xmoden控制字符
#define XMODEM_NUL         0x00
#define XMODEM_SOH         0x01
#define XMODEM_STX         0x02
#define XMODEM_EOT         0x04
#define XMODEM_ACK         0x06
#define XMODEM_NAK         0x15
#define XMODEM_CAN         0x18
#define XMODEM_EOF         0x1A
#define XMODEM_RWC         'C'

#if RS485
#define RS485Enable()      PORTREG(RS485PORT) |= (1 << RS485TXEn)
#define RS485Disable()     PORTREG(RS485PORT) &= ~(1 << RS485TXEn)
#endif

#define UCSRAREG(No)       CONCAT3(UCSR, No, A)
#define DataInCom()        (UCSRAREG(COMPORTNo) & (1 << RXCBIT(COMPORTNo)))
#define ReadCom()          UDRREG(COMPORTNo)

#endif

//End of file: bootldr.h

⌨️ 快捷键说明

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