📄 bootldr.h
字号:
#ifndef _BOOTLDR_H_
#define _BOOTLDR_H_ 1
#include <avr/io.h>
#include <avr/wdt.h>
#include <avr/boot.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#include <avr/SIGNAL.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 /BUFFER__SIZE * BUFFER__SIZE) != 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 * 10) / (16UL * BAUDRATE) - 5) / 10)
//检查波特率误差
//下面的定义在不同的C编译器之间可能会有差异
#define FreqTemp (16UL * BAUDRATE * (((F_CPU * 10) / (16 * BAUDRATE) + 5)/ 10))
#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 URSELBIT(No) CONCAT(URSEL, 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位
#if defined(URSEL) || defined(URSEL0)
#define USEURSEL URSELBIT(COMPORTNo)
#else
#define USEURSEL 0
#endif
//定义串口0相关寄存器
#if !defined(UDR0)
#define UBRR0H UBRRH
#define UBRR0L UBRRL
#define UCSR0A UCSRA
#define UCSR0B UCSRB
#define UCSR0C UCSRC
#define UDR0 UDR
#define TXC0 TXC
#define RXC0 RXC
#define RXEN0 RXEN
#define TXEN0 TXEN
#define UCSZ01 UCSZ1
#define UCSZ00 UCSZ0
#define URSEL0 URSEL
#endif
//串口初始化
#define ComInit() \
{ \
UCSRAREG(COMPORTNo) = 0; \
UCSR0B = _BV(RXCIE)|_BV(TXEN)|_BV(RXEN); \
UCSRCREG(COMPORTNo) = (1 << USEURSEL)|(1 << UCSZBIT(COMPORTNo, 1))|(1 << UCSZBIT(COMPORTNo, 0));\
UBRRHREG(COMPORTNo) = BAUDREG/256; \
UBRRLREG(COMPORTNo) = BAUDREG%256; \
}
//定义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 0x43 //'C'
#endif
//End of file: bootldr.h
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -