⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stm32f103-s.h

📁 基于C语言的stm32系列芯片的应用开发实例
💻 H
📖 第 1 页 / 共 5 页
字号:
//=================================================================================================
//  2008.7.26
//
//   STM32_Gpioa_Regs->crh.bit.MODE8=0;
//   STM32_Gpioa_Regs->crh.bit.CNF8=0;
//
//   增加 BIT_BAND 位带区功能
//=================================================================================================
#ifndef STM32F103_H
#define STM32F103_H


typedef    unsigned char  u8;
typedef    unsigned short  u16;
typedef    unsigned long   u32;

typedef  volatile unsigned char  vu8;
typedef  volatile unsigned short  vu16;
typedef  volatile unsigned long   vu32;

typedef volatile unsigned char  Uint8;
typedef volatile unsigned short Uint16;
typedef volatile unsigned long  Uint32;



// *******************************************************************************************************
// 			3 电源控制(PWR)
// *******************************************************************************************************
//------------------------------------------------------------------------
//			电源控制寄存器(PWR_CR)
//------------------------------------------------------------------------

struct PWR_CR_BITS {
	
	Uint32  LPDS  :1;	// 0	LPDS:深睡眠下的低功耗 0:在停机模式下电压调压器开启 1:在停机模式下电压调压器处于低功耗模式
	Uint32  PDDS  :1;	// 1	PDDS:掉电深睡眠 1:CPU进入深睡眠时进入待机模式。0:当CPU进入深睡眠时进入停机模式,调压器的状态由LPDS位控制。
	Uint32  CWUF  :1;	// 2	CWUF:清除唤醒位
	Uint32  CSBF  :1;	// 3	SBF:清除待机位
	Uint32  PVDE  :1;	// 4	PVDE:电源电压监测器(PVD)使能	1:开启PVD
	Uint32  PLS   :3;	// 5:7	PLS[2:0]:PVD电平选择
	Uint32  DBP   :1;	// 8	DBP:取消后备区域的写保护  0:禁止写入RTC和后备寄存器	1:允许写入RTC和后备寄存器
	Uint32  NC    :23;	// 31:9		
};

//使用“位带别名区 每个比特膨胀成一个32 位的字  32比特膨胀到32个32位。
struct BB_PWR_CR_BITS {
	
	Uint32  LPDS;	//
	Uint32  PDDS;	//
	Uint32  CWUF;	//
	Uint32  CSBF;	//
	Uint32  PVDE;	//
	Uint32  PLS[3];	//
	Uint32  DBP;	//
	Uint32  NC[23];	//
};

union PWR_CR_REG {
   Uint32             all;
   struct PWR_CR_BITS bit;
};

//DBP:取消后备区域的写保护 1:允许写入RTC和后备寄存器
#define	 PWR_RTCDBP	((u32)0x1<<8)

// PLS[2:0]:PVD电平选择(RW)

#define	 PWR_PVD_2V2	((u32)0x0<<5)
#define	 PWR_PVD_2V3	((u32)0x1<<5)
#define	 PWR_PVD_2V4	((u32)0x2<<5)
#define	 PWR_PVD_2V5	((u32)0x3<<5)
#define	 PWR_PVD_2V6	((u32)0x4<<5)
#define	 PWR_PVD_2V7	((u32)0x5<<5)
#define	 PWR_PVD_2V8	((u32)0x6<<5)
#define	 PWR_PVD_2V9	((u32)0x7<<5)


#define	 PWR_PLS_2V2	((u8)0x0)
#define	 PWR_PLS_2V3	((u8)0x1)
#define	 PWR_PLS_2V4	((u8)0x2)
#define	 PWR_PLS_2V5	((u8)0x3)
#define	 PWR_PLS_2V6	((u8)0x4)
#define	 PWR_PLS_2V7	((u8)0x5)
#define	 PWR_PLS_2V8	((u8)0x6)
#define	 PWR_PLS_2V9	((u8)0x7)



