Files

255 lines
7.8 KiB
C

/**
* @file stc8h.h
* @brief STC8H 系列单片机寄存器定义 (SDCC 风格)
* 适配 STC8H1K08 系列。
* 寄存器地址来源:STC8H 系列技术参考手册 9.1/9.9 节 SFR 映射图
*
* 使用方法:
* #include "stc8h.h"
* P3 = 0x01; // 直接 SFR 访问
* P3 |= 0x02;
* __critical { ... } // 关键段
*/
#ifndef __STC8H_H
#define __STC8H_H
/* ─────────────── 8051 基础 SFR ─────────────── */
__sfr __at (0x80) P0;
__sfr __at (0x90) P1;
__sfr __at (0xA0) P2;
__sfr __at (0xB0) P3;
__sfr __at (0xC0) P4;
__sfr __at (0xC8) P5;
__sfr __at (0x81) SP;
__sfr __at (0x82) DPL;
__sfr __at (0x83) DPH;
__sfr __at (0x87) PCON;
__sfr __at (0xE0) ACC;
__sfr __at (0xF0) B;
__sfr __at (0xD0) PSW;
/* ─────────────── 端口模式配置 ─────────────── */
__sfr __at (0x93) P0M1;
__sfr __at (0x94) P0M0;
__sfr __at (0x91) P1M1;
__sfr __at (0x92) P1M0;
__sfr __at (0x95) P2M1;
__sfr __at (0x96) P2M0;
__sfr __at (0xB1) P3M1;
__sfr __at (0xB2) P3M0;
__sfr __at (0xB3) P4M1;
__sfr __at (0xB4) P4M0;
__sfr __at (0xC9) P5M1;
__sfr __at (0xCA) P5M0;
/* 端口上拉 / 速度 / 数字输入使能寄存器 (XFR) */
__sfr __at (0xBA) P_SW2; /* bit7 = 1 使能 XFR 访问 */
#define P0PU_XDATA 0xFE10
#define P1PU_XDATA 0xFE11
#define P2PU_XDATA 0xFE12
#define P3PU_XDATA 0xFE13
#define P5PU_XDATA 0xFE15
#define P0SR_XDATA 0xFE20
#define P1SR_XDATA 0xFE21
#define P2SR_XDATA 0xFE22
#define P3SR_XDATA 0xFE23
#define P5SR_XDATA 0xFE25
#define P0DR_XDATA 0xFE28
#define P1DR_XDATA 0xFE29
#define P2DR_XDATA 0xFE2A
#define P3DR_XDATA 0xFE2B
#define P5DR_XDATA 0xFE2D
#define P0IE_XDATA 0xFE30
#define P1IE_XDATA 0xFE31
/* ─────────────── 定时器 0/1 ─────────────── */
__sfr __at (0x88) TCON;
__sfr __at (0x89) TMOD;
__sfr __at (0x8A) TL0;
__sfr __at (0x8B) TL1;
__sfr __at (0x8C) TH0;
__sfr __at (0x8D) TH1;
__sfr __at (0x8E) AUXR;
__sfr __at (0x8F) INTCLKO;
/* 定时器 2/3/4 */
__sfr __at (0xD6) T2H;
__sfr __at (0xD7) T2L;
__sfr __at (0xD4) T3H;
__sfr __at (0xD5) T3L;
__sfr __at (0xD2) T4H;
__sfr __at (0xD3) T4L;
__sfr __at (0xD1) T4T3M;
__sfr __at (0xFEA1) TM2PS_X;
__sfr __at (0xFEA2) TM3PS_X;
__sfr __at (0xFEA3) TM4PS_X;
/* TCON 位 (SDCC 风格) - 位地址 = 字节地址 + 位号 */
__sbit __at (0x8D) TF0; /* TCON.5 = 0x88 + 5 = 0x8D */
__sbit __at (0x8C) TR0; /* TCON.4 = 0x88 + 4 = 0x8C */
__sbit __at (0x89) IE0; /* TCON.1 */
__sbit __at (0x88) IT0; /* TCON.0 */
__sbit __at (0x8F) TF1; /* TCON.7 */
__sbit __at (0x8E) TR1; /* TCON.6 */
/* AUXR 位 */
#define S1ST2 0x10 /* UART1 波特率发生器选择: 0=T1, 1=T2 */
#define T2R 0x10 /* AUXR.4: T2 运行控制 */
#define T2_CT 0x04
#define T2x12 0x04 /* T2 时钟 1T 模式 */
#define S1SMOD 0x02 /* UART1 波特率加倍 */
/* ─────────────── UART1 ─────────────── */
__sfr __at (0x98) SCON;
__sfr __at (0x99) SBUF;
__sfr __at (0x9A) S2CON;
__sfr __at (0x9B) S2BUF;
__sfr __at (0xA9) SADDR;
__sfr __at (0xB9) SADEN;
__sfr __at (0xA2) P_SW1; /* UART1/SPI 端口切换 */
__sfr __at (0x9C) BRT; /* 独立波特率发生器 */
/* SCON 位 */
__sbit __at (0x99) TI; /* SCON.1 = 0x98 + 1 = 0x99 */
__sbit __at (0x98) RI; /* SCON.0 = 0x98 */
__sbit __at (0x9C) REN; /* SCON.4 = 0x98 + 4 = 0x9C */
/* IE / 中断 */
__sfr __at (0xA8) IE;
__sfr __at (0xAF) IE2;
__sfr __at (0xB8) IP;
__sfr __at (0xB6) IP2;
__sfr __at (0xB7) IP2H;
__sbit __at (0xAF) EA; /* IE.7 = 0xA8 + 7 = 0xAF */
__sbit __at (0xAC) ES; /* IE.4 */
__sbit __at (0xA9) ET0; /* IE.1 */
__sbit __at (0xAB) ET1; /* IE.3 */
__sbit __at (0xAD) EADC; /* IE.5 = 0xA8 + 5 = 0xAD */
/* ─────────────── SPI ─────────────── */
__sfr __at (0xCD) SPSTAT;
__sfr __at (0xCE) SPCTL;
__sfr __at (0xCF) SPDAT;
#define SPEN 0x40
#define MSTR 0x10
#define CPOL 0x08
#define CPHA 0x04
#define SPR1 0x01
#define SPR0 0x00
#define SSIG 0x80
#define SPIF 0x80
#define WCOL 0x40
/* ─────────────── ADC ─────────────── */
__sfr __at (0xBC) ADC_CONTR;
__sfr __at (0xBD) ADC_RES;
__sfr __at (0xBE) ADC_RESL;
__sfr __at (0xDE) ADCCFG;
__sfr __at (0xFEA8) ADCTIM_X;
/* ADC_CONTR 位 */
#define ADC_POWER 0x80
#define ADC_START 0x40
#define ADC_FLAG 0x20
#define ADC_CHS_MASK 0x0F
/* ─────────────── PCA ─────────────── */
__sfr __at (0xD8) CCON;
__sfr __at (0xD9) CMOD;
__sfr __at (0xDA) CCAPM0;
__sfr __at (0xDB) CCAPM1;
__sfr __at (0xDC) CCAPM2;
__sfr __at (0xDD) CCAPM3;
__sfr __at (0xEA) CCAP0L;
__sfr __at (0xEB) CCAP1L;
__sfr __at (0xEC) CCAP2L;
__sfr __at (0xED) CCAP3L;
__sfr __at (0xF2) PCA_PWM0;
__sfr __at (0xF3) PCA_PWM1;
__sfr __at (0xF4) PCA_PWM2;
__sfr __at (0xF5) PCA_PWM3;
/* ─────────────── IAP (用于模拟 EEPROM) ─────────────── */
__sfr __at (0xC1) WDT_CONTR;
__sfr __at (0xC2) IAP_DATA;
__sfr __at (0xC3) IAP_ADDRH;
__sfr __at (0xC4) IAP_ADDRL;
__sfr __at (0xC5) IAP_CMD;
__sfr __at (0xC6) IAP_TRIG;
__sfr __at (0xC7) IAP_CONTR;
__sfr __at (0xF7) IAP_TPS;
#define IAP_CMD_IDLE 0
#define IAP_CMD_READ 1
#define IAP_CMD_WRITE 2
#define IAP_CMD_ERASE 3
/* ─────────────── 时钟配置 XFR ─────────────── */
#define CLKSEL_X 0xFE00
#define CLKDIV_X 0xFE01
#define HIRCCR_X 0xFE02
#define IRC32KCR_X 0xFE04
#define IRCBAND 0x9D
__sfr __at (0x9D) IRCBAND_REG;
/* ─────────────── 比较器 / 其他 ─────────────── */
__sfr __at (0xAE) TA; /* 写 0xAA,0x55 解锁特殊寄存器 */
__sfr __at (0xE6) CMPCR1;
__sfr __at (0xE7) CMPCR2;
/* ─────────────── 中断向量号 (SDCC 用地址) ───────────────
* SDCC for 8051: __interrupt (addr) 直接写中断向量地址
*/
#define INT_ADDR_EXT0 0x0003
#define INT_ADDR_T0 0x000B
#define INT_ADDR_EXT1 0x0013
#define INT_ADDR_T1 0x001B
#define INT_ADDR_UART1 0x0023
#define INT_ADDR_ADC 0x002B
#define INT_ADDR_PCA 0x0033
#define INT_ADDR_UART2 0x003B
#define INT_ADDR_SPI 0x0043
#define INT_ADDR_EXT2 0x004B
#define INT_ADDR_EXT3 0x0053
#define INT_ADDR_T2 0x005B
#define INT_ADDR_CAN 0x0063
#define INT_ADDR_PWM 0x006B /* PWMA 中断 */
#define INT_ADDR_EXT4 0x0073
#define INT_ADDR_UART3 0x007B
#define INT_ADDR_UART4 0x0083
#define INT_ADDR_T3 0x008B
#define INT_ADDR_T4 0x0093
#define INT_ADDR_CMP 0x009B
#define INT_ADDR_I2C 0x00A3
#define INT_ADDR_USB 0x00AB
/* ─────────────── 8051 类型别名 ─────────────── */
typedef unsigned char uint8_t;
typedef signed char int8_t;
typedef unsigned short uint16_t;
typedef signed short int16_t;
typedef unsigned long uint32_t;
typedef signed long int32_t;
typedef __bit bool_t;
/* 内存区域 */
#define DATA_SEG __data
#define XDATA_SEG __xdata
#define IDATA_SEG __idata
#define PDATA_SEG __pdata
#define CODE_SEG __code
/* 常用宏 */
#define NOP() __asm__("nop")
#define DISABLE_INT() EA = 0
#define ENABLE_INT() EA = 1
#define CRITICAL(x) { EA = 0; x; EA = 1; }
/* XFR 访问宏: P_SW2 |= 0x80 后访问 0xFE00+ 地址 */
#define XFR_ADDR(addr) ((volatile uint8_t __xdata *)(addr))
#endif /* __STC8H_H */