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