Files
RCU_C1P_Module/Peripheral/inc/ch564.h
caocong d2d8800788 feat:新建项目文件
BLV主机C1P模块
2025-12-06 13:49:01 +08:00

1866 lines
150 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/********************************** (C) COPYRIGHT *******************************
* File Name : ch564.h
* Author : WCH
* Version : V1.0.0
* Date : 2024/05/05
* Description : CH564 Device Peripheral Access Layer Header File.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#ifndef __CH564_H
#define __CH564_H
#ifdef __cplusplus
extern "C"
{
#endif
#define HSE_VALUE ((uint32_t)25000000) /* Value of the External oscillator in Hz */
#define HSI_VALUE ((uint32_t)20000000) /* Value of the Internal oscillator in Hz */
/* HSE HSI and PLL stabilization time(us) */
#define HSE_STARTUP_TIME ((uint32_t)2500)
#define HSI_STARTUP_TIME ((uint32_t)12)
#define PLL_STARTUP_TIME ((uint32_t)35)
/* CH564 Standard Peripheral Library version number */
#define __CH564_STDPERIPH_VERSION_MAIN (0x01) /* [15:8] main version */
#define __CH564_STDPERIPH_VERSION_SUB (0x02) /* [7:0] sub version */
#define __CH564_STDPERIPH_VERSION ((__CH564_STDPERIPH_VERSION_MAIN << 8)\
| (__CH564_STDPERIPH_VERSION_SUB << 0))
/* ********************************************************************************************************************* */
/* Base types & constants */
#ifndef TRUE
#define TRUE 1
#define FALSE 0
#endif
#ifndef NULL
#define NULL 0
#endif
#ifndef VOID
#define VOID void
#endif
#ifndef CONST
#define CONST const
#endif
#ifndef BOOL
typedef unsigned char BOOL;
#endif
#ifndef BOOLEAN
typedef unsigned char BOOLEAN;
#endif
#ifndef CHAR
typedef char CHAR;
#endif
#ifndef INT8
typedef char INT8;
#endif
#ifndef INT16
typedef short INT16;
#endif
#ifndef INT32
typedef long INT32;
#endif
#ifndef UINT8
typedef unsigned char UINT8;
#endif
#ifndef UINT16
typedef unsigned short UINT16;
#endif
#ifndef UINT32
typedef unsigned long UINT32;
#endif
#ifndef UINT8V
typedef unsigned char volatile UINT8V;
#endif
#ifndef UINT16V
typedef unsigned short volatile UINT16V;
#endif
#ifndef UINT32V
typedef unsigned long volatile UINT32V;
#endif
#ifndef PVOID
typedef void *PVOID;
#endif
#ifndef PCHAR
typedef char *PCHAR;
#endif
#ifndef PCHAR
typedef const char *PCCHAR;
#endif
#ifndef PINT8
typedef char *PINT8;
#endif
#ifndef PINT16
typedef short *PINT16;
#endif
#ifndef PINT32
typedef long *PINT32;
#endif
#ifndef PUINT8
typedef unsigned char *PUINT8;
#endif
#ifndef PUINT16
typedef unsigned short *PUINT16;
#endif
#ifndef PUINT32
typedef unsigned long *PUINT32;
#endif
#ifndef PUINT8V
typedef volatile unsigned char *PUINT8V;
#endif
#ifndef PUINT16V
typedef volatile unsigned short *PUINT16V;
#endif
#ifndef PUINT32V
typedef volatile unsigned long *PUINT32V;
#endif
/* ********************************************************************************************************************* */
/* Base macros */
#ifndef min
#define min(a,b) (((a) < (b)) ? (a) : (b))
#endif
#ifndef max
#define max(a,b) (((a) > (b)) ? (a) : (b))
#endif
#if DEBUG
#define PRINT(X...) printf(X)
#else
#define PRINT(X...)
#endif
/* Calculate the byte offset of a field in a structure of type */
#define FIELD_OFFSET(Type, Field) ((UINT16)&(((Type *)0)->Field))
/* Calculate the size of a field in a structure of type */
#define FIELD_SIZE(Type, Field) (sizeof(((Type *)0)->Field))
/* An expression that yields the type of a field in a struct */
#define FIELD_TYPE(Type, Field) (((Type *)0)->Field)
/* Return the number of elements in a statically sized array */
#define NUMBER_OF(Array) (sizeof(Array)/sizeof((Array)[0]))
#define NUMBER_OF_FIELD(Type, Field) (NUMBER_OF(FIELD_TYPE(Type, Field)))
/* Interrupt Number Definition, according to the selected device */
typedef enum IRQn
{
/****** RISC-V Processor Exceptions Numbers *******************************************************/
NonMaskableInt_IRQn = 2, /* 2 Non Maskable Interrupt */
HardFault_IRQn = 3, /* 3 HardFault Interrupt */
Ecall_M_Mode_IRQn = 5, /* 5 Ecall M Mode Interrupt */
Ecall_U_Mode_IRQn = 8, /* 8 Ecall U Mode Interrupt */
Break_Point_IRQn = 9, /* 9 Break Point Interrupt */
SysTick_IRQn = 12, /* 12 System timer Interrupt */
Software_IRQn = 14, /* 14 software Interrupt */
/****** RISC-V specific Interrupt Numbers *********************************************************/
IIC_EV_IRQn = 16, /* 16 IIC Event Interrupt */
IIC_ER_IRQn = 17, /* 17 IIC Error Interrupt */
ETH_IRQn = 18, /* 18 ETH Global Interrupt */
USBPD_IRQn = 19, /* 19 USBPD Global Interrupt */
TIM0_IRQn = 20, /* 20 TIM0 Global Interrupt */
TIM1_IRQn = 21, /* 21 TIM1 Global Interrupt */
TIM2_IRQn = 22, /* 22 TIM2 Global Interrupt */
TIM3_IRQn = 23, /* 23 TIM3 Global Interrupt */
SPI0_IRQn = 24, /* 24 SPI0 Global Interrupt */
SPI1_IRQn = 25, /* 25 SPI1 Global Interrupt */
UART0_IRQn = 26, /* 26 UART0 Global Interrupt */
UART1_IRQn = 27, /* 27 UART1 Global Interrupt */
PA_IRQn = 28, /* 28 PA External Interrupt */
PB_IRQn = 29, /* 29 PB External Interrupt */
PD_IRQn = 30, /* 30 PC External Interrupt */
ADC_IRQn = 31, /* 31 ADC Global Interrupt */
SLV_IRQn = 32, /* 32 Slave Parallel Port Global Interrupt */
USBHS_HOST_IRQn = 33, /* 33 USBHOST Global Interrupt */
USBHS_DEV_IRQn = 34, /* 34 USBDEVICE Global Interrupt */
UART2_IRQn = 35, /* 35 UART0 Global Interrupt */
UART3_IRQn = 36, /* 36 UART1 Global Interrupt */
ETHWakeUp_IRQn = 37, /* 37 ETH Wake up Interrupt */
USBHSWakeUp_IRQn = 38, /* 38 USBHS Wake up Interrupt */
USBPDWakeUp_IRQn = 39, /* 39 USBPD Wake up Interrupt */
} IRQn_Type;
#include <stdint.h>
#include "core_riscv.h"
#include "system_ch564.h"
/* Reset and Clock Control */
typedef struct
{
__IO uint8_t SAFE_ACCESS_SIG;
uint8_t RESERVED0;
__IO uint8_t SAFE_ACCESS_ID;
__IO uint8_t WDOG_CLEAR;
__IO uint8_t GLOB_MEM_CFG;
__IO uint8_t GLOB_LOCK_PORT;
__IO uint8_t GLOB_RST_CFG;
__IO uint8_t GLOB_RESET_KEEP;
uint8_t RESERVED1;
__IO uint8_t PLL_OUT_DIV;
uint16_t RESERVED2;
__IO uint8_t SLP_CLK_OFF0;
__IO uint8_t SLP_CLK_OFF1;
__IO uint8_t SLP_WAKE_CTRL;
__IO uint8_t SLP_CTRL_PLL;
} RCC_Typedef;
/* General Purpose Input Output */
typedef struct
{
__IO uint32_t DIR;
__IO uint32_t PIN;
__IO uint32_t OUT;
__IO uint32_t CLR;
__IO uint32_t PU;
__IO uint32_t PD;
} GPIO_Typedef;
/* Alternate Function IO */
typedef struct
{
__IO uint32_t PCFR1;
__IO uint32_t RESERVED1[7];
__IO uint32_t PCFR2;
} AFIO_Typedef;
/* External Interrupts */
typedef struct
{
__IO uint32_t STATUS;
__IO uint32_t ENABLE;
__IO uint32_t MODE;
__IO uint32_t POLAR;
} EXTI_Typedef;
/* Timer */
typedef struct
{
__IO uint8_t CTRL_MOD;
__IO uint8_t CTRL_DMA;
__IO uint8_t INTER_EN;
uint8_t RESERVED0[3];
__IO uint8_t INT_FLAG;
__IO uint8_t FIFO_COUNT;
__IO uint32_t COUNT;
__IO uint32_t CNT_END;
__IO uint32_t FIFO;
union
{
__IO uint32_t TMR0_DMA_NOW;
__IO uint32_t TMR1_DMA_NOW;
__IO uint32_t TMR2_DMA_NOW;
uint32_t RESERVED1;
};
union
{
__IO uint32_t TMR0_DMA_BEG;
__IO uint32_t TMR1_DMA_BEG;
__IO uint32_t TMR2_DMA_BEG;
uint32_t RESERVED2;
};
union
{
__IO uint32_t TMR0_DMA_END;
__IO uint32_t TMR1_DMA_END;
__IO uint32_t TMR2_DMA_END;
uint32_t RESERVED3;
};
} TIM_Typedef;
/* Analog-to-Digital Converter */
typedef struct
{
__IO uint8_t CTRL_MOD;
__IO uint8_t CTRL_DMA;
__IO uint8_t INTER_EN;
__IO uint8_t CLOCK_DIV;
__IO uint16_t DATA;
__IO uint8_t INT_FLAG;
__IO uint8_t FIFO_COUNT;
__IO uint32_t CTRL;
__IO uint16_t CMP_VALUE;
uint16_t RESERVED0;
__IO uint16_t FIFO;
uint16_t RESERVED1;
__IO uint32_t DMA_NOW;
__IO uint32_t DMA_BEG;
__IO uint32_t DMA_END;
} ADC_Typedef;
/* Universal Synchronous/Asynchronous Receiver/Transmitter */
typedef struct
{
union
{
__IO uint8_t RBR;
__IO uint8_t THR;
__IO uint8_t DLL;
__IO uint8_t ADR;
};
union
{
__IO uint8_t IER;
__IO uint8_t DLM;
};
union
{
__IO uint8_t IIR;
__IO uint8_t FCR;
};
__IO uint8_t LCR;
__IO uint8_t MCR;
__IO uint8_t LSR;
__IO uint8_t MSR;
__IO uint8_t DIV;
__IO uint8_t DMA_CTRL;
__IO uint8_t DMA_IF;
uint16_t RESERVED0;
__IO uint32_t DMA_WR_NOW_ADDR;
__IO uint32_t DMA_WR_START_ADDR;
__IO uint32_t DMA_WR_END_ADDR;
__IO uint32_t DMA_RD_NOW_ADDR;
__IO uint32_t DMA_RD_START_ADDR;
__IO uint32_t DMA_RD_END_ADDR;
} UART_Typedef;
/* Inter Integrated Circuit Interface */
typedef struct
{
__IO uint16_t CTLR1;
uint16_t RESERVED0;
__IO uint16_t CTLR2;
uint16_t RESERVED1;
__IO uint16_t OADDR1;
uint16_t RESERVED2;
__IO uint16_t OADDR2;
uint16_t RESERVED3;
__IO uint16_t DATAR;
uint16_t RESERVED4;
__IO uint16_t STAR1;
uint16_t RESERVED5;
__IO uint16_t STAR2;
uint16_t RESERVED6;
__IO uint16_t CKCFGR;
uint16_t RESERVED7;
__IO uint16_t RTR;
} I2C_Typedef;
/* Serial Peripheral Interface */
typedef struct
{
union
{
__IO uint32_t CONTROL_R32;
struct
{
__IO uint8_t CTRL_MOD;
__IO uint8_t CTRL_DMA;
__IO uint8_t INTER_EN;
union
{
__IO uint8_t CLOCK_DIV;
__IO uint8_t SLAVE_PRE;
};
};
};
union
{
__IO uint32_t STATUS_R32;
struct
{
__IO uint8_t BUFFER;
__IO uint8_t RUN_FLAG;
__IO uint8_t INT_FLAG;
__IO uint8_t FIFO_COUNT;
};
};
__IO uint8_t RESET_CMD;
__IO uint8_t BUSY;
uint16_t RESERVED0;
__IO uint16_t TOTAL_CNT;
uint16_t RESERVED1;
union
{
__IO uint32_t FIFO_R32;
struct
{
__IO uint8_t FIFO;
uint16_t RESERVED2;
__IO uint8_t FIFO_COUNT1;
};
};
union
{
__IO uint32_t SPI0_DMA_NOW;
uint32_t RESERVED3;
};
union
{
__IO uint32_t SPI0_DMA_BEG;
uint32_t RESERVED4;
};
union
{
__IO uint32_t SPI0_DMA_END;
uint32_t RESERVED5;
};
} SPI_Typedef;
/* passive parallel port (computing) */
typedef struct
{
__IO uint8_t CONFIG;
uint8_t RESERVED0;
__IO uint8_t DOUT;
__IO uint8_t STATUS;
uint8_t RESERVED1[42];
__IO uint8_t INT_FLAG_SLV;
__IO uint8_t INT_SLV_DIN;
uint8_t RESERVED2[316];
__IO uint8_t DMA_EN_SLV;
__IO uint8_t DMA_MODE_CTRL_SLV;
__IO uint8_t DMA_MODE_EN_SLV;
uint8_t RESERVED3;
__IO uint8_t DMA_INT_FLAG_SLV;
uint8_t RESERVED4[3];
__IO uint32_t WR_DMA_START_ADDR_SLV;
__IO uint32_t WR_DMA_END_ADDR_SLV;
uint32_t RESERVED5;
__IO uint32_t RD_DMA_START_ADDR_SLV;
__IO uint32_t RD_DMA_END_ADDR_SLV;
__IO uint32_t DMA_END_NOW_SLV;
__IO uint8_t DMA_CMD0_SLV;
__IO uint8_t DMA_CMD1_SLV;
uint16_t RESERVED6;
__IO uint8_t SLV_RESET_CMD;
__IO uint8_t SLV_BUSY;
uint8_t RESERVED7[10];
__IO uint8_t OTHER_DATA;
uint8_t RESERVED9[3];
__IO uint16_t DMA_DEC_LEN;
__IO uint16_t DMA_DEC_OFFSET;
} SLV_Typedef;
/* XBUS */
typedef struct
{
__IO uint8_t CONFIG;
uint8_t RESERVED0;
__IO uint8_t CYCLE;
__IO uint8_t SETUP_HOLD;
} XBUS_Typedef;
/* Ethernet MAC */
typedef struct
{
__IO uint32_t MACCR;
__IO uint32_t MACFFR;
__IO uint32_t MACHTHR;
__IO uint32_t MACHTLR;
__IO uint32_t MACMIIAR;
__IO uint32_t MACMIIDR;
__IO uint32_t MACFCR;
__IO uint32_t MACVLANTR;
uint32_t RESERVED0[2];
__IO uint32_t MACRWUFFR;
__IO uint32_t MACPMTCSR;
uint32_t RESERVED1[2];
__IO uint32_t MACSR;
__IO uint32_t MACIMR;
__IO uint32_t MACA0HR;
__IO uint32_t MACA0LR;
__IO uint32_t MACA1HR;
__IO uint32_t MACA1LR;
__IO uint32_t MACA2HR;
__IO uint32_t MACA2LR;
__IO uint32_t MACA3HR;
__IO uint32_t MACA3LR;
uint32_t RESERVED2[8];
__IO uint32_t PHY_CR;
__IO uint32_t CHKSUM_CR;
__IO uint32_t IP_PDR;
__IO uint32_t CHKSUM_HR;
__IO uint32_t CHKSUM_PR;
uint32_t RESERVED3[27];
__IO uint32_t MMCCR;
__IO uint32_t MMCRIR;
__IO uint32_t MMCTIR;
__IO uint32_t MMCRIMR;
__IO uint32_t MMCTIMR;
uint32_t RESERVED4[14];
__IO uint32_t MMCTGFSCCR;
__IO uint32_t MMCTGFMSCCR;
uint32_t RESERVED5[5];
__IO uint32_t MMCTGFCR;
uint32_t RESERVED6[10];
__IO uint32_t MMCRFCECR;
__IO uint32_t MMCRFAECR;
__IO uint32_t MMCRAFCR;
__IO uint32_t ETH_STATE;
uint32_t RESERVED7[8];
__IO uint32_t MMCRGUFCR;
uint32_t RESERVED8[334];
__IO uint32_t PTPTSCR;
__IO uint32_t PTPSSIR;
__IO uint32_t PTPTSHR;
__IO uint32_t PTPTSLR;
__IO uint32_t PTPTSHUR;
__IO uint32_t PTPTSLUR;
__IO uint32_t PTPTSAR;
__IO uint32_t PTPTTHR;
__IO uint32_t PTPTTLR;
uint32_t RESERVED9[567];
__IO uint32_t DMABMR;
__IO uint32_t DMATPDR;
__IO uint32_t DMARPDR;
__IO uint32_t DMARDLAR;
__IO uint32_t DMATDLAR;
__IO uint32_t DMASR;
__IO uint32_t DMAOMR;
__IO uint32_t DMAIER;
__IO uint32_t DMAMFBOCR;
uint32_t RESERVED10[9];
__IO uint32_t DMACHTDR;
__IO uint32_t DMACHRDR;
__IO uint32_t DMACHTBAR;
__IO uint32_t DMACHRBAR;
} ETH_Typedef;
/* USB Power Delivery */
typedef struct
{
union
{
__IO uint32_t CONFIG_R32;
struct
{
__IO uint16_t CONFIG;
__IO uint16_t BMC_CLK_CNT;
};
};
union
{
__IO uint32_t CONTROL_R32;
struct
{
union
{
__IO uint16_t CONTROL_R16;
struct
{
__IO uint8_t CONTROL;
__IO uint8_t TX_SEL;
};
};
__IO uint16_t BMC_TX_SZ;
};
};
union
{
__IO uint32_t STATUS_R32;
struct
{
union
{
__IO uint16_t STATUS_16;
struct
{
__IO uint8_t DATA_BUF;
__IO uint8_t STATUS;
};
};
__IO uint16_t BMC_BYTE_CNT;
};
};
union
{
__IO uint32_t PORT_R32;
struct
{
__IO uint16_t PORT_CC1;
__IO uint16_t PORT_CC2;
};
};
union
{
__IO uint32_t DMA_R32;
struct
{
__IO uint16_t DMA;
uint16_t RESERVED0;
};
};
} USBPD_Typedef;
/* USB High-Speed Device */
typedef struct
{
__IO uint8_t CONTROL;
__IO uint8_t BASE_MODE;
__IO uint8_t INT_EN;
__IO uint8_t DEV_AD;
__IO uint8_t WAKE_CR;
__IO uint8_t TEST_MODE;
__IO uint16_t LPM_DATA;
__IO uint8_t INT_FG;
__IO uint8_t INT_ST;
__IO uint8_t MIS_ST;
__IO uint8_t reserve1;
__IO uint16_t FRAME_NO;
__IO uint16_t USB_BUS;
__IO uint16_t UEP_TX_EN;
__IO uint16_t UEP_RX_EN;
__IO uint16_t UEP_T_TOG_AUTO;
__IO uint16_t UEP_R_TOG_AUTO;
__IO uint16_t UEP_T_BURST;
__IO uint16_t UEP_R_BURST;
__IO uint32_t UEP_AF_MODE;
__IO uint32_t UEP0_DMA;
__IO uint32_t UEP1_RX_DMA;
__IO uint32_t UEP2_RX_DMA;
__IO uint32_t UEP3_RX_DMA;
__IO uint32_t UEP4_RX_DMA;
__IO uint32_t UEP5_RX_DMA;
__IO uint32_t UEP6_RX_DMA;
__IO uint32_t UEP7_RX_DMA;
__IO uint32_t UEP1_TX_DMA;
__IO uint32_t UEP2_TX_DMA;
__IO uint32_t UEP3_TX_DMA;
__IO uint32_t UEP4_TX_DMA;
__IO uint32_t UEP5_TX_DMA;
__IO uint32_t UEP6_TX_DMA;
__IO uint32_t UEP7_TX_DMA;
__IO uint32_t UEP0_MAX_LEN;
__IO uint32_t UEP1_MAX_LEN;
__IO uint32_t UEP2_MAX_LEN;
__IO uint32_t UEP3_MAX_LEN;
__IO uint32_t UEP4_MAX_LEN;
__IO uint32_t UEP5_MAX_LEN;
__IO uint32_t UEP6_MAX_LEN;
__IO uint32_t UEP7_MAX_LEN;
__IO uint16_t UEP0_RX_LEN;
__IO uint16_t UEP0_RX_SIZE;
__IO uint16_t UEP1_RX_LEN;
__IO uint16_t UEP1_RX_SIZE;
__IO uint16_t UEP2_RX_LEN;
__IO uint16_t UEP2_RX_SIZE;
__IO uint16_t UEP3_RX_LEN;
__IO uint16_t UEP3_RX_SIZE;
__IO uint16_t UEP4_RX_LEN;
__IO uint16_t UEP4_RX_SIZE;
__IO uint16_t UEP5_RX_LEN;
__IO uint16_t UEP5_RX_SIZE;
__IO uint16_t UEP6_RX_LEN;
__IO uint16_t UEP6_RX_SIZE;
__IO uint16_t UEP7_RX_LEN;
__IO uint16_t UEP7_RX_SIZE;
__IO uint16_t UEP0_TX_LEN;
__IO uint8_t UEP0_TX_CTRL;
__IO uint8_t UEP0_RX_CTRL;
__IO uint16_t UEP1_TX_LEN;
__IO uint8_t UEP1_TX_CTRL;
__IO uint8_t UEP1_RX_CTRL;
__IO uint16_t UEP2_TX_LEN;
__IO uint8_t UEP2_TX_CTRL;
__IO uint8_t UEP2_RX_CTRL;
__IO uint16_t UEP3_TX_LEN;
__IO uint8_t UEP3_TX_CTRL;
__IO uint8_t UEP3_RX_CTRL;
__IO uint16_t UEP4_TX_LEN;
__IO uint8_t UEP4_TX_CTRL;
__IO uint8_t UEP4_RX_CTRL;
__IO uint16_t UEP5_TX_LEN;
__IO uint8_t UEP5_TX_CTRL;
__IO uint8_t UEP5_RX_CTRL;
__IO uint16_t UEP6_TX_LEN;
__IO uint8_t UEP6_TX_CTRL;
__IO uint8_t UEP6_RX_CTRL;
__IO uint16_t UEP7_TX_LEN;
__IO uint8_t UEP7_TX_CTRL;
__IO uint8_t UEP7_RX_CTRL;
__IO uint16_t UEP_TX_ISO;
__IO uint16_t UEP_RX_ISO;
} USBHSD_TypeDef;
typedef struct
{
__IO uint8_t CFG;
__IO uint8_t RESERVE1;
__IO uint8_t INT_EN;
__IO uint8_t DEV_AD;
__IO uint32_t CONTROL;
__IO uint8_t INT_FG;
__IO uint8_t INT_ST;
__IO uint8_t MIS_ST;
__IO uint8_t RESERVE2;
__IO uint32_t LPM;
__IO uint32_t SPLIT;
__IO uint32_t FRAME;
__IO uint32_t HOST_TX_LEN;
__IO uint32_t RX_LEN;
__IO uint32_t HOST_RX_MAX_LEN;
__IO uint32_t HOST_RX_DMA;
__IO uint32_t HOST_TX_DMA;
__IO uint32_t PORT_CTRL;
__IO uint8_t PORT_CFG;
__IO uint8_t RESERVE3;
__IO uint8_t PORT_INT_EN;
__IO uint8_t PORT_TEST_CT;
__IO uint16_t PORT_STATUS;
__IO uint8_t PORT_STATUS_CHG;
__IO uint32_t RESERVE4;
__IO uint32_t ROOT_BC_CR;
} USBHSH_TypeDef;
typedef struct
{
__IO uint32_t CAL_CR;
} USBHSI_TypeDef;
/* Expansion Registers */
typedef struct
{
__IO uint32_t CTLR0;
uint32_t RESERVED0[3];
__IO uint32_t CTLR1;
uint32_t RESERVED1[5];
__IO uint32_t CTLR2;
} EXTEN_Typedef;
/* Flash Registers */
typedef struct
{
__IO uint8_t DATA;
uint8_t RESERVED0;
__IO uint8_t CTRL;
__IO uint16_t FLASHA_KEY_BUF;
} FLASH_Typedef;
/* Debug Registers */
typedef struct
{
__IO uint32_t CR;
} DBG_Typedef;
#define RCC_BASE ((uint32_t)0x40400000)
#define GPIOA_BASE ((uint32_t)0x40400080)
#define GPIOB_BASE ((uint32_t)0x404000A0)
#define GPIOD_BASE ((uint32_t)0x404000C0)
#define AFIO_BASE ((uint32_t)0x40400140)
#define EXTIA_BASE ((uint32_t)0x40400050)
#define EXTIB_BASE ((uint32_t)0x40400060)
#define EXTID_BASE ((uint32_t)0x40400070)
#define TIM0_BASE ((uint32_t)0x40408000)
#define TIM1_BASE ((uint32_t)0x40408400)
#define TIM2_BASE ((uint32_t)0x40408800)
#define TIM3_BASE ((uint32_t)0x40408C00)
#define ADC_BASE ((uint32_t)0x4040A000)
#define UART0_BASE ((uint32_t)0x4040D000)
#define UART1_BASE ((uint32_t)0x4040D800)
#define UART2_BASE ((uint32_t)0x40409000)
#define UART3_BASE ((uint32_t)0x40409800)
#define I2C_BASE ((uint32_t)0x4040F000)
#define SPI0_BASE ((uint32_t)0x4040C000)
#define SPI1_BASE ((uint32_t)0x4040C800)
#define SLV_BASE ((uint32_t)0x40400014)
#define XBUS_BASE ((uint32_t)0x40400010)
#define ETH_BASE ((uint32_t)0x40406000)
#define USBPD_BASE ((uint32_t)0x4040E000)
#define USBHSD_BASE ((uint32_t)0x40404000)
#define USBHSH_BASE ((uint32_t)0x40404800)
#define USB_HSI_BASE ((uint32_t)0x40005000)
#define EXTEN_BASE ((uint32_t)0x40400144)
#define FLASH_BASE ((uint32_t)0x40400018)
#define RCC ((RCC_Typedef *)RCC_BASE)
#define GPIOA ((GPIO_Typedef *)GPIOA_BASE)
#define GPIOB ((GPIO_Typedef *)GPIOB_BASE)
#define GPIOD ((GPIO_Typedef *)GPIOD_BASE)
#define AFIO ((AFIO_Typedef *)AFIO_BASE)
#define EXTIA ((EXTI_Typedef *)EXTIA_BASE)
#define EXTIB ((EXTI_Typedef *)EXTIB_BASE)
#define EXTID ((EXTI_Typedef *)EXTID_BASE)
#define TIM0 ((TIM_Typedef *)TIM0_BASE)
#define TIM1 ((TIM_Typedef *)TIM1_BASE)
#define TIM2 ((TIM_Typedef *)TIM2_BASE)
#define TIM3 ((TIM_Typedef *)TIM3_BASE)
#define ADC ((ADC_Typedef *)ADC_BASE)
#define UART0 ((UART_Typedef *)UART0_BASE)
#define UART1 ((UART_Typedef *)UART1_BASE)
#define UART2 ((UART_Typedef *)UART2_BASE)
#define UART3 ((UART_Typedef *)UART3_BASE)
#define I2C ((I2C_Typedef *)I2C_BASE)
#define SPI0 ((SPI_Typedef *)SPI0_BASE)
#define SPI1 ((SPI_Typedef *)SPI1_BASE)
#define SLV ((SLV_Typedef *)SLV_BASE)
#define XBUS ((XBUS_Typedef *)XBUS_BASE)
#define ETH ((ETH_Typedef *)ETH_BASE)
#define USBPD ((USBPD_Typedef *)USBPD_BASE)
#define USBHSD ((USBHSD_TypeDef *) USBHSD_BASE)
#define USBHSH ((USBHSH_TypeDef *) USBHSH_BASE)
#define USB_HSI ((USBHSI_TypeDef *) USB_HSI_BASE)
#define EXTEN ((EXTEN_Typedef *)EXTEN_BASE)
#define FLASH ((FLASH_Typedef *)FLASH_BASE)
#define DBG ((DBG_Typedef *)DBG_BASE)
/* Standard Peripheral Library old definitions (maintained for legacy purpose) */
#define HSI_Value HSI_VALUE
#define HSE_Value HSE_VALUE
/******************************************************************************/
// Address Space
// CODE: 00000000H - 000FFFFFH, 1MB
// SFR: 00400000H - 0040FFFFH, 64KB
// DATA: 00808000H - 0081FFFFH, 96KB/64KB/32KB
// XBUS: 00C00000H - 00CFFFFFH, 1MB
// OTHER: 00E00000H - FFFFFFFFH, undefined
//
// SFR: 00400000H - 0040FFFFH, 64KB
// SYS: +1000H - 1FFFH, include base config, interrupt, GPIO, etc...
// USB: +4000H - 5FFFH
// ETH: +6000H - 7FFFH
// TMR0: +8000H - 83FFH
// TMR1: +8400H - 87FFH
// TMR2: +8800H - 8BFFH
// TMR3: +8C00H - 8FFFH
// ADC: +A000H - AFFFH
// SPI0: +C000H - C7FFH
// SPI1: +C800H - CFFFH
// UART0: +D000H - D7FFH
// UART1: +D800H - DFFFH
// Register Bit Attribute / Bit Access Type
// RF: Read only for Fixed value
// RO: Read Only (internal change)
// RZ: Read only with auto clear Zero
// WO: Write Only (read zero or different)
// WA: Write only under safe Accessing mode (read zero or different)
// WZ: Write only with auto clear Zero
// RW: Read / Write
// RWA: Read / Write under safe Accessing mode
// RW1: Read / Write 1 to Clear
/* Register name rule:
R32_* for 32 bits register (UINT32,ULONG)
R16_* for 16 bits register (UINT16,USHORT)
R8_* for 8 bits register (UINT8,UCHAR)
RB_* for bit or bit mask of 8 bit register
BA_* for base address point
Others for register address offset */
/* ********************************************************************************************************************* */
/* System: safe accessing register */
#define R32_SAFE_ACCESS (*((volatile uint32_t *)0x40400000)) // RW, safe accessing
#define R8_SAFE_ACCESS_SIG (*((volatile uint8_t *)0x40400000)) // WO, safe accessing sign register, must write 0x57 then 0xA8 to enter safe accessing mode
#define RB_SAFE_ACC_MODE 0x03 // RO, current safe accessing mode: 11=safe/unlocked (SAM), other=locked (00..01..10..11)
#define RB_SAFE_ACC_TIMER 0x70 // RO, safe accessing timer bit mask (16*clock number)
#define R8_SAFE_ACCESS_ID (*((volatile uint8_t *)0x40400002)) // RF, safe accessing ID register, always 0x01
#define R8_WDOG_CLEAR (*((volatile uint8_t *)0x40400003)) // WO, clear watch-dog
/* System: global configuration register */
#define R32_GLOBAL_CONFIG (*((volatile uint32_t *)0x40400004)) // RW, global configuration
#define R8_GLOB_MEM_CFG (*((volatile uint8_t *)0x40400004)) // RWA, global memory configuration, SAM and bit7:6 must write 1:0
#define RB_GLOB_MEM_CFG 0x03 // RWA, global memory config: 10=C96K/D32K, 11=C32K/D96K, 00/01=C64K/D64K
#define RB_GLOB_CFG_FLAG 0x80 // RO, global config flag
#define R8_GLOB_LOCK_PORT (*((volatile uint8_t *)0x40400005)) // RWA, lock port configuration, SAM and bit7:6 must write 0:0
#define RB_GLOB_LOCK_PA 0x01 // RWA, lock GPIO PA
#define RB_GLOB_LOCK_PB 0x02 // RWA, lock GPIO PB
#define RB_GLOB_LOCK_PD 0x08 // RWA, lock GPIO PD
#define R8_GLOB_RST_CFG (*((volatile uint8_t *)0x40400006)) // RWA, global reset configuration, SAM and bit7:6 must write 0:1
#define RB_GLOB_FORCE_RST 0x01 // WA/WZ, force global reset, high action, auto clear
#define RB_GLOB_WDOG_EN 0x02 // RWA, watch-dog enable
#define R8_GLOB_RESET_KEEP (*((volatile uint8_t *)0x40400007)) // RW, value keeper during global reset
/* System: PLL configuration register */
#define R32_PLL_CONFIG (*((volatile uint32_t *)0x40400008)) // RWA, PLL configuration, SAM
#define R8_PLL_OUT_DIV (*((volatile uint8_t *)0x40400009)) // RWA, PLL output clock divider, SAM and bit7:6 must write 1:0
#define RB_PLL_ETH_DIV 0x0F // RWA, PLL ethernet clock divider
#define RB_PLL_SYS_DIV 0x30 // RWA, PLL system clock divider
/* System: sleep control register */
#define R32_SLEEP_CONTROL (*((volatile uint32_t *)0x4040000C)) // RWA, sleep control, SAM
#define R8_SLP_CLK_OFF0 (*((volatile uint8_t *)0x4040000C)) // RWA, sleep clock off control byte 0, SAM
#define RB_SLP_CLK_TMR0 0x01 // RWA, sleep TMR0 clock
#define RB_SLP_CLK_TMR1 0x02 // RWA, sleep TMR1 clock
#define RB_SLP_CLK_TMR2 0x04 // RWA, sleep TMR2 clock
#define RB_SLP_CLK_TMR3 0x08 // RWA, sleep TMR3 clock
#define RB_SLP_CLK_SPI0 0x10 // RWA, sleep SPI0 clock
#define RB_SLP_CLK_SPI1 0x20 // RWA, sleep SPI1 clock
#define RB_SLP_CLK_UART0 0x40 // RWA, sleep UART0 clock
#define RB_SLP_CLK_UART1 0x80 // RWA, sleep UART1 clock
#define R8_SLP_CLK_OFF1 (*((volatile uint8_t *)0x4040000D)) // RWA, sleep clock off control byte 1, SAM
#define RB_SLP_CLK_UTMI 0x02 // RWA, sleep UTMI clock
#define RB_SLP_CLK_I2C 0x04 // RWA, sleep I2C clock
#define RB_SLP_CLK_USBPD 0x08 // RWA, sleep USBPD clock
#define RB_SLP_CLK_ADC 0x10 // RWA, sleep ADC clock
#define RB_SLP_CLK_GPIO 0x20 // RWA, sleep GPIO clock
#define RB_SLP_CLK_USB 0x40 // RWA, sleep USB clock
#define RB_SLP_CLK_ETH 0x80 // RWA, sleep Ethernet clock
#define R8_SLP_WAKE_CTRL (*((volatile uint8_t *)0x4040000E)) // RWA, wake control, SAM
#define RB_SLP_PA_WAKE 0x01 // RWAenable PA waking
#define RB_SLP_PB_WAKE 0x02 // RWAenable PB waking
#define RB_SLP_USBPD_WAKE 0x04 // RWAenable USBPD waking
#define RB_SLP_PD_WAKE 0x08 // RWAenable PD waking
#define RB_SLP_USB_WAKE 0x10 // RWAenable USB waking
#define RB_SLP_WOL_WAKE 0x40 // RWAenable Ethernet WOL waking
#define RB_SLP_ETH_PWR_DN 0x80 // RWAEthernet module power control
#define R8_SLP_CTRL_PLL (*((volatile uint8_t *)0x4040000F)) // WA, PLL sleep control, SAM and write 0x6A to sleep CPU or write 0x95 to sleep PLL
#define R8_SLP_STATUS (*((volatile uint8_t *)0x4040000F)) // RO, sleep status
#define RB_SLP_WOL_STATUS 0x01 // RO, current ethernet WOL status
#define RB_SLP_CLK_UART2 0x02 // RWA, sleep UART2 clock
#define RB_SLP_CLK_UART3 0x04 // RWA, sleep UART3 clock
/* System: external bus configuration register */
#define R32_EXT_BUS_CFG (*((volatile uint32_t *)0x40400010)) // RW, external bus configuration
#define R8_XBUS_CONFIG (*((volatile uint8_t *)0x40400010)) // RW, external bus configuration
#define RB_XBUS_ENABLE 0x01 // RWA, external bus enable
#define RB_XBUS_EN_32BIT 0x02 // RW, enable 16bit or 32bit external bus
#define RB_XBUS_ADDR_OE 0x0C // RWA, bus address output enable: 00=none,01=PA[5:0],10=PA[11:0],11=PA[19:0]
#define R8_XBUS_CYCLE (*((volatile uint8_t *)0x40400012)) // RW, external bus total cycle (clock number), only low 5 bit
#define R8_XBUS_SETUP_HOLD (*((volatile uint8_t *)0x40400013)) // RW, external bus setup and hold config
#define RB_XBUS_HOLD 0x1F // RW, external bus hold time bit mask (clock number)
#define RB_XBUS_SETUP 0x80 // RW, external bus setup time: 0=1 clock, 1=2 clocks
/* System: parallel slave configuration register */
#define R32_PARA_SLV_CFG (*((volatile uint32_t *)0x40400014)) // RW, parallel slave configuration
#define R8_SLV_CONFIG (*((volatile uint8_t *)0x40400014)) // RWA, parallel slave configuration, SAM
#define RB_SLV_ENABLE 0x01 // RWA, parallel slave enable
#define RB_SLV_IE_CMD 0x02 // RWA, enable interrupt for slave writing command event
#define RB_SLV_IE_WR 0x04 // RWA, enable interrupt for slave writing event
#define RB_SLV_IE_RD 0x08 // RWA, enable interrupt for slave reading event
#define R8_SLV_DOUT (*((volatile uint8_t *)0x40400016)) // RW, parallel slave data to output
#define R8_SLV_STATUS (*((volatile uint8_t *)0x40400017)) // RW, parallel slave status to output, only low 7 bit
/* Interrupt vector register */
#define R32_INT_VEC_CTRL (*((volatile uint32_t *)0x40400020)) // RWA, interrupt vector control, SAM
#define R8_INT_VEC_IRQ (*((volatile uint8_t *)0x40400020)) // RWA, IRQ normal interrupt vector control, SAM
#define RB_IV_IRQ_TMR0 0x01 // RWA, TMR0 IRQ vector enable
#define RB_IV_IRQ_SPI0 0x02 // RWA, SPI0 IRQ vector enable
#define RB_IV_IRQ_PB 0x04 // RWA, GPIO PB IRQ vector enable
#define R8_INT_VEC_FIQ (*((volatile uint8_t *)0x40400021)) // RWA, FIQ fast interrupt vector control, SAM
#define RB_IV_FIQ_TMR0 0x01 // RWA, TMR0 FIQ vector enable
#define RB_IV_FIQ_SPI0 0x02 // RWA, SPI0 FIQ vector enable
#define RB_IV_FIQ_PB 0x04 // RWA, GPIO PB FIQ vector enable
#define R32_INT_VEC_TMR0 (*((volatile uint32_t *)0x40400024)) // RWA, interrupt vector for TMR0, SAM
#define R32_INT_VEC_SPI0 (*((volatile uint32_t *)0x40400028)) // RWA, interrupt vector for SPI0, SAM
#define R32_INT_VEC_PB (*((volatile uint32_t *)0x4040002C)) // RWA, interrupt vector for GPIO PB, SAM
/* Interrupt flag register */
#define R32_INT_FLAG (*((volatile uint32_t *)0x40400040)) // RW, interrupt flag
#define R8_INT_FLAG_0 (*((volatile uint8_t *)0x40400040)) // RO, interrupt flag byte 0
#define RB_IF_TMR0 0x01 // RO, interrupt flag of TMR0
#define RB_IF_TMR1 0x02 // RO, interrupt flag of TMR1
#define RB_IF_TMR2 0x04 // RO, interrupt flag of TMR2
#define RB_IF_TMR3 0x08 // RO, interrupt flag of TMR3
#define RB_IF_SPI0 0x10 // RO, interrupt flag of SPI0
#define RB_IF_SPI1 0x20 // RO, interrupt flag of SPI1
#define RB_IF_UART0 0x40 // RO, interrupt flag of UART0
#define RB_IF_UART1 0x80 // RO, interrupt flag of UART1
#define R8_INT_FLAG_1 (*((volatile uint8_t *)0x40400041)) // RO, interrupt flag byte 1
#define RB_IF_PA 0x01 // RO, interrupt flag of GPIO PA
#define RB_IF_PB 0x02 // RO, interrupt flag of GPIO PB
#define RB_INT_WOL_STATUS 0x04 // RO, current ethernet WOL status
#define RB_IF_PD 0x08 // RO, interrupt flag of GPIO PD
#define RB_IF_ADC 0x10 // RO, interrupt flag of ADC
#define RB_IF_SLV 0x20 // RO, interrupt flag of parallel slave
#define RB_IF_USB 0x40 // RO, interrupt flag of USB
#define RB_IF_ETH 0x80 // RO, interrupt flag of ethernet
#define R8_INT_FLAG_SLV (*((volatile uint8_t *)0x40400042)) // RW1, parallel slave interrupt flag
#define RB_IF_SLV_CMD0 0x10 // RO, parallel slave command raw flag
#define RB_IF_SLV_CMD 0x20 // RO, parallel slave command synchro flag
#define RB_IF_SLV_WR 0x40 // RW1, interrupt flag of parallel slave writing event
#define RB_IF_SLV_RD 0x80 // RW1, interrupt flag of parallel slave reading event
#define R8_INT_SLV_DIN (*((volatile uint8_t *)0x40400043)) // RO, parallel slave data input
/*SLV DMA enable register*/
#define R8_DMA_EN_SLV (*((volatile uint8_t *)0x40400180)) //SLV DMA enable register
#define RB_DMA_EN_SLV 0x01 //SLV DMA mode enable control bit
#define RB_DMA_RESP_IE_SLV 0x02 //SLV DMA error transmission interrupts enable control bit
#define RB_DMA_END_IE_SLV 0x04 //SLV DMA error transmission end enable control bit
#define RB_DMA_LOOP_EN_SLV 0x08 //SLV DMA cyclic address mode control bits
#define RB_DMA_FIFO_OV_IE_SLV 0x10 //The FIFO full state interrupts the enable bit
#define RB_DMA_OTHER_IE_SLV 0x20 //when in compatibility mode, Transmission of non-DMA datastate interrupts the enable bit
#define RB_DMA_WR_8BIT 0x40 //selection of transfer data length for DMA write operations
/*SLV DMA mode control register*/
#define R8_DMA_MODE_CTRL_SLV (*((volatile uint8_t *)0x40400181)) //SLV DMA mode control register
#define CMD0_WR_MODE 0x40 //DMA transfer command word 0 read and write type
#define CMD1_WR_MODE 0x80 //DMA transfer command word 1 read and write type
/*SLV DMA mode enable register*/
#define R8_DMA_MODE_EN_SLV (*((volatile uint8_t *)0x40400182)) //SLV DMA mode enable register
#define CMD0_EN 0x01 //DMA transfer command word 0 control bit
#define CMD1_EN 0x02 //DMA transfer command word 1 control bit
#define DMA_CMD_MODE1 0x08 //DMA transfer command word mode1
/*SLV DMA interrupt flag register*/
#define R8_DMA_INT_FLAG_SLV (*((volatile uint8_t *)0x40400184)) //SLV DMA interrupt flag register
#define WR_DMA_END_IF 0x01 //DMA receive mode transmission end flag bit
#define WR_DMA_RESP_IF 0x02 //DMA receive mode transmission error flag bit
#define RD_DMA_END_IF 0x04 //DMA occurrence mode transmission end flag bit
#define RD_DMA_RESP_IF 0x08 //DMA occurrence mode transmission error flag bit
#define WR_DMA_OV_IF 0x10 //input FIFO full flag
#define WR_OTHER_IF 0x20 //data are written to the flag bit
#define DATA_IN_FIFO_EMPTY 0x40 //Whether DATA_IN_FIFO is empty
/*DMA receive mode start address register*/
#define R32_WR_DMA_START_ADDR_SLV (*((volatile uint32_t *)0x40400188)) //DMA receive mode start address register
#define MASK_WR_DMA_START_ADDR_SLV 0x0003ffff //DMA receive mode start address
/*DMA receive mode end address register*/
#define R32_WR_DMA_END_ADDR_SLV (*((volatile uint32_t *)0x4040018c)) //DMA receive mode end address register
#define MASK_WR_DMA_START_ADDR_SLV 0x0003ffff //DMA receive mode end address
/*DMA send mode start address register*/
#define R32_RD_DMA_START_ADDR_SLV (*((volatile uint32_t *)0x40400194)) //DMA send mode start address register
#define MASK_RD_DMA_START_ADDR_SLV 0x0003ffff //DMA send mode start address
/*DMA send mode end address register*/
#define R32_RD_DMA_END_ADDR_SLV (*((volatile uint32_t *)0x40400198)) //DMA send mode end address register
#define MASK_RD_DMA_START_ADDR_SLV 0x0003ffff //DMA send mode end address
/*DMA current address register*/
#define R32_DMA_END_NOW_SLV (*((volatile uint32_t *)0x4040019c)) //DMA current address register
#define MASK_DMA_NOW_ADDR_SLV 0x0003ffff //DMA current address
/*DMA mode command word0 register*/
#define R8_DMA_CMD0_SLV (*((volatile uint8_t *)0x404001a0)) //DMA mode command word0 register
/*DMA mode command word1 register*/
#define R8_DMA_CMD1_SLV (*((volatile uint8_t *)0x404001a1)) //DMA mode command word1 register
/*DMA reset the command word register*/
#define R8_SLV_RESET_CMD (*((volatile uint8_t *)0x404001a4)) //DMA reset the command word register
/*SLV busy flag register*/
#define R8_SLV_BUSY (*((volatile uint8_t *)0x404001a5)) //SLV busy flag register
#define RB_SLV_BUSY 0x01 //SLV busy flag
/*Non-DMA writes to the data register*/
#define R8_OTHER_DATA (*((volatile uint8_t *)0x404001b0)) //Non-DMA writes to the data register
/*DMA parses length register*/
#define R16_DMA_DEC_LEN (*((volatile uint16_t *)0x404001b4)) //DMA parses length register
/*DMA resolves the offset address register*/
#define R16_DMA_DEC_OFFSET (*((volatile uint16_t *)0x404001b6)) //DMA resolves the offset address register
/* GPIO PA interrupt register */
#define R32_INT_STATUS_PA (*((volatile uint32_t *)0x40400050)) // RW1, GPIO PA interrupt flag
#define R8_INT_STATUS_PA_1 (*((volatile uint8_t *)0x40400051)) // RW1, GPIO PA interrupt flag byte 1
#define R8_INT_STATUS_PA_2 (*((volatile uint8_t *)0x40400052)) // RW1, GPIO PA interrupt flag byte 2
#define R32_INT_ENABLE_PA (*((volatile uint32_t *)0x40400054)) // RW, GPIO PA interrupt enable
#define R8_INT_ENABLE_PA_1 (*((volatile uint8_t *)0x40400055)) // RW, GPIO PA interrupt enable byte 1
#define R8_INT_ENABLE_PA_2 (*((volatile uint8_t *)0x40400056)) // RW, GPIO PA interrupt enable byte 2
#define R32_INT_MODE_PA (*((volatile uint32_t *)0x40400058)) // RW, GPIO PA interrupt mode: 0=level action, 1=edge action
#define R8_INT_MODE_PA_1 (*((volatile uint8_t *)0x40400059)) // RW, GPIO PA interrupt mode byte 1
#define R8_INT_MODE_PA_2 (*((volatile uint8_t *)0x4040005A)) // RW, GPIO PA interrupt mode byte 2
#define R32_INT_POLAR_PA (*((volatile uint32_t *)0x4040005C)) // RW, GPIO PA interrupt polarity: 0=normal/low level/fall edge, 1=invert/high level/rise edge
#define R8_INT_POLAR_PA_1 (*((volatile uint8_t *)0x4040005D)) // RW, GPIO PA interrupt polarity byte 1
#define R8_INT_POLAR_PA_2 (*((volatile uint8_t *)0x4040005E)) // RW, GPIO PA interrupt polarity byte 2
/* GPIO PB interrupt register */
#define R32_INT_STATUS_PB (*((volatile uint32_t *)0x40400060)) // RW1, GPIO PB interrupt flag
#define R8_INT_STATUS_PB_0 (*((volatile uint8_t *)0x40400060)) // RW1, GPIO PB interrupt flag byte 0
#define R8_INT_STATUS_PB_1 (*((volatile uint8_t *)0x40400061)) // RW1, GPIO PB interrupt flag byte 1
#define R8_INT_STATUS_PB_2 (*((volatile uint8_t *)0x40400062)) // RW1, GPIO PB interrupt flag byte 2
#define R32_INT_ENABLE_PB (*((volatile uint32_t *)0x40400064)) // RW, GPIO PB interrupt enable
#define R8_INT_ENABLE_PB_0 (*((volatile uint8_t *)0x40400064)) // RW, GPIO PB interrupt enable byte 0
#define R8_INT_ENABLE_PB_1 (*((volatile uint8_t *)0x40400065)) // RW, GPIO PB interrupt enable byte 1
#define R8_INT_ENABLE_PB_2 (*((volatile uint8_t *)0x40400066)) // RW, GPIO PB interrupt enable byte 2
#define R32_INT_MODE_PB (*((volatile uint32_t *)0x40400068)) // RW, GPIO PB interrupt mode: 0=level action, 1=edge action
#define R8_INT_MODE_PB_0 (*((volatile uint8_t *)0x40400068)) // RW, GPIO PB interrupt mode byte 0
#define R8_INT_MODE_PB_1 (*((volatile uint8_t *)0x40400069)) // RW, GPIO PB interrupt mode byte 1
#define R8_INT_MODE_PB_2 (*((volatile uint8_t *)0x4040006A)) // RW, GPIO PB interrupt mode byte 2
#define R32_INT_POLAR_PB (*((volatile uint32_t *)0x4040006C)) // RW, GPIO PB interrupt polarity: 0=normal/low level/fall edge, 1=invert/high level/rise edge
#define R8_INT_POLAR_PB_0 (*((volatile uint8_t *)0x4040006C)) // RW, GPIO PB interrupt polarity byte 0
#define R8_INT_POLAR_PB_1 (*((volatile uint8_t *)0x4040006D)) // RW, GPIO PB interrupt polarity byte 1
#define R8_INT_POLAR_PB_2 (*((volatile uint8_t *)0x4040006E)) // RW, GPIO PB interrupt polarity byte 2
/* GPIO PD interrupt register */
#define R32_INT_STATUS_PD (*((volatile uint32_t *)0x40400070)) // RW1, GPIO PD interrupt flag
#define R8_INT_STATUS_PD_0 (*((volatile uint8_t *)0x40400070)) // RW1, GPIO PD interrupt flag byte 0
#define R8_INT_STATUS_PD_3 (*((volatile uint8_t *)0x40400073)) // RW1, GPIO PD interrupt flag byte 3
#define R32_INT_ENABLE_PD (*((volatile uint32_t *)0x40400074)) // RW, GPIO PD interrupt enable
#define R8_INT_ENABLE_PD_0 (*((volatile uint8_t *)0x40400074)) // RW, GPIO PD interrupt enable byte 0
#define R8_INT_ENABLE_PD_3 (*((volatile uint8_t *)0x40400077)) // RW, GPIO PD interrupt enable byte 3
#define R32_INT_MODE_PD (*((volatile uint32_t *)0x40400078)) // RW, GPIO PD interrupt mode: 0=level action, 1=edge action
#define R8_INT_MODE_PD_0 (*((volatile uint8_t *)0x40400078)) // RW, GPIO PD interrupt mode byte 0
#define R8_INT_MODE_PD_3 (*((volatile uint8_t *)0x4040007B)) // RW, GPIO PD interrupt mode byte 3
#define R32_INT_POLAR_PD (*((volatile uint32_t *)0x4040007C)) // RW, GPIO PD interrupt polarity: 0=normal/low level/fall edge, 1=invert/high level/rise edge
#define R8_INT_POLAR_PD_0 (*((volatile uint8_t *)0x4040007C)) // RW, GPIO PD interrupt polarity byte 0
#define R8_INT_POLAR_PD_3 (*((volatile uint8_t *)0x4040007F)) // RW, GPIO PD interrupt polarity byte 3
/* GPIO interrupt register address offset and bit define */
#define BA_INT_PA ((volatile uint8_t *)0x40400050) // point GPIO PA interrupt base address
#define BA_INT_PB ((volatile uint8_t *)0x40400060) // point GPIO PB interrupt base address
#define BA_INT_PD ((volatile uint8_t *)0x40400070) // point GPIO PD interrupt base address
#define INT_GPIO_STATUS 0x00
#define INT_GPIO_STATUS_0 0x00
#define INT_GPIO_STATUS_1 0x01
#define INT_GPIO_STATUS_2 0x02
#define INT_GPIO_ENABLE 0x04
#define INT_GPIO_ENABLE_0 0x04
#define INT_GPIO_ENABLE_1 0x05
#define INT_GPIO_ENABLE_2 0x06
#define INT_GPIO_MODE 0x08
#define INT_GPIO_MODE_0 0x08
#define INT_GPIO_MODE_1 0x09
#define INT_GPIO_MODE_2 0x0A
#define INT_GPIO_POLAR 0x0C
#define INT_GPIO_POLAR_0 0x0C
#define INT_GPIO_POLAR_1 0x0D
#define INT_GPIO_POLAR_2 0x0E
/* GPIO PA register */
#define R32_PA_DIR (*((volatile uint32_t *)0x40400080)) // RW, GPIO PA I/O direction: 0=in, 1=out
#define R8_PA_DIR_0 (*((volatile uint8_t *)0x40400080)) // RW, GPIO PA I/O direction byte 0
#define R8_PA_DIR_1 (*((volatile uint8_t *)0x40400081)) // RW, GPIO PA I/O direction byte 1
#define R8_PA_DIR_2 (*((volatile uint8_t *)0x40400082)) // RW, GPIO PA I/O direction byte 2
#define R32_PA_PIN (*((volatile uint32_t *)0x40400084)) // RO, GPIO PA input
#define R8_PA_PIN_0 (*((volatile uint8_t *)0x40400084)) // RO, GPIO PA input byte 0
#define R8_PA_PIN_1 (*((volatile uint8_t *)0x40400085)) // RO, GPIO PA input byte 1
#define R8_PA_PIN_2 (*((volatile uint8_t *)0x40400086)) // RO, GPIO PA input byte 2
#define R32_PA_OUT (*((volatile uint32_t *)0x40400088)) // RW, GPIO PA output
#define R8_PA_OUT_0 (*((volatile uint8_t *)0x40400088)) // RW, GPIO PA output byte 0
#define R8_PA_OUT_1 (*((volatile uint8_t *)0x40400089)) // RW, GPIO PA output byte 1
#define R8_PA_OUT_2 (*((volatile uint8_t *)0x4040008A)) // RW, GPIO PA output byte 2
#define R32_PA_CLR (*((volatile uint32_t *)0x4040008C)) // WZ, GPIO PA clear output: 0=keep, 1=clear
#define R8_PA_CLR_0 (*((volatile uint8_t *)0x4040008C)) // WZ, GPIO PA clear output byte 0
#define R8_PA_CLR_1 (*((volatile uint8_t *)0x4040008D)) // WZ, GPIO PA clear output byte 1
#define R8_PA_CLR_2 (*((volatile uint8_t *)0x4040008E)) // WZ, GPIO PA clear output byte 2
#define R32_PA_PU (*((volatile uint32_t *)0x40400090)) // RW, GPIO PA pullup resistance enable
#define R8_PA_PU_0 (*((volatile uint8_t *)0x40400090)) // RW, GPIO PA pullup resistance enable byte 0
#define R8_PA_PU_1 (*((volatile uint8_t *)0x40400091)) // RW, GPIO PA pullup resistance enable byte 1
#define R8_PA_PU_2 (*((volatile uint8_t *)0x40400092)) // RW, GPIO PA pullup resistance enable byte 2
#define R32_PA_PD (*((volatile uint32_t *)0x40400094)) // RW, GPIO PA output open-drain & input pulldown resistance enable
#define R8_PA_PD_0 (*((volatile uint8_t *)0x40400094)) // RW, GPIO PA output open-drain & input pulldown resistance enable byte 0
#define R8_PA_PD_1 (*((volatile uint8_t *)0x40400095)) // RW, GPIO PA output open-drain & input pulldown resistance enable byte 1
#define R8_PA_PD_2 (*((volatile uint8_t *)0x40400096)) // RW, GPIO PA output open-drain & input pulldown resistance enable byte 2
/* GPIO PB register */
#define R32_PB_DIR (*((volatile uint32_t *)0x404000A0)) // RW, GPIO PB I/O direction: 0=in, 1=out
#define R8_PB_DIR_0 (*((volatile uint8_t *)0x404000A0)) // RW, GPIO PB I/O direction byte 0
#define R8_PB_DIR_1 (*((volatile uint8_t *)0x404000A1)) // RW, GPIO PB I/O direction byte 1
#define R8_PB_DIR_2 (*((volatile uint8_t *)0x404000A2)) // RW, GPIO PB I/O direction byte 2
#define R32_PB_PIN (*((volatile uint32_t *)0x404000A4)) // RO, GPIO PB input
#define R8_PB_PIN_0 (*((volatile uint8_t *)0x404000A4)) // RO, GPIO PB input byte 0
#define R8_PB_PIN_1 (*((volatile uint8_t *)0x404000A5)) // RO, GPIO PB input byte 1
#define R8_PB_PIN_2 (*((volatile uint8_t *)0x404000A6)) // RO, GPIO PB input byte 2
#define R32_PB_OUT (*((volatile uint32_t *)0x404000A8)) // RW, GPIO PB output
#define R8_PB_OUT_0 (*((volatile uint8_t *)0x404000A8)) // RW, GPIO PB output byte 0
#define R8_PB_OUT_1 (*((volatile uint8_t *)0x404000A9)) // RW, GPIO PB output byte 1
#define R8_PB_OUT_2 (*((volatile uint8_t *)0x404000AA)) // RW, GPIO PB output byte 2
#define R32_PB_CLR (*((volatile uint32_t *)0x404000AC)) // WZ, GPIO PB clear output: 0=keep, 1=clear
#define R8_PB_CLR_0 (*((volatile uint8_t *)0x404000AC)) // WZ, GPIO PB clear output byte 0
#define R8_PB_CLR_1 (*((volatile uint8_t *)0x404000AD)) // WZ, GPIO PB clear output byte 1
#define R8_PB_CLR_2 (*((volatile uint8_t *)0x404000AE)) // WZ, GPIO PB clear output byte 2
#define R32_PB_PU (*((volatile uint32_t *)0x404000B0)) // RW, GPIO PB pullup resistance enable
#define R8_PB_PU_0 (*((volatile uint8_t *)0x404000B0)) // RW, GPIO PB pullup resistance enable byte 0
#define R8_PB_PU_1 (*((volatile uint8_t *)0x404000B1)) // RW, GPIO PB pullup resistance enable byte 1
#define R8_PB_PU_2 (*((volatile uint8_t *)0x404000B2)) // RW, GPIO PB pullup resistance enable byte 2
#define R32_PB_PD (*((volatile uint32_t *)0x404000B4)) // RW, GPIO PB output open-drain & input pulldown resistance enable
#define R8_PB_PD_0 (*((volatile uint8_t *)0x404000B4)) // RW, GPIO PB output open-drain & input pulldown resistance enable byte 0
#define R8_PB_PD_1 (*((volatile uint8_t *)0x404000B5)) // RW, GPIO PB output open-drain & input pulldown resistance enable byte 1
#define R8_PB_PD_2 (*((volatile uint8_t *)0x404000B6)) // RW, GPIO PB output open-drain & input pulldown resistance enable byte 2
/* GPIO PD register */
#define R32_PD_DIR (*((volatile uint32_t *)0x404000C0)) // RW, GPIO PD I/O direction: 0=in, 1=out
#define R8_PD_DIR_0 (*((volatile uint8_t *)0x404000C0)) // RW, GPIO PD I/O direction byte 0
#define R8_PD_DIR_1 (*((volatile uint8_t *)0x404000C1)) // RW, GPIO PD I/O direction byte 1
#define R8_PD_DIR_2 (*((volatile uint8_t *)0x404000C2)) // RW, GPIO PD I/O direction byte 2
#define R8_PD_DIR_3 (*((volatile uint8_t *)0x404000C3)) // RW, GPIO PD I/O direction byte 3
#define R32_PD_PIN (*((volatile uint32_t *)0x404000C4)) // RO, GPIO PD input
#define R8_PD_PIN_0 (*((volatile uint8_t *)0x404000C4)) // RO, GPIO PD input byte 0
#define R8_PD_PIN_1 (*((volatile uint8_t *)0x404000C5)) // RO, GPIO PD input byte 1
#define R8_PD_PIN_2 (*((volatile uint8_t *)0x404000C6)) // RO, GPIO PD input byte 2
#define R8_PD_PIN_3 (*((volatile uint8_t *)0x404000C7)) // RO, GPIO PD input byte 3
#define R32_PD_OUT (*((volatile uint32_t *)0x404000C8)) // RW, GPIO PD output
#define R8_PD_OUT_0 (*((volatile uint8_t *)0x404000C8)) // RW, GPIO PD output byte 0
#define R8_PD_OUT_1 (*((volatile uint8_t *)0x404000C9)) // RW, GPIO PD output byte 1
#define R8_PD_OUT_2 (*((volatile uint8_t *)0x404000CA)) // RW, GPIO PD output byte 2
#define R8_PD_OUT_3 (*((volatile uint8_t *)0x404000CB)) // RW, GPIO PD output byte 3
#define R32_PD_PU (*((volatile uint32_t *)0x404000D0)) // RW, GPIO PD pullup resistance enable
#define R8_PD_PU_0 (*((volatile uint8_t *)0x404000D0)) // RW, GPIO PD pullup resistance enable 0
#define R8_PD_PU_1 (*((volatile uint8_t *)0x404000D1)) // RW, GPIO PD pullup resistance enable 1
#define R8_PD_PU_2 (*((volatile uint8_t *)0x404000D2)) // RW, GPIO PD pullup resistance enable 2
#define R8_PD_PU_3 (*((volatile uint8_t *)0x404000D3)) // RW, GPIO PD pullup resistance enable 3
#define R32_PD_PD (*((volatile uint32_t *)0x404000D4)) // RW, GPIO PD pulldown resistance enable
#define R8_PD_PD_0 (*((volatile uint8_t *)0x404000D4)) // RW, GPIO PD pulldown resistance enable 0
#define R8_PD_PD_1 (*((volatile uint8_t *)0x404000D5)) // RW, GPIO PD pulldown resistance enable 1
#define R8_PD_PD_2 (*((volatile uint8_t *)0x404000D6)) // RW, GPIO PD pulldown resistance enable 2
#define R8_PD_PD_3 (*((volatile uint8_t *)0x404000D7)) // RW, GPIO PD pulldown resistance enable 3
/* GPIO register address offset and bit define */
#define BA_PA ((volatile uint8_t *)0x40400080) // point GPIO PA base address
#define BA_PB ((volatile uint8_t *)0x404000A0) // point GPIO PB base address
#define BA_PD ((volatile uint8_t *)0x404000C0) // point GPIO PD base address
#define GPIO_DIR 0x00
#define GPIO_DIR_0 0x00
#define GPIO_DIR_1 0x01
#define GPIO_DIR_2 0x02
#define GPIO_DIR_3 0x03
#define GPIO_PIN 0x04
#define GPIO_PIN_0 0x04
#define GPIO_PIN_1 0x05
#define GPIO_PIN_2 0x06
#define GPIO_PIN_3 0x07
#define GPIO_OUT 0x08
#define GPIO_OUT_0 0x08
#define GPIO_OUT_1 0x09
#define GPIO_OUT_2 0x0A
#define GPIO_OUT_3 0x0B
#define GPIO_CLR 0x0C
#define GPIO_CLR_0 0x0C
#define GPIO_CLR_1 0x0D
#define GPIO_CLR_2 0x0E
#define GPIO_CLR_3 0x0F
#define GPIO_PU 0x10
#define GPIO_PU_0 0x10
#define GPIO_PU_1 0x11
#define GPIO_PU_2 0x12
#define GPIO_PU_3 0x13
#define GPIO_PD 0x14
#define GPIO_PD_0 0x14
#define GPIO_PD_1 0x15
#define GPIO_PD_2 0x16
#define GPIO_PD_3 0x17
#define RB_PD_15_8 0x01 // RW, GPIO PD[15:8] pullup resistance enable together
#define RB_PD_23_16 0x01 // RW, GPIO PD[23:16] pullup resistance enable together
#define RB_PD_31_24 0x01 // RW, GPIO PD[31:24] pullup resistance enable together
/*AF remap and debug I/O configuration register (AFIO_PCFR1)*/
#define R32_AFIO_PCFR1 (*((volatile uint32_t *)0x40400140)) //AF remap and debug I/O configuration register (AFIO_PCFR1)
#define MASK_LINK_LED_RM 0xc0000000 //LINK LED remapping
#define MASK_SLV_RW_RM 0x30000000 //SLV remapping
#define MASK_SLV_DATA_RM 0x0c000000 //SLV data remapping
#define MASK_SLV_ADDR1_RM 0x03000000 //SLV address1 remapping
#define MASK_SLV_ADDR_RM 0x00c00000 //SLV command data selection input pin remapping
#define MASK_SLV_CS_RM 0x00300000 //SLV piece selection pin remapping
#define MASK_SLV_INTERRUPT_RM 0x000c0000 //SLV interrupt pin remapping
#define MASK_I2C_RM 0x00030000 //I2C remapping
#define MASK_UART2_MODEM_RM 0x0000c000 //UART2 MODEM remapping
#define MASK_UART1_MODEM_RM 0x00003000 //UART1 MODEM remapping
#define MASK_UART0_MODEM_RM 0x00000c00 //UART0 MODEM remapping
#define MASK_UART3_RM 0x00000300 //UART3 remapping
#define MASK_UART2_RM 0x000000c0 //UART2 remapping
#define MASK_UART1_RM 0x00000030 //UART1 remapping
#define MASK_UART0_RM 0x0000000c //UART0 remapping
#define MASK_SPI0_RM 0x00000003 //SPI0 remapping
/*AF remap and debug I/O configuration register (AFIO_PCFR2)*/
#define R32_AFIO_PCFR2 (*((volatile uint32_t *)0x40400160)) //AF remap and debug I/O configuration register (AFIO_PCFR2)
#define UART3_MODEM 0x000c0000 //UART3 MODEM remapping
#define TNOW3_RM 0x00030000 //TNOW3 remapping
#define TNOW2_RM 0x0000c000 //TNOW2 remapping
#define TNOW1_RM 0x00003000 //TNOW1 remapping
#define TNOW0_RM 0x00000c00 //TNOW0 remapping
#define SPI1_RM 0x00000300 //UART3 remapping
#define BUSY_RM 0x00000040 //BUSY remapping
#define TIMER1_RM 0x00000020 //TIMER1 remapping
#define TIMER0_RM 0x00000010 //TIMER0 remapping
#define RST_RM 0x0000000c //reset pin remapping
#define ACT_LED_RM 0x00000003 //active led remapping
/*Configure the extended control register 0*/
#define R32_EXTEN_CTLR0 (*((volatile uint32_t *)0x40400144)) //Configure the extended control register 0
#define RB_CORE_PROT_STATUS 0x40000000 //Core protected moed status bit
#define RB_CORE_HALT_INT_EN 0x02000000 //Kernel error interrupt enabled
#define RB_RST_DLEAY_EN 0x01000000 //reset time extension control bit
#define RB_XI_STATUS 0x00800000 //XI STATUS
#define RB_USBPLLON 0x00400000 //USBPLL clock enable bit
#define RB_FLASH_PRE_EN 0x00200000 //flash clock pre-divisor enable
#define RB_ETHRST 0x00080000 //ethernet reset control
#define RB_DIG_ETH_PHY_RST 0x00020000 //ethernet phy digital module reset control
#define RB_ANA_ETH_PHY_RST 0x00010000 //ethernet phy analog module reset control
#define RB_USBPLLCLK 0x0000c000 //USBPLL input clock frequency selection
#define RB_RST_CMD_EN 0x00002000 //global reset enabled
#define RB_BUSY_EN 0x00001000 //the busy signal output of spi and slv enabled
#define RB_TNOW3_EN 0x00000800 //the TNOW signal output of the UART3 is enabled
#define RB_TNOW2_EN 0x00000400 //the TNOW signal output of the UART2 is enabled
#define RB_TNOW1_EN 0x00000200 //the TNOW signal output of the UART1 is enabled
#define RB_TNOW0_EN 0x00000100 //the TNOW signal output of the UART0 is enabled
#define RB_SW 0x00000080 //select the systemitem clock source
#define RB_USBPLLSRC 0x00000060 //USBPLL reference clock source
#define RB_SW_CFG 0x00000001 //Serial wire JTAG configuration
/*Configure the extended control register 1*/
#define R32_EXTEN_CTLR1 (*((volatile uint32_t *)0x40400154)) //Configure the extended control register 1
#define RB_VIO_PWN_INT_EN 0x00800000 //Enables an outage when the VIO power is down
#define RB_VIO_PWN_RST_EN 0x00400000 //Enable system reset when the VIO power is down
#define RB_VIO_PWN_IO_EN 0x00200000 //Enable the IO port of the peripheral to input a high levelwhen the VIO power is down
#define RB_LDO_SLP_EN 0x00100000 //Enable the LDO to go into sleep mode when the VIO power isdown
#define RB_CLKSEL 0x00080000 //Clock signal selection
#define RB_HSE_STATUS 0x00008000 //External crystal current level status
#define RB_VIO_RDY 0x00000080 //VIO status
#define RB_HSION 0x00000040 //Internal High Speed clock enable
#define RB_HSEON 0x00000020 //External High Speed clock enable
/*Configure the extended control register 2*/
#define R32_EXTEN_CTLR2 (*((volatile uint32_t *)0x4040016c)) //Configure the extended control register 2
#define RB_XIXO_GPIO_EN 0x02000000 //XI/XO pin open-drain_ouput control bit
#define RB_XO_OE 0x01000000 //XO ouput enable bit
#define RB_XI_OE 0x00800000 //XI ouput enable bit
#define RB_USBPD_IN_HVT1 0x00000002 //PD PIN PB19 high threshold input mode
#define RB_USBPD_IN_HVT0 0x00000001 //PD PIN PB18 high threshold input mode
/*flash data manipulation register */
#define R8_SPI_FLASH_DATA (*((volatile uint8_t *)0x40400018)) //flash data manipulation register
/*Flash control register*/
#define R8_SPI_FLASH_CTRL (*((volatile uint8_t *)0x4040001a)) //Flash control register
#define RB_FLASH_RD_EN 0x04 //The software reads the FLASH function enable bit
#define RB_FLASH_OE 0x02 //Flash output enable
#define RB_FLASH_CS 0x01 //Flash slice bit selection was enabled
/*CodeFlash key buffer register*/
#define R16_FLASHA_KEY_BUF (*((volatile uint16_t *)0x40400168)) //CodeFlash key buffer register
#define R16_FLASHB_KEY_BUF (*((volatile uint16_t *)0x4040016A)) //CodeFlash key buffer register
/* GPIO alias name */
#define TWP0 (1 << 4) // PA4
#define TWP1 (1 << 5) // PA5
#define TACK (1 << 6) // PA6
#define TDO (1 << 7) // PA7
#define TRST (1 << 9) // PA9
#define TDI (1 << 13) // PA13
#define TCK (1 << 14) // PA14
#define TMS (1 << 15) // PA15
#define UID (1 << 8) // PA8
#define SLVI (1 << 9) // PA9
#define PIN_PARA_A0 (1 << 10) // PA10
#define PIN_PARA_PCS (1 << 11) // PA11
#define TNOW0 (1 << 7) // PA7
#define DTR0 (1 << 7) // PA7
#define RTS0 (1 << 8) // PA8
#define CTS0 (1 << 12) // PA12
#define DSR0 (1 << 13) // PA13
#define RI0 (1 << 14) // PA14
#define DCD0 (1 << 15) // PA15
#define CTS1 (1 << 16) // PA16
#define RTS1 (1 << 17) // PA17
#define TNOW1 (1 << 17) // PA17
#define ELED (1 << 13) // PA13
#define ELINK (1 << 18) // PA18
#define VBUS (1 << 19) // PA19
#define PRD (1 << 20) // PA20
#define PIN_PARA_RD (1 << 20)
#define PWR_314 (1 << 21) // PA21
#define PIN_PARA_WR (1 << 21)
#define CTS0X (1 << 0) // PB0
#define DSR0X (1 << 1) // PB1
#define RI0X (1 << 2) // PB2
#define DCD0X (1 << 3) // PB3
#define DTR0X (1 << 4) // PB4
#define RTS0X (1 << 5) // PB5
#define TRAN0 (1 << 0) // PB0
#define RECV0 (1 << 1) // PB1
#define TRAN1 (1 << 2) // PB2
#define RECV1 (1 << 3) // PB3
#define PWM0 (1 << 0) // PB0
#define CAT0 (1 << 1) // PB1
/* note: PB1/CAT0 will input from PECL if RB_MISC_PECL_EN=1 and TMR0.RB_TMR_OUT_EN=1 */
#define PWM1 (1 << 2) // PB2
#define CAT1 (1 << 3) // PB3
#define PWM2 (1 << 4) // PB4
#define CAT2 (1 << 5) // PB5
#define PWM3 (1 << 6) // PB6
#define CAT3 (1 << 6) // PB6
#define RXD0 (1 << 8) // PB8
#define TXD0 (1 << 9) // PB9
#define RXD1 (1 << 10) // PB10
/* note: PB10/RXD1 will input from PECL if RB_MISC_PECL_EN=1 and TMR0.RB_TMR_OUT_EN=0 */
#define RXTX1 (1 << 10) // PB10
#define TXD1 (1 << 11) // PB11
#define SCS (1 << 12) // PB12
#define SCK0 (1 << 13) // PB13
#define MOSI (1 << 14) // PB14
#define MISO (1 << 15) // PB15
#define SDX0 (1 << 15) // PB15
#define ADCS (1 << 16) // PB16
#define SCK1 (1 << 17) // PB17
#define SDO (1 << 18) // PB18
#define SDI (1 << 19) // PB19
#define SDX1 (1 << 19) // PB19
#define RXD2 (1 << 28) // PD28
#define TXD2 (1 << 29) // PD29
#define RXD3 (1 << 22) // PD22
#define TXD3 (1 << 23)
/* ADC register */
#define R32_ADC_CONTROL (*((volatile uint32_t *)0x4040A000)) // RW, ADC control
#define R8_ADC_CTRL_MOD (*((volatile uint8_t *)0x4040A000)) // RW, ADC mode control
#define R8_ADC_CTRL_DMA (*((volatile uint8_t *)0x4040A001)) // RW, ADC DMA control and etc.
#define R8_ADC_INTER_EN (*((volatile uint8_t *)0x4040A002)) // RW, ADC interrupt enable
#define R8_ADC_CLOCK_DIV (*((volatile uint8_t *)0x4040A003)) // RW, ADC clock divisor
#define R32_ADC_STATUS (*((volatile uint32_t *)0x4040A004)) // RW, ADC status
#define R16_ADC_DATA (*((volatile uint16_t *)0x4040A004)) // RO, ADC result data
#define R8_ADC_INT_FLAG (*((volatile uint8_t *)0x4040A006)) // RW1, ADC interrupt flag
#define R8_ADC_FIFO_COUNT (*((volatile uint8_t *)0x4040A007)) // RO, ADC FIFO count status
#define R32_ADC_CTRL (*((volatile uint8_t *)0x4040A008)) // RO, ADC control register
#define R16_ADC_CMP_VALUE (*((volatile uint16_t *)0x4040A00C)) // RW, ADC comparison reference value
#define R16_ADC_FIFO (*((volatile uint16_t *)0x4040A010)) // RO, ADC FIFO register
#define R32_ADC_DMA_NOW (*((volatile uint32_t *)0x4040A014)) // RW, ADC DMA current address
#define R32_ADC_DMA_BEG (*((volatile uint32_t *)0x4040A018)) // RW, ADC DMA begin address
#define R32_ADC_DMA_END (*((volatile uint32_t *)0x4040A01C)) // RW, ADC DMA end address
/* ADC register address offset and bit define */
#define ADC_FIFO_SIZE 8 // ADC FIFO size (depth)
#define BA_ADC ((volatile uint8_t *)0x4040A000) // point ADC base address
#define ADC_CTRL_MOD 0
#define RB_ADC_CYCLE_CLK 0x0F // RW, ADC cycle bit mask (clock number): 0=manual sample, other=set cycle for auto sample
#define RB_ADC_CHAN_MOD 0x30 // RW, ADC channel control mode: 00=0#, 01=1#, 10=2#, 11=auto flip 0#/1#
#define RB_ADC_SAMPLE_WID 0x40 // RW, ADC sample pulse width: 0=1 clock, 1=2 clock
#define RB_ADC_POWER_ON 0x80 // RW, ADC module enable
#define ADC_CTRL_DMA 1
#define RB_ADC_DMA_ENABLE 0x01 // RW, ADC DMA enable
#define RB_ADC_DMA_BURST 0x02 // RW, ADC DMA burst enable
#define RB_ADC_DMA_LOOP 0x04 // RW, ADC DMA address loop enable
#define RB_ADC_CHAN_OE 0x40 // WO, ADC channel control output enable
#define RB_ADC_MAN_SAMPLE 0x80 // RW, ADC manual sample control, high action
#define ADC_INTER_EN 2
#define RB_ADC_IE_ADC_CMP 0x01 // RW, enable interrupt for current ADC comparison action
#define RB_ADC_IE_ADC_END 0x02 // RW, enable interrupt for current ADC end
#define RB_ADC_IE_FIFO_HF 0x04 // RW, enable interrupt for ADC FIFO half
#define RB_ADC_IE_DMA_END 0x08 // RW, enable interrupt for ADC DMA completion
#define RB_ADC_IE_FIFO_OV 0x10 // RW, enable interrupt for ADC FIFO overflow
#define RB_ADC_IE_DMA_ERR 0x20 // RW, enable interrupt for ADC DMA respond error
#define RB_ADC_CMP_MOD_EQ 0x40 // RW, ADC equal comparison enable: 0=exclude equal, 1=include equal
#define RB_ADC_CMP_MOD_GT 0x80 // RW, ADC comparison mode: 0=less action, 1=great action
#define ADC_CLOCK_DIV 3
#define ADC_DATA 4
#define ADC_INT_FLAG 6
#define RB_ADC_IF_ADC_CMP 0x01 // RW1, interrupt flag for current ADC comparison action
#define RB_ADC_IF_ADC_END 0x02 // RW1, interrupt flag for current ADC end
#define RB_ADC_IF_FIFO_HF 0x04 // RW1, interrupt flag for ADC FIFO half
#define RB_ADC_IF_DMA_END 0x08 // RW1, interrupt flag for ADC DMA completion
#define RB_ADC_IF_FIFO_OV 0x10 // RW1, interrupt flag for ADC FIFO overflow
#define RB_ADC_IF_DMA_ERR 0x20 // RW1, interrupt flag for ADC DMA respond error
#define RB_ADC_EOC_FLAG 0x40 // RO, current ADC converter end indicator
#define RB_ADC_CHAN_INDEX 0x80 // RO, current ADC channel number for auto flip: 0=0#/2#, 1=1#
#define ADC_FIFO_COUNT 7
#define ADC_CTRL 8
#define MASK_ADC_CTL_MOD1 0x0000000f //Corresponding channel
#define MASK_ADC_SMAPLE_TIME 0x01fffff0 //ADC sampling and calibration time
#define MASK_ADC_CYCLE_BIT_4_6 0x0e000000 //Position 4-6 of the automatic sampling period
#define MASK_ADC_BIT_MODE 0x10000000 //ADC resolution selection bit
#define ADC_CMP_VALUE 0x0C
#define ADC_FIFO 0x10
#define MASK_ADC_DMA_ADDR 0x0003ffff
/* UART0 register */
#define R8_UART0_RBR (*((volatile uint8_t *)0x4040D000)) // RO, UART0 receiver buffer, receiving byte
#define R8_UART0_THR (*((volatile uint8_t *)0x4040D000)) // WO, UART0 transmitter holding, transmittal byte
#define R8_UART0_IER (*((volatile uint8_t *)0x4040D001)) // RW, UART0 interrupt enable
#define R8_UART0_IIR (*((volatile uint8_t *)0x4040D002)) // RO, UART0 interrupt identification
#define R8_UART0_FCR (*((volatile uint8_t *)0x4040D002)) // WO, UART0 FIFO control
#define R8_UART0_LCR (*((volatile uint8_t *)0x4040D003)) // RW, UART0 line control
#define R8_UART0_MCR (*((volatile uint8_t *)0x4040D004)) // RW, UART0 modem control
#define R8_UART0_LSR (*((volatile uint8_t *)0x4040D005)) // RO, UART0 line status
#define R8_UART0_MSR (*((volatile uint8_t *)0x4040D006)) // RO, UART0 modem status
#define R8_UART0_DIV (*((volatile uint8_t *)0x4040D007)) // RW, UART0 pre-divisor latch byte, only low 7 bit, from 1 to 0/128
#define R8_UART0_DMA_CTRL (*((volatile uint8_t *)0x4040d008)) // RW, DMA Control register
#define R8_UART0_DMA_IF (*((volatile uint8_t *)0x4040d009)) // RW, DMA status register
#define R32_UART0_DMA_WR_NOW_ADDR (*((volatile uint32_t *)0x4040d00c)) //DMA receive mode current address register
#define R32_UART0_DMA_WR_START_ADDR (*((volatile uint32_t *)0x4040d010)) //DMA receive mode start address register
#define R32_UART0_DMA_WR_END_ADDR (*((volatile uint32_t *)0x4040d014)) //DMA received mode end address register
#define R32_UART0_DMA_RD_NOW_ADDR (*((volatile uint32_t *)0x4040d018)) //DMA send mode current address register
#define R32_UART0_DMA_RD_START_ADDR (*((volatile uint32_t *)0x4040d01c)) //DMA send mode start address register
#define R32_UART0_DMA_RD_END_ADDR (*((volatile uint32_t *)0x4040d020)) //DMA send mode end address register
#define R8_UART0_DLL (*((volatile uint8_t *)0x4040D000)) // RW, UART0 divisor latch LSB byte
#define R8_UART0_DLM (*((volatile uint8_t *)0x4040D001)) // RW, UART0 divisor latch MSB byte
/* UART1 register */
#define R8_UART1_RBR (*((volatile uint8_t *)0x4040D800)) // RO, UART1 receiver buffer, receiving byte
#define R8_UART1_THR (*((volatile uint8_t *)0x4040D800)) // WO, UART1 transmitter holding, transmittal byte
#define R8_UART1_IER (*((volatile uint8_t *)0x4040D801)) // RW, UART1 interrupt enable
#define R8_UART1_IIR (*((volatile uint8_t *)0x4040D802)) // RO, UART1 interrupt identification
#define R8_UART1_FCR (*((volatile uint8_t *)0x4040D802)) // WO, UART1 FIFO control
#define R8_UART1_LCR (*((volatile uint8_t *)0x4040D803)) // RW, UART1 line control
#define R8_UART1_MCR (*((volatile uint8_t *)0x4040D804)) // RW, UART1 modem control
#define R8_UART1_LSR (*((volatile uint8_t *)0x4040D805)) // RO, UART1 line status
#define R8_UART1_MSR (*((volatile uint8_t *)0x4040D806)) // RO, UART1 modem status
#define R8_UART1_DIV (*((volatile uint8_t *)0x4040D807)) // RW, UART1 pre-divisor latch byte, only low 7 bit, from 1 to 0/128
#define R8_UART1_DMA_CTRL (*((volatile uint8_t *)0x4040d808)) // RW, DMA Control register
#define R8_UART1_DMA_IF (*((volatile uint8_t *)0x4040d809)) // RW, DMA status register
#define R32_UART1_DMA_WR_NOW_ADDR (*((volatile uint32_t *)0x4040d80c)) //DMA receive mode current address register
#define R32_UART1_DMA_WR_START_ADDR (*((volatile uint32_t *)0x4040d810)) //DMA receive mode start address register
#define R32_UART1_DMA_WR_END_ADDR (*((volatile uint32_t *)0x4040d814)) //DMA received mode end address register
#define R32_UART1_DMA_RD_NOW_ADDR (*((volatile uint32_t *)0x4040d818)) //DMA send mode current address register
#define R32_UART1_DMA_RD_START_ADDR (*((volatile uint32_t *)0x4040d81c)) //DMA send mode start address register
#define R32_UART1_DMA_RD_END_ADDR (*((volatile uint32_t *)0x4040d820)) //DMA send mode end address register
#define R8_UART1_DLL (*((volatile uint8_t *)0x4040D800)) // RW, UART1 divisor latch LSB byte
#define R8_UART1_DLM (*((volatile uint8_t *)0x4040D801)) // RW, UART1 divisor latch MSB byte
/* UART2 register */
#define R8_UART2_RBR (*((volatile uint8_t *)0x40409000)) // RO, UART2 receiver buffer, receiving byte
#define R8_UART2_THR (*((volatile uint8_t *)0x40409000)) // WO, UART2 transmitter holding, transmittal byte
#define R8_UART2_IER (*((volatile uint8_t *)0x40409001)) // RW, UART2 interrupt enable
#define R8_UART2_IIR (*((volatile uint8_t *)0x40409002)) // RO, UART2 interrupt identification
#define R8_UART2_FCR (*((volatile uint8_t *)0x40409002)) // WO, UART2 FIFO control
#define R8_UART2_LCR (*((volatile uint8_t *)0x40409003)) // RW, UART2 line control
#define R8_UART2_MCR (*((volatile uint8_t *)0x40409004)) // RW, UART2 modem control
#define R8_UART2_LSR (*((volatile uint8_t *)0x40409005)) // RO, UART2 line status
#define R8_UART2_MSR (*((volatile uint8_t *)0x40409006)) // RO, UART2 modem status
#define R8_UART2_DIV (*((volatile uint8_t *)0x40409007)) // RW, UART2 pre-divisor latch byte, only low 7 bit, from 1 to 0/128
#define R8_UART2_DMA_CTRL (*((volatile uint8_t *)0x40409008)) // RW, DMA Control register
#define R8_UART2_DMA_IF (*((volatile uint8_t *)0x40409009)) // RW, DMA status register
#define R32_UART2_DMA_WR_NOW_ADDR (*((volatile uint32_t *)0x4040900c)) //DMA receive mode current address register
#define R32_UART2_DMA_WR_START_ADDR (*((volatile uint32_t *)0x40409010)) //DMA receive mode start address register
#define R32_UART2_DMA_WR_END_ADDR (*((volatile uint32_t *)0x40409014)) //DMA received mode end address register
#define R32_UART2_DMA_RD_NOW_ADDR (*((volatile uint32_t *)0x40409018)) //DMA send mode current address register
#define R32_UART2_DMA_RD_START_ADDR (*((volatile uint32_t *)0x4040901c)) //DMA send mode start address register
#define R32_UART2_DMA_RD_END_ADDR (*((volatile uint32_t *)0x40409020)) //DMA send mode end address register
#define R8_UART2_DLL (*((volatile uint8_t *)0x40409000)) // RW, UART2 divisor latch LSB byte
#define R8_UART2_DLM (*((volatile uint8_t *)0x40409001)) // RW, UART2 divisor latch MSB byte
/* UART3 register */
#define R8_UART3_RBR (*((volatile uint8_t *)0x40409800)) // RO, UART3 receiver buffer, receiving byte
#define R8_UART3_THR (*((volatile uint8_t *)0x40409800)) // WO, UART3 transmitter holding, transmittal byte
#define R8_UART3_IER (*((volatile uint8_t *)0x40409801)) // RW, UART3 interrupt enable
#define R8_UART3_IIR (*((volatile uint8_t *)0x40409802)) // RO, UART3 interrupt identification
#define R8_UART3_FCR (*((volatile uint8_t *)0x40409802)) // WO, UART3 FIFO control
#define R8_UART3_LCR (*((volatile uint8_t *)0x40409803)) // RW, UART3 line control
#define R8_UART3_MCR (*((volatile uint8_t *)0x40409804)) // RW, UART3 modem control
#define R8_UART3_LSR (*((volatile uint8_t *)0x40409805)) // RO, UART3 line status
#define R8_UART3_MSR (*((volatile uint8_t *)0x40409806)) // RO, UART3 modem status
#define R8_UART3_DIV (*((volatile uint8_t *)0x40409807)) // RW, UART3 pre-divisor latch byte, only low 7 bit, from 1 to 0/128
#define R8_UART3_DMA_CTRL (*((volatile uint8_t *)0x40409808)) // RW, DMA Control register
#define R8_UART3_DMA_IF (*((volatile uint8_t *)0x40409809)) // RW, DMA status register
#define R32_UART3_DMA_WR_NOW_ADDR (*((volatile uint32_t *)0x4040980c)) //DMA receive mode current address register
#define R32_UART3_DMA_WR_START_ADDR (*((volatile uint32_t *)0x40409810)) //DMA receive mode start address register
#define R32_UART3_DMA_WR_END_ADDR (*((volatile uint32_t *)0x40409814)) //DMA received mode end address register
#define R32_UART3_DMA_RD_NOW_ADDR (*((volatile uint32_t *)0x40409818)) //DMA send mode current address register
#define R32_UART3_DMA_RD_START_ADDR (*((volatile uint32_t *)0x4040981c)) //DMA send mode start address register
#define R32_UART3_DMA_RD_END_ADDR (*((volatile uint32_t *)0x40409820)) //DMA send mode end address register
#define R8_UART3_DLL (*((volatile uint8_t *)0x40409800)) // RW, UART3 divisor latch LSB byte
#define R8_UART3_DLM (*((volatile uint8_t *)0x40409801)) // RW, UART3 divisor latch MSB byte
/* UART register address offset and bit define */
#define UART_FIFO_SIZE 16 // UART0 FIFO size (depth)
#define UART_RECV_RDY_SZ 14 // the max FIFO trigger level for UART0 receiver data available
#define BA_UART0 ((volatile uint8_t *)0x4040D000) // point UART0 base address
#define BA_UART1 ((volatile uint8_t *)0x4040D800) // point UART1 base address
#define BA_UART2 ((volatile uint8_t *)0x40409000) // point UART2 base address
#define BA_UART3 ((volatile uint8_t *)0x40409800) // point UART3 base address
#define UART_RBR 0
#define UART_THR 0
#define UART_IER 1
#define RB_IER_RECV_RDY 0x01 // RW, UART interrupt enable for receiver data ready
#define RB_IER_THR_EMPTY 0x02 // RW, UART interrupt enable for THR empty
#define RB_IER_LINE_STAT 0x04 // RW, UART interrupt enable for receiver line status
#define RB_IER_MODEM_CHG 0x08 // RW, UART interrupt enable for modem status change
#define RB_IER_MODEM_IO 0x10 // RW, UART0 modem pin selection: 0=from/to GPIO PA, 1=from/to GPIO PB
#define RB_IER_IRDA_MOD 0x10 // RW, UART1 IrDA mode enable
#define RB_IER_MOUT_EN 0x20 // RW, UART modem output pin enable
#define RB_IER_TXD_EN 0x40 // RW, UART TXD pin enable
#define RB_IER_RESET 0x80 // WZ, UART software reset control, high action, auto clear
#define UART_IIR 2
#define RB_IIR_NO_INT 0x01 // RO, UART no interrupt flag: 0=interrupt action, 1=no interrupt
#define RB_IIR_INT_MASK 0x0F // RO, UART interrupt flag bit mask
#define RB_IIR_FIFO_ID 0xC0 // RO, UART FIFO enabled flag
#define UART_FCR 2
#define RB_FCR_FIFO_EN 0x01 // WO, UART FIFO enable
#define RB_FCR_RX_FIFO_CLR 0x02 // WZ, clear UART receiver FIFO, high action, auto clear
#define RB_FCR_TX_FIFO_CLR 0x04 // WZ, clear UART transmitter FIFO, high action, auto clear
#define RB_FCR_FIFO_TRIG 0xC0 // WO, UART0/1 receiver FIFO trigger level: 00-1byte, 01-4/8bytes, 10-8/16bytes, 11-14/28bytes
#define UART_LCR 3
#define RB_LCR_WORD_SZ 0x03 // RW, UART word bit length: 00-5bit, 01-6bit, 10-7bit, 11-8bit
#define RB_LCR_STOP_BIT 0x04 // RW, UART stop bit length: 0-1bit, 1-2bit
#define RB_LCR_PAR_EN 0x08 // RW, UART parity enable
#define RB_LCR_PAR_MOD 0x30 // RW, UART pariry mode: 00-odd, 01-even, 10-mark, 11-space
#define RB_LCR_BREAK_EN 0x40 // RW, UART break control enable
#define RB_LCR_DLAB 0x80 // RW, UART divisor latch access bit
#define UART_MCR 4
#define RB_MCR_DTR 0x01 // RW, UART control DTR
#define RB_MCR_RTS 0x02 // RW, UART control RTS
#define RB_MCR_OUT1 0x04 // RW, UART control OUT1
#define RB_MCR_OUT2 0x08 // RW, UART control OUT2
#define RB_MCR_LOOP 0x10 // RW, UART0 enable local loop back
#define RB_MCR_RXTX 0x10 // RW, UART1 enable RXTX for half-duplex (TXD auto three-state output on RXD pin)
#define RB_MCR_AU_FLOW_EN 0x20 // RW, UART enable autoflow control
#define RB_MCR_TNOW 0x40 // RW, UART enable TNOW output on DTR or RTS pin
#define RB_MCR_HALF 0x80 // RW, UART enable half-duplex
#define UART_LSR 5
#define RB_LSR_DATA_RDY 0x01 // RO, UART receiver fifo data ready status
#define RB_LSR_OVER_ERR 0x02 // RZ, UART receiver overrun error
#define RB_LSR_PAR_ERR 0x04 // RZ, UART receiver parity error
#define RB_LSR_FRAME_ERR 0x08 // RZ, UART receiver frame error
#define RB_LSR_BREAK_ERR 0x10 // RZ, UART receiver break error
#define RB_LSR_TX_FIFO_EMP 0x20 // RO, UART transmitter fifo empty status
#define RB_LSR_TX_ALL_EMP 0x40 // RO, UART transmitter all empty status
#define RB_LSR_ERR_RX_FIFO 0x80 // RO, error in UART receiver fifo
#define UART_MSR 6
#define RB_MSR_CTS_CHG 0x01 // RZ, UART CTS changed status, high action
#define RB_MSR_DSR_CHG 0x02 // RZ, UART DSR changed status, high action
#define RB_MSR_RI_CHG 0x04 // RZ, UART RI changed status, high action
#define RB_MSR_DCD_CHG 0x08 // RZ, UART DCD changed status, high action
#define RB_MSR_CTS 0x10 // RO, UART CTS action status
#define RB_MSR_DSR 0x20 // RO, UART DSR action status
#define RB_MSR_RI 0x40 // RO, UART RI action status
#define RB_MSR_DCD 0x80 // RO, UART DCD action status
#define UART_ADR 7
#define UART_DIV 7
#define UART0_DMA_CTRL 8
#define RB_DMA_WR_EN 0x01 //DMA enabled when receiving data
#define RB_DMA_WR_LOOP_EN 0x02 //DMA loop mode enabled when receiving data
#define RB_DMA_WR_END_EN 0x04 //the end of DMA interrupt when receiving data is enabled
#define RB_DMA_RD_EN 0x10 //DMA enabled when sending data
#define RB_DMA_RD_LOOP_EN 0x20 //DMA loop mode enabled when sending data
#define RB_DMA_RD_END_EN 0x40 //the end of DMA interrupt when sending data is enabled
#define UART0_DMA_IF 9
#define RB_DMA_IF_PAR_ERR 0x02 //DMA parity error flag
#define RB_DMA_IF_TX_END 0x04 //DMA end flag when data is sended
#define RB_DMA_IF_FRAME_ERR 0x02 //DMA frame error flag
#define RB_DMA_IF_RX_END 0x01 //DMA end flag when data is received
#define UART_DLL 0
#define UART_DLM 1
#define MASK_UART_DMA_ADDR 0x0003ffff
/* UART interrupt identification values for IIR bits 3:0 */
#define UART_II_SLV_ADDR 0x0E // RO, UART1 slave address match
#define UART_II_LINE_STAT 0x06 // RO, UART interrupt by receiver line status
#define UART_II_RECV_RDY 0x04 // RO, UART interrupt by receiver data available
#define UART_II_RECV_TOUT 0x0C // RO, UART interrupt by receiver fifo timeout
#define UART_II_THR_EMPTY 0x02 // RO, UART interrupt by THR empty
#define UART_II_MODEM_CHG 0x00 // RO, UART interrupt by modem status change
#define UART_II_NO_INTER 0x01 // RO, no UART interrupt is pending
/* SPI0 register */
#define R32_SPI0_CONTROL (*((volatile uint32_t *)0x4040C000)) // RW, SPI0 control
#define R8_SPI0_CTRL_MOD (*((volatile uint8_t *)0x4040C000)) // RW, SPI0 mode control
#define R8_SPI0_CTRL_DMA (*((volatile uint8_t *)0x4040C001)) // RW, SPI0 DMA control
#define R8_SPI0_INTER_EN (*((volatile uint8_t *)0x4040C002)) // RW, SPI0 interrupt enable
#define R8_SPI0_CLOCK_DIV (*((volatile uint8_t *)0x4040C003)) // RW, SPI0 master clock divisor
#define R8_SPI0_SLAVE_PRE (*((volatile uint8_t *)0x4040C003)) // RW, SPI0 slave preset value
#define R32_SPI0_STATUS (*((volatile uint32_t *)0x4040C004)) // RW, SPI0 status
#define R8_SPI0_BUFFER (*((volatile uint8_t *)0x4040C004)) // RW, SPI0 data buffer
#define R8_SPI0_RUN_FLAG (*((volatile uint8_t *)0x4040C005)) // RO, SPI0 work flag
#define R8_SPI0_INT_FLAG (*((volatile uint8_t *)0x4040C006)) // RW1, SPI0 interrupt flag
#define R8_SPI0_FIFO_COUNT (*((volatile uint8_t *)0x4040C007)) // RO, SPI0 FIFO count status
#define R8_SPI0_RESET_CMD (*((volatile uint8_t *)0x4040c008)) //SPI0 reset command word register
#define R16_SPI0_TOTAL_CNT (*((volatile uint16_t *)0x4040C00C)) // RW, SPI0 total byte count, only low 12 bit
#define R32_SPI0_FIFO (*((volatile uint32_t *)0x4040C010)) // RW, SPI0 FIFO register
#define R8_SPI0_FIFO (*((volatile uint8_t *)0x4040C010)) // RO/WO, SPI0 FIFO register
#define R8_SPI0_FIFO_COUNT1 (*((volatile uint8_t *)0x4040C013)) // RO, SPI0 FIFO count status
#define R32_SPI0_DMA_NOW (*((volatile uint32_t *)0x4040C014)) // RW, SPI0 DMA current address
#define R32_SPI0_DMA_BEG (*((volatile uint32_t *)0x4040C018)) // RW, SPI0 DMA begin address
#define R32_SPI0_DMA_END (*((volatile uint32_t *)0x4040C01C)) // RW, SPI0 DMA end address
/* SPI1 register */
#define R32_SPI1_CONTROL (*((volatile uint32_t *)0x4040C800)) // RW, SPI1 control
#define R8_SPI1_CTRL_MOD (*((volatile uint8_t *)0x4040C800)) // RW, SPI1 mode control
#define R8_SPI1_CTRL_DMA (*((volatile uint8_t *)0x4040C801)) // RW, SPI1 DMA control
#define R8_SPI1_INTER_EN (*((volatile uint8_t *)0x4040C802)) // RW, SPI1 interrupt enable
#define R8_SPI1_CLOCK_DIV (*((volatile uint8_t *)0x4040C803)) // RW, SPI1 master clock divisor
#define R32_SPI1_STATUS (*((volatile uint32_t *)0x4040C804)) // RW, SPI1 status
#define R8_SPI1_BUFFER (*((volatile uint8_t *)0x4040C804)) // RW, SPI1 data buffer
#define R8_SPI1_RUN_FLAG (*((volatile uint8_t *)0x4040C805)) // RO, SPI1 work flag
#define R8_SPI1_INT_FLAG (*((volatile uint8_t *)0x4040C806)) // RW1, SPI1 interrupt flag
#define R8_SPI1_FIFO_COUNT (*((volatile uint8_t *)0x4040C807)) // RO, SPI1 FIFO count status
#define R16_SPI1_TOTAL_CNT (*((volatile uint16_t *)0x4040C80C)) // RW, SPI1 total byte count, only low 12 bit
#define R32_SPI1_FIFO (*((volatile uint32_t *)0x4040C810)) // RW, SPI1 FIFO register
#define R8_SPI1_FIFO (*((volatile uint8_t *)0x4040C810)) // RO/WO, SPI1 FIFO register
#define R8_SPI1_FIFO_COUNT1 (*((volatile uint8_t *)0x4040C813)) // RO, SPI1 FIFO count status
/* SPI register address offset and bit define */
#define SPI0_FIFO_SIZE 32 // SPI0 FIFO size (depth)
#define SPI1_FIFO_SIZE 16 // SPI1 FIFO size (depth)
#define BA_SPI0 ((volatile uint8_t *)0x4040C000) // point SPI0 base address
#define BA_SPI1 ((volatile uint8_t *)0x4040C800) // point SPI1 base address
#define SPI_CTRL_MOD 0
#define RB_SPI_MODE_SLAVE 0x01 // RW, SPI slave mode: 0=master/host, 1=slave/device
#define RB_SPI_ALL_CLEAR 0x02 // RW, force clear SPI FIFO and count
#define RB_SPI_2WIRE_MOD 0x04 // RW, SPI enable 2 wire mode: 0=3wire(SCK,MOSI,MISO), 1=2wire(SCK,MISO=SDX)
#define RB_SPI_MST_SCK_MOD 0x08 // RW, SPI master clock mode: 0=mode 0, 1=mode 3
#define RB_SPI_SLV_CMD_MOD 0x08 // RW, SPI slave command mode: 0=byte stream, 1=first byte command
#define RB_SPI_FIFO_DIR 0x10 // RW, SPI FIFO direction: 0=out(write @master mode), 1=in(read @master mode)
#define RB_SPI_SCK_OE 0x20 // RW, SPI SCK output enable
#define RB_SPI_MOSI_OE 0x40 // RW, SPI MOSI output enable
#define RB_SPI1_SDO_OE 0x40 // RW, SPI1 SDO output enable
#define RB_SPI_MISO_OE 0x80 // RW, SPI MISO output enable
#define RB_SPI1_SDI_OE 0x80 // RW, SPI1 SDI output enable, SPI1 enable 2 wire mode: 0=3wire(SCK1,SDO,SDI), 1=2wire(SCK1,SDX1)
#define SPI_CTRL_DMA 1
#define RB_SPI_DMA_ENABLE 0x01 // RW, SPI DMA enable
#define RB_SPI_DMA_BURST 0x02 // RW, SPI DMA burst enable
#define RB_SPI_DMA_LOOP 0x04 // RW, SPI DMA address loop enable
#define RB_SPI_HS_HOST 0x80 // RW, High speed host receive mode control bit
#define SPI_INTER_EN 2
#define RB_SPI_IE_CNT_END 0x01 // RW, enable interrupt for SPI total byte count end
#define RB_SPI_IE_BYTE_END 0x02 // RW, enable interrupt for SPI byte exchanged
#define RB_SPI_IE_FIFO_HF 0x04 // RW, enable interrupt for SPI FIFO half
#define RB_SPI_IE_DMA_END 0x08 // RW, enable interrupt for SPI DMA completion
#define RB_SPI_IE_FIFO_OV 0x10 // RW, enable interrupt for SPI FIFO overflow
#define RB_SPI_IE_DMA_ERR 0x20 // RW, enable interrupt for SPI DMA respond error
#define RB_SPI_IE_FST_BYTE 0x80 // RW, enable interrupt for SPI slave mode first byte received
#define SPI_CLOCK_DIV 3
#define SPI_SLAVE_PRESET 3
#define SPI_BUFFER 4
#define SPI_RUN_FLAG 5
#define RB_SPI_SLV_CMD_ACT 0x10 // RO, SPI slave command flag
#define RB_SPI_FIFO_READY 0x20 // RO, SPI FIFO ready status
#define RB_SPI_SLV_CS_LOAD 0x40 // RO, SPI slave chip-select loading status
#define RB_SPI_SLV_SELECT 0x80 // RO, SPI slave selection status
#define SPI_INT_FLAG 6
#define RB_SPI_IF_CNT_END 0x01 // RW1, interrupt flag for SPI total byte count end
#define RB_SPI_IF_BYTE_END 0x02 // RW1, interrupt flag for SPI byte exchanged
#define RB_SPI_IF_FIFO_HF 0x04 // RW1, interrupt flag for SPI FIFO half
#define RB_SPI_IF_DMA_END 0x08 // RW1, interrupt flag for SPI DMA completion
#define RB_SPI_IF_FIFO_OV 0x10 // RW1, interrupt flag for SPI FIFO overflow
#define RB_SPI_IF_DMA_ERR 0x20 // RW1, interrupt flag for SPI DMA respond error
#define RB_SPI_FREE 0x40 // RO, current SPI free status
#define RB_SPI_IF_FST_BYTE 0x80 // RW1, interrupt flag for SPI slave mode first byte received
#define SPI_FIFO_COUNT 7
#define SPI_TOTAL_CNT 0x0C
#define SPI_FIFO 0x10
#define SPI0_DMA_NOW 20
#define MASK_SPI0_DMA_ADDR 0x0003ffff //SPI DMA current address
/* Timer0 register */
#define R32_TMR0_CONTROL (*((volatile uint32_t *)0x40408000)) // RW, TMR0 control
#define R8_TMR0_CTRL_MOD (*((volatile uint8_t *)0x40408000)) // RW, TMR0 mode control
#define R8_TMR0_CTRL_DMA (*((volatile uint8_t *)0x40408001)) // RW, TMR0 DMA control
#define R8_TMR0_INTER_EN (*((volatile uint8_t *)0x40408002)) // RW, TMR0 interrupt enable
#define R32_TMR0_STATUS (*((volatile uint32_t *)0x40408004)) // RW, TMR0 status
#define R8_TMR0_INT_FLAG (*((volatile uint8_t *)0x40408006)) // RW1, TMR0 interrupt flag
#define R8_TMR0_FIFO_COUNT (*((volatile uint8_t *)0x40408007)) // RO, TMR0 FIFO count status
#define R32_TMR0_COUNT (*((volatile uint32_t *)0x40408008)) // RO, TMR0 current count
#define R16_TMR0_COUNT (*((volatile uint16_t *)0x40408008)) // RO, TMR0 current count
#define R8_TMR0_COUNT (*((volatile uint8_t *)0x40408008)) // RO, TMR0 current count
#define R32_TMR0_CNT_END (*((volatile uint32_t *)0x4040800C)) // RW, TMR0 end count value, only low 28 bit
#define R32_TMR0_FIFO (*((volatile uint32_t *)0x40408010)) // RO/WO, TMR0 FIFO register, only low 28 bit
#define R16_TMR0_FIFO (*((volatile uint16_t *)0x40408010)) // RO/WO, TMR0 FIFO register
#define R8_TMR0_FIFO (*((volatile uint8_t *)0x40408010)) // RO/WO, TMR0 FIFO register
#define R32_TMR0_DMA_NOW (*((volatile uint32_t *)0x40408014)) // RW, TMR0 DMA current address
#define R32_TMR0_DMA_BEG (*((volatile uint32_t *)0x40408018)) // RW, TMR0 DMA begin address
#define R32_TMR0_DMA_END (*((volatile uint32_t *)0x4040801C)) // RW, TMR0 DMA end address
/* Timer1 register */
#define R32_TMR1_CONTROL (*((volatile uint32_t *)0x40408400)) // RW, TMR1 control
#define R8_TMR1_CTRL_MOD (*((volatile uint8_t *)0x40408400)) // RW, TMR1 mode control
#define R8_TMR1_CTRL_DMA (*((volatile uint8_t *)0x40408401)) // RW, TMR1 DMA control
#define R8_TMR1_INTER_EN (*((volatile uint8_t *)0x40408402)) // RW, TMR1 interrupt enable
#define R8_TMR1_NRZI_CK_DIV (*((volatile uint8_t *)0x40408403)) // RW, TMR1 NRZI clock divisor, only low 4 bit, from 0 to 15
#define R32_TMR1_STATUS (*((volatile uint32_t *)0x40408404)) // RW, TMR1 status
#define R8_TMR1_NRZI_STATUS (*((volatile uint8_t *)0x40408404)) // RO, TMR1 NRZI status
#define R8_TMR1_INT_FLAG (*((volatile uint8_t *)0x40408406)) // RW1, TMR1 interrupt flag
#define R8_TMR1_FIFO_COUNT (*((volatile uint8_t *)0x40408407)) // RO, TMR1 FIFO count status
#define R32_TMR1_COUNT (*((volatile uint32_t *)0x40408408)) // RO, TMR1 current count
#define R16_TMR1_COUNT (*((volatile uint16_t *)0x40408408)) // RO, TMR1 current count
#define R8_TMR1_COUNT (*((volatile uint8_t *)0x40408408)) // RO, TMR1 current count
#define R32_TMR1_CNT_END (*((volatile uint32_t *)0x4040840C)) // RW, TMR1 end count value, only low 28 bit
#define R32_TMR1_FIFO (*((volatile uint32_t *)0x40408410)) // RO/WO, TMR1 FIFO register, only low 28 bit
#define R16_TMR1_FIFO (*((volatile uint16_t *)0x40408410)) // RO/WO, TMR1 FIFO register
#define R8_TMR1_FIFO (*((volatile uint8_t *)0x40408410)) // RO/WO, TMR1 FIFO register
#define R32_TMR1_DMA_NOW (*((volatile uint32_t *)0x40408414)) // RW, TMR1 DMA current address
#define R32_TMR1_DMA_BEG (*((volatile uint32_t *)0x40408418)) // RW, TMR1 DMA begin address
#define R32_TMR1_DMA_END (*((volatile uint32_t *)0x4040841C)) // RW, TMR1 DMA end address
/* Timer2 register */
#define R32_TMR2_CONTROL (*((volatile uint32_t *)0x40408800)) // RW, TMR2 control
#define R8_TMR2_CTRL_MOD (*((volatile uint8_t *)0x40408800)) // RW, TMR2 mode control
#define R8_TMR2_CTRL_DMA (*((volatile uint8_t *)0x40408801)) // RW, TMR2 DMA control
#define R8_TMR2_INTER_EN (*((volatile uint8_t *)0x40408802)) // RW, TMR2 interrupt enable
#define R32_TMR2_STATUS (*((volatile uint32_t *)0x40408804)) // RW, TMR2 status
#define R8_TMR2_INT_FLAG (*((volatile uint8_t *)0x40408806)) // RW1, TMR2 interrupt flag
#define R8_TMR2_FIFO_COUNT (*((volatile uint8_t *)0x40408807)) // RO, TMR2 FIFO count status
#define R32_TMR2_COUNT (*((volatile uint32_t *)0x40408808)) // RO, TMR2 current count
#define R16_TMR2_COUNT (*((volatile uint16_t *)0x40408808)) // RO, TMR2 current count
#define R8_TMR2_COUNT (*((volatile uint8_t *)0x40408808)) // RO, TMR2 current count
#define R32_TMR2_CNT_END (*((volatile uint32_t *)0x4040880C)) // RW, TMR2 end count value, only low 28 bit
#define R32_TMR2_FIFO (*((volatile uint32_t *)0x40408810)) // RO/WO, TMR2 FIFO register, only low 28 bit
#define R16_TMR2_FIFO (*((volatile uint16_t *)0x40408810)) // RO/WO, TMR2 FIFO register
#define R8_TMR2_FIFO (*((volatile uint8_t *)0x40408810)) // RO/WO, TMR2 FIFO register
#define R32_TMR2_DMA_NOW (*((volatile uint32_t *)0x40408814)) // RW, TMR2 DMA current address
#define R32_TMR2_DMA_BEG (*((volatile uint32_t *)0x40408818)) // RW, TMR2 DMA begin address
#define R32_TMR2_DMA_END (*((volatile uint32_t *)0x4040881C)) // RW, TMR2 DMA end address
/* Timer3 register */
#define R32_TMR3_CONTROL (*((volatile uint32_t *)0x40408C00)) // RW, TMR3 control
#define R8_TMR3_CTRL_MOD (*((volatile uint8_t *)0x40408C00)) // RW, TMR3 mode control
#define R8_TMR3_INTER_EN (*((volatile uint8_t *)0x40408C02)) // RW, TMR3 interrupt enable
#define R32_TMR3_STATUS (*((volatile uint32_t *)0x40408C04)) // RW, TMR3 status
#define R8_TMR3_INT_FLAG (*((volatile uint8_t *)0x40408C06)) // RW1, TMR3 interrupt flag
#define R8_TMR3_FIFO_COUNT (*((volatile uint8_t *)0x40408C07)) // RO, TMR3 FIFO count status
#define R32_TMR3_COUNT (*((volatile uint32_t *)0x40408C08)) // RO, TMR3 current count
#define R16_TMR3_COUNT (*((volatile uint16_t *)0x40408C08)) // RO, TMR3 current count
#define R8_TMR3_COUNT (*((volatile uint8_t *)0x40408C08)) // RO, TMR3 current count
#define R32_TMR3_CNT_END (*((volatile uint32_t *)0x40408C0C)) // RW, TMR3 end count value, only low 28 bit
#define R32_TMR3_FIFO (*((volatile uint32_t *)0x40408C10)) // RO/WO, TMR3 FIFO register, only low 28 bit
#define R16_TMR3_FIFO (*((volatile uint16_t *)0x40408C10)) // RO/WO, TMR3 FIFO register
#define R8_TMR3_FIFO (*((volatile uint8_t *)0x40408C10)) // RO/WO, TMR3 FIFO register
/* Timer register address offset and bit define */
#define TMR_FIFO_SIZE 8 // timer FIFO size (depth)
#define BA_TMR0 ((volatile uint8_t *)0x40408000) // point TMR0 base address
#define BA_TMR1 ((volatile uint8_t *)0x40408400) // point TMR1 base address
#define BA_TMR2 ((volatile uint8_t *)0x40408800) // point TMR2 base address
#define BA_TMR3 ((volatile uint8_t *)0x40408C00) // point TMR3 base address
#define TMR_CTRL_MOD 0
#define RB_TMR_MODE_IN 0x01 // RW, timer in mode: 0=timer/PWM/count/NRZI encode, 1=catcher/NRZI decode
#define RB_TMR_ALL_CLEAR 0x02 // RW, force clear timer FIFO and count
#define RB_TMR_COUNT_EN 0x04 // RW, timer count enable
#define RB_TMR_OUT_EN 0x08 // RW, timer output enable
#define RB_TMR_OUT_POLAR 0x10 // RW, timer PWM/NRZI encode output polarity: 0=high action, 1=low action
#define RB_TMR_CAT_WIDTH 0x10 // RW, timer catcher input pulse min width selection: 0=16*clock, 1=8*clock
#define RB_TMR_MODE_NRZI 0x20 // RW, TMR0/TMR1 NRZI mode: 0=timer/PWM/catcher, 1=NRZI encode/decode
#define RB_TMR3_MODE_COUNT 0x20 // RW, TMR3 count mode: 0=timer/PWM/catcher/NRZI, 1=count
#define RB_TMR_PWM_REPEAT 0xC0 // RW, timer PWM repeat mode: 00=1, 01=4, 10=8, 11-16
#define RB_TMR_CATCH_EDGE 0xC0 // RW, timer catcher edge mode: 00=disable, 01=edge change, 10=fall to fall, 11-rise to rise
#define TMR_CTRL_DMA 1
#define RB_TMR_DMA_ENABLE 0x01 // RW, timer DMA enable
#define RB_TMR_DMA_BURST 0x02 // RW, timer DMA burst enable
#define RB_TMR_DMA_LOOP 0x04 // RW, timer DMA address loop enable
#define TMR_INTER_EN 2
#define RB_TMR_IE_CYC_END 0x01 // RW, enable interrupt for timer catcher count timeout or PWM cycle end
#define RB_TMR_IE_DATA_ACT 0x02 // RW, enable interrupt for timer catcher input action or PWM trigger or NRZI recv packet end/tran packet end
#define RB_TMR_IE_FIFO_HF 0x04 // RW, enable interrupt for timer FIFO half
#define RB_TMR_IE_DMA_END 0x08 // RW, enable interrupt for timer DMA completion
#define RB_TMR_IE_FIFO_OV 0x10 // RW, enable interrupt for timer FIFO overflow
#define RB_TMR_IE_DMA_ERR 0x20 // RW, enable interrupt for timer DMA respond error
#define RB_TMR3_FORCE_EN 0x80 // RW, TMR3 force together timer0/1/2 count enable, independent of RB_TMR_COUNT_EN
#define TMR_NRZI_CK_DIV 3
#define TMR_NRZI_STATUS 4
#define RB_TMR_RECV_FREE 0x01 // RO, timer NRZI receiver free status, 0->1 then RB_TMR_IF_DATA_ACT for recv
#define RB_TMR_RECV_ERR 0x02 // RO, timer NRZI receiving error status, 0->1 then RB_TMR_IF_NRZI_AUX for recv
#define RB_TMR_TRAN_END 0x10 // RO, timer NRZI transmittal end status, 0->1 then RB_TMR_IF_DATA_ACT for tran
#define RB_TMR_TRAN_DOE 0x20 // RO, timer NRZI transmitter encode output enable status, 0->1 then RB_TMR_IF_NRZI_AUX for tran
#define TMR_INT_FLAG 6
#define RB_TMR_IF_CYC_END 0x01 // RW1, interrupt flag for timer catcher count timeout or PWM cycle end
#define RB_TMR_IF_DATA_ACT 0x02 // RW1, interrupt flag for timer catcher input action or PWM trigger or NRZI recv packet end/tran packet end
#define RB_TMR_IF_FIFO_HF 0x04 // RW1, interrupt flag for timer FIFO half
#define RB_TMR_IF_DMA_END 0x08 // RW1, interrupt flag for timer DMA completion
#define RB_TMR_IF_FIFO_OV 0x10 // RW1, interrupt flag for timer FIFO overflow
#define RB_TMR_IF_DMA_ERR 0x20 // RW1, interrupt flag for timer DMA respond error
#define TMR_FIFO_COUNT 7
#define TMR_COUNT 0x08
#define TMR_CNT_END 0x0C
#define TMR_FIFO 0x10
#define TMR_DMA_NOW 0x14
#define TMR_DMA_BEG 0x18
#define TMR_DMA_END 0x1C
#define MASK_TMR_DMA_ADDR 0x0003ffff
#define BA_XBUS ((uint32_t *)0x60C00000) // point XBUS base address
#define SZ_XBUS 0x00100000 // XBUS size
#include <ch564_adc.h>
#include <ch564_eth.h>
#include "ISP564.h"
#include <ch564_gpio.h>
#include <ch564_i2c.h>
#include <ch564_pwr.h>
#include <ch564_rcc.h>
#include <ch564_slv.h>
#include <ch564_spi.h>
#include <ch564_tim.h>
#include <ch564_uart.h>
#include <ch564_usb.h>
#include <ch564_usbpd.h>
#include <ch564_xbus.h>
#define BITS_CFG(REGISTER,bit,en) ((en) == ENABLE ? (REGISTER |= (uint32_t)(bit)) : (REGISTER &= (uint32_t)~(bit)))
#ifdef __cplusplus
}
#endif
#endif