255 lines
7.8 KiB
C
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 */ |