// PVDE:电源电压监测器(PVD)使能) 1:开启PVD
#define	 PWR_PVDE	((u32)0x1<<4)

// CSBF:清除待机位 1:清除SBF待机位(写)
#define	PWR_CSBF	((u32)0x1<<3)

// CWUF:清除唤醒位 1:2个系统时钟周期后清除WUF唤醒位(写)
#define	PWR_CWUF	((u32)0x1<<2)

// PDDS:掉电深睡眠 1:CPU进入深睡眠时进入待机模式。
#define	PWR_PDDS	((u32)0x1<<1)

// LPDS:深睡眠下的低功耗 1:在停机模式下电压调压器处于低功耗模式
#define	PWR_LPDS	((u32)0x1<<0)


//--------------------------------------------------------------------
// 		电源控制/状态寄存器
//--------------------------------------------------------------------
 struct PWR_CRF_BITS {
		
	Uint32  WUF   :1;	// 0	WUF:唤醒标志
	Uint32  SBF   :1;	// 1	SBF:待机标志
	Uint32  PVDO  :1;	// 2	PVDO:PVD输出
	Uint32  NC1   :5;	// 7:3
	Uint32  EWUP  :1;	// 8	EWUP:使能WKUP管脚   1:WKUP管脚用于将CPU从 【 待机模式唤醒 】
	Uint32  NC    :23;	// 31:9		
				
};
//使用“位带别名区 每个比特膨胀成一个32 位的字  32比特膨胀到32个32位。
 struct BB_PWR_CRF_BITS {
		
	Uint32  WUF;	// 0
	Uint32  SBF;	// 1
	Uint32  PVDO;	// 2
	Uint32  NC1[5];	// 7:3
	Uint32  EWUP;	// 8
	Uint32  NC[23];	// 31:9		
				
};

union PWR_CRF_REG {
   Uint32              all;
   struct PWR_CRF_BITS bit;
};

// EWUP:使能WKUP管脚
// 1:WKUP管脚用于将CPU从待机模式唤醒,WKUP管脚被强置为输入下拉的配置(WKUP管脚上的上升沿将系统从待机模式唤醒)

#define	PWR_EWUP	((u32)0x1<<8)

//PVDO:PVD输出


struct PWR_REGS {
   union PWR_CR_REG    cr  ;     // 电源控制寄存器(PWR_CR)
   union PWR_CRF_REG   crf ;     // 电源控制/状态寄存器

};

struct BB_PWR_REGS {
   struct BB_PWR_CR_BITS    CR  ;     //
   struct BB_PWR_CRF_BITS   CFR ;     //

};




// *******************************************************************************************************
// 				4 复位和时钟控制
// *******************************************************************************************************
//--------------------------------------------------------------------
// 		时钟控制寄存器(RCC_CR)
//--------------------------------------------------------------------

 struct RCC_CR_BITS {
	
	unsigned  HSION      :1;	// 0	HSION:内部高速时钟使能
	unsigned  HSIRDY     :1;	// 1	HSIRDY:内部高速时钟就绪标志	
	unsigned  Reserved2  :1;	// 2	
	unsigned  HSITRIM    :5;	// 7:3	HSITRIM[4:0]:内部高速时钟调整
	unsigned  HSICAL     :8;	// 15:8	HSICAL[7:0]:内部高速时钟校准
	unsigned  HSEON      :1;	// 16	HSEON:外部高速时钟使能	1:HSE振荡器开启
	unsigned  HSERDY     :1;	// 17	HSERDY:外部高速时钟就绪标志	1:外部1-25MHz时钟就绪
	unsigned  HSEBYP     :1;	// 18	HSEBYP:外部高速时钟旁路	1:外部1-25MHz外部晶体振荡器被旁路。
	unsigned  CSSON      :1;	// 19	CSSON:时钟安全系统使能	1:如果外部1-25MHz时钟就绪,时钟监测器开启。	
	unsigned  Reserved1  :4;	// 23:20
	unsigned  PLLON      :1;	// 24	PLLON:PLL使能	1:PLL使能	
	unsigned  PLLRDY     :1;	// 25	PLLRDY:PLL时钟就绪标志	PLL锁定后由硬件置1。1:PLL锁定
	unsigned  Reserved0  :6;	// 31:26	
	
};

union RCC_CR_REG {

  struct  RCC_CR_BITS  bit;
  Uint32              all;

};

// PLLRDY:PLL时钟就绪标志 1:PLL锁定 (R)
#define	RCC_PLLRDY	((u32)0x1<<25)

// PLLON:PLL使能
#define	RCC_PLLON	((u32)0x1<<24)

//CSSON:时钟安全系统使能   如果外部1-25MHz时钟就绪,时钟监测器开启。
#define	RCC_CSSON	((u32)0x1<<19)

//位18 HSEBYP:外部高速时钟旁路 1:外部1-25MHz外部晶体振荡器被旁路。
#define	RCC_CR_HSEBYP	((u32)0x1<<18)

//位17 HSERDY:外部高速时钟就绪标志 (R) 1:外部1-25MHz时钟就绪
#define	RCC_HSERDY	((u32)0x1<<17)

//位16 HSEON:外部高速时钟使能 1:HSE振荡器开启
#define	RCC_HSEON	((u32)0x1<<16)

//位1 HSIRDY:内部高速时钟就绪标志    (R) 1:内部8MHz时钟就绪
#define	RCC_HSION	((u32)0x1<<1)

//--------------------------------------------------------------------
// 时钟配置寄存器(RCC_CFGR)
//--------------------------------------------------------------------

 struct RCC_CFGR_BITS {		
	unsigned  SW         :2;	// 1:0		SW:系统时钟切换
	unsigned  SWS        :2;	// 3:2		SWS:系统时钟切换状态
	unsigned  HPRE       :4;	// 7:4		HPRE: AHB预分频	
	unsigned  PPRE1      :3;	// 10:8		PPRE1:低速APB预分频(APB1)
	unsigned  PPRE2      :3;	// 13:11	PPRE2:高速APB预分频(APB2)
	unsigned  ADCPRE     :2;	// 15:14	ADCPRE:ADC预分频
	unsigned  PLLSRC     :1;	// 16		PLLSRC:PLL输入时钟源
	unsigned  PLLXTPRE   :1;	// 17		PLLXTPRE:HSE分频器作为PLL输入
	unsigned  PLLMUL     :4;	// 21:18	PLLMUL:PLL倍频系数			
	unsigned  USRPRE     :1;	// 22		USBPRE:USB预分频
	unsigned  Reserved1  :1;	// 23
	unsigned  MCO        :3;	// 26:24	MCO 微控制器时钟输出
	unsigned  Reserved0  :5;	// 31:27			
						
};


union RCC_CFGR_REG {
   Uint32                 all;
   struct RCC_CFGR_BITS  bit;
};

// USBPRE:USB预分频  1:PLL时钟直接作为USB时钟
#define	RCC_USBPRE	((u32)0x1<<22)

// PLLMUL:PLL倍频系数

#define RCC_PLL_2                     ((u32)0x0<<18)
#define RCC_PLL_3                     ((u32)0x1<<18)
#define RCC_PLL_4                     ((u32)0x2<<18)
#define RCC_PLL_5                     ((u32)0x3<<18)
#define RCC_PLL_6                     ((u32)0x4<<18)
#define RCC_PLL_7                     ((u32)0x5<<18)
#define RCC_PLL_8                     ((u32)0x6<<18)
#define RCC_PLL_9                     ((u32)0x7<<18)
#define RCC_PLL_10                    ((u32)0x8<<18)
#define RCC_PLL_11                    ((u32)0x9<<18)
#define RCC_PLL_12                    ((u32)0x10<<18)
#define RCC_PLL_13                    ((u32)0x11<<18)
#define RCC_PLL_14                    ((u32)0x12<<18)
#define RCC_PLL_15                    ((u32)0x13<<18)
#define RCC_PLL_16                    ((u32)0x14<<18)

#define RCC_PLL_2_B                     ((u8)0x0)
#define RCC_PLL_3_B                     ((u8)0x1)
#define RCC_PLL_4_B                     ((u8)0x2)
#define RCC_PLL_5_B                     ((u8)0x3)
#define RCC_PLL_6_B                     ((u8)0x4)
#define RCC_PLL_7_B                     ((u8)0x5)
#define RCC_PLL_8_B                     ((u8)0x6)
#define RCC_PLL_9_B                     ((u8)0x7)
#define RCC_PLL_10_B                    ((u8)0x8)
#define RCC_PLL_11_B                    ((u8)0x9)
#define RCC_PLL_12_B                    ((u8)0x10)
#define RCC_PLL_13_B                    ((u8)0x11)
#define RCC_PLL_14_B                    ((u8)0x12)
#define RCC_PLL_15_B                    ((u8)0x13)
#define RCC_PLL_16_B                    ((u8)0x14)


// PLLXTPRE:HSE分频器作为PLL输入  0:HSE不分频 1:HSE 2分频

#define	RCC_PLLSource_HSE_DIV2	((u32)0x1<<17)

// PLLSRC:PLL输入时钟源 0:HSI时钟2分频后作为PLL输入时钟 1:HSE时钟作为PLL输入时钟。

#define	RCC_PLLSource_HSI_DIV2	((u32)0x0<<16)
#define	RCC_PLLSource_HSE_DIV1	((u32)0x1<<16)

// ADCPRE:ADC预分频  00:PCLK2 2分频后作为ADC时钟

#define RCC_ADCPRE_PCLK2_DIV2	((u32)0x0<<14)
#define RCC_ADCPRE_PCLK2_DIV4	((u32)0x1<<14)
#define RCC_ADCPRE_PCLK2_DIV6	((u32)0x2<<14)
#define RCC_ADCPRE_PCLK2_DIV8	((u32)0x3<<14)

#define RCC_ADCPRE_PCLK2_DIV2_B	((u8)0x0)
#define RCC_ADCPRE_PCLK2_DIV4_B	((u8)0x1)
#define RCC_ADCPRE_PCLK2_DIV6_B	((u8)0x2)
#define RCC_ADCPRE_PCLK2_DIV8_B	((u8)0x3)
// PPRE2:高速APB预分频(APB2) 0xx:HCLK不分频

#define RCC_APB2_HCLK_DIV1	((u32)0x0<<11)
#define RCC_APB2_HCLK_DIV2	((u32)0x4<<11)
#define RCC_APB2_HCLK_DIV4	((u32)0x5<<11)
#define RCC_APB2_HCLK_DIV8	((u32)0x6<<11)
#define RCC_APB2_HCLK_DIV16	((u32)0x7<<11)

#define RCC_APB2_HCLK_DIV1_B	((u8)0x0)
#define RCC_APB2_HCLK_DIV2_B	((u8)0x4)
#define RCC_APB2_HCLK_DIV4_B	((u8)0x5)
#define RCC_APB2_HCLK_DIV8_B	((u8)0x6)
#define RCC_APB2_HCLK_DIV16_B	((u8)0x7)


// PPRE1:低速APB预分频(APB1)必须保证APB1时钟频率不超过36MHz 0xx:HCLK不分频

#define RCC_APB1_HCLK_DIV1	(u32)0x0<<8)
#define RCC_APB1_HCLK_DIV2	((u32)0x4<<8)
#define RCC_APB1_HCLK_DIV4	((u32)0x5<<8)
#define RCC_APB1_HCLK_DIV8	((u32)0x6<<8)
#define RCC_APB1_HCLK_DIV16	((u32)0x7<<8)

#define RCC_APB1_HCLK_DIV1_B	(u8)0x0)
#define RCC_APB1_HCLK_DIV2_B	((u8)0x4)
#define RCC_APB1_HCLK_DIV4_B	((u8)0x5)
#define RCC_APB1_HCLK_DIV8_B	((u8)0x6)
#define RCC_APB1_HCLK_DIV16_B	((u8)0x7)

// HPRE: AHB预分频  0xxx:SYSCLK不分频
// 当AHB时钟的预分频系数大于1时,必须保持预取缓冲器开启

#define RCC_AHB_SYSCLK_DIV1	((u32)0x0<<4)
#define RCC_AHB_SYSCLK_DIV2	((u32)0x8<<4)
#define RCC_AHB_SYSCLK_DIV4	((u32)0x9<<4)
#define RCC_AHB_SYSCLK_DIV8	((u32)0xA<<4)
#define RCC_AHB_SYSCLK_DIV16	((u32)0xB<<4)
#define RCC_AHB_SYSCLK_DIV64	((u32)0xC<<4)
#define RCC_AHB_SYSCLK_DIV128	((u32)0xD<<4)
#define RCC_AHB_SYSCLK_DIV256	((u32)0xE<<4)
#define RCC_AHB_SYSCLK_DIV512	((u32)0xF<<4)

#define RCC_AHB_SYSCLK_DIV1_B	((u8)0x0)
#define RCC_AHB_SYSCLK_DIV2_B	((u8)0x8)
#define RCC_AHB_SYSCLK_DIV4_B	((u8)0x9)
#define RCC_AHB_SYSCLK_DIV8_B	((u8)0xA)
#define RCC_AHB_SYSCLK_DIV16_B	((u8)0xB)
#define RCC_AHB_SYSCLK_DIV64_B	((u8)0xC)
#define RCC_AHB_SYSCLK_DIV128_B	((u8)0xD)
#define RCC_AHB_SYSCLK_DIV256_B	((u8)0xE)
#define RCC_AHB_SYSCLK_DIV512_B	((u8)0xF)

// SWS:系统时钟切换状态
#define  RCC_SWS_SYSCLK_HSI	((u32)0x0<<2)
#define  RCC_SWS_SYSCLK_HSE	((u32)0x1<<2)
#define  RCC_SWS_SYSCLK_PLL	((u32)0x2<<2)


#define  RCC_SWS_SYSCLK_HSI_B	((u8)0x0)
#define  RCC_SWS_SYSCLK_HSE_B	((u8)0x1)
#define  RCC_SWS_SYSCLK_PLL_B	((u8)0x2)

// SW:系统时钟切换 00:HSI作为系统时钟

#define  RCC_SW_SYSCLK_HSI	((u32)0x0<<0)
#define  RCC_SW_SYSCLK_HSE	((u32)0x1<<0)
#define  RCC_SW_SYSCLK_PLL	((u32)0x2<<0)

//--------------------------------------------------------------------
// 时钟中断寄存器 (RCC_CIR)
//--------------------------------------------------------------------

 struct RCC_CIR_BITS {
	
	unsigned  LSIRDYF    :1;	// 0		LSIRDYF:LSI就绪中断标志
	unsigned  LSERDYF    :1;	// 1		LSERDYF:LSE就绪中断标志
	unsigned  HSIRDYF    :1;	// 2		HSIRDYF:HSI就绪中断标志
	unsigned  HSERDYF    :1;	// 3		HSERDYF:HSE就绪中断标志		
	unsigned  PLLRDYF    :1;	// 4		PLLRDYF:PLL就绪中断标志				
	unsigned  Reserved3  :2;	// 6:5
	unsigned  CSSF       :1;	// 7		CSSF:时钟安全系统中断标志
	unsigned  LSIRDYIE   :1;	// 8		LSIRDYIE:LSI就绪中断使能
	unsigned  LSERDYIE   :1;	// 9		LSERDYIE:LSE就绪中断使能
	unsigned  HSIRDYIE   :1;	// 10		HSIRDYIE:HSI就绪中断使能		
	unsigned  HSERDYIE   :1;	// 11		HSERDYIE:HSE就绪中断使能	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -