STM32函数头文件1

tech2026-10-01  32

Untitled1 * //======================================================================================================== // 主要是STM32的库太复杂,而且依赖性太强了, // 参照 TI DSP2812等头文件的方案,而且参照了HOTPOWER、 COMPUTER00等大侠的启发。写了这个头文件 // 加了 位段的 中文注释。 还未验证,不知这样的位段写法是否可以!? 希望各位指点指点!谢谢! // 2008.7 netjob // // 使用方法: // STM32_Gpioa_Regs->crh.bit.MODE8=1; // STM32_Gpioa_Regs->crh.bit.CNF8=2; // // //======================================================================================================== #ifndef STM32F103_H #define STM32F103_H #include "D:\stm32-code\tpjj\stm32f103.h" //typedef unsigned char u8; //typedef unsigned short u16; //typedef unsigned long u32; typedef volatile unsigned char Uint8; typedef volatile unsigned short Uint16; typedef volatile unsigned long Uint32; // ******************************************************************************************************* // 3 电源控制(PWR) // ******************************************************************************************************* //------------------------------------------------------------------------ // 电源控制寄存器(PWR_CR) //------------------------------------------------------------------------ //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) // 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) //-------------------------------------------------------------------- // 电源控制/状态寄存器 //-------------------------------------------------------------------- // EWUP:使能WKUP管脚 // 1:WKUP管脚用于将CPU从待机模式唤醒,WKUP管脚被强置为输入下拉的配置(WKUP管脚上的上升沿将系统从待机模式唤醒) #define PWR_EWUP ((u32)0x1<<8) //PVDO:PVD输出 struct PWR_CR_BITS { Uint32 NC :23; // 31:9 Uint32 DBP :1; // 8 Uint32 PLS :3; // 5 Uint32 PVDE :1; // 4 Uint32 CSBF :1; // 3 Uint32 CWUF :1; // 2 Uint32 PDDS :1; // 1 Uint32 LPDS :1; // 0 }; union PWR_CR_REG { Uint32 all; struct PWR_CR_BITS bit; Page 1 of 33 Untitled1 * }; struct PWR_CRF_BITS { Uint32 NC :23; // 31:9 Uint32 EWUP :1; // 8 Uint32 NC1 :5; // 7:3 Uint32 PVDO :1; // 2 Uint32 SBF :1; // 1 Uint32 WUF :1; // 0 }; union PWR_CRF_REG { Uint32 all; struct PWR_CRF_BITS bit; }; struct PWR_REGS { union PWR_CR_REG cr ; // 电源控制寄存器(PWR_CR) union PWR_CRF_REG crf ; // 电源控制/状态寄存器 }; // ******************************************************************************************************* // 4 复位和时钟控制 // ******************************************************************************************************* //-------------------------------------------------------------------- // 时钟控制寄存器(RCC_CR) //-------------------------------------------------------------------- // 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) //-------------------------------------------------------------------- // 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) // 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)0x1<<16) #define RCC_PLLSource_HSE_DIV1 ((u32)0x1<<16) // ADCPRE:ADC预分频 00:PCLK2 2分频后作为ADC时钟 Page 2 of 33 Untitled1 * #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) // 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) // 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) // 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) // 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) // 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) //-------------------------------------------------------------------- // CSSC:时钟安全系统中断清除 // 由软件置1来清除CSSF安全系统中断标志位CSSF。在清除操作完成后,该位由硬件复位 #define RCC_CSSCF ((u32)0x1<<23) // PLLRDYC:PLL就绪中断清除 #define RCC_PLLRDYFC ((u32)0x1<<20) // HSERDYC:HSE就绪中断清除 1: HSE就绪中断标志位HSERDYF清零 #define RCC_HSERDYC ((u32)0x1<<19) // HSIRDYC HSI就绪中断清除 #define RCC_HSIRDYC ((u32)0x1<<18) // LSERDYC:LSE就绪中断清除 #define RCC_LSERDYC ((u32)0x1<<17) // LSIRDYC:LSI就绪中断清除 #define RCC_LSIRDYC ((u32)0x1<<16) // PLLRDYIE:PLL就绪中断使能 #define RCC_PLLRDYIE ((u32)0x1<<12) // HSERDYIE:HSE就绪中断使能 1:HSE就绪中断使能 #define RCC_HSERDYIE ((u32)0x1<<11) // HSIRDYIE:HSI就绪中断使能 #define RCC_HSIRDYIE ((u32)0x1<<10) // LSERDYIE:LSE就绪中断使能 #define RCC_LSERDYIE ((u32)0x1<<9) // LSIRDYIE:LSI就绪中断使能 #define RCC_LSIRDYIE ((u32)0x1<<8) // CSSF:时钟安全系统中断标志 1:产生HSE时钟失效安全系统中断 #define RCC_CSSF ((u32)0x1<<7) // PLLRDYF:PLL就绪中断标志 #define RCC_PLLRDYF ((u32)0x1<<4) // HSERDYF:HSE就绪中断标志 Page 3 of 33 Untitled1 * #define RCC_HSERDYF ((u32)0x1<<3) // HSIRDYF:HSI就绪中断标志 1:产生内部8MHz RC振荡器就绪中断 #define RCC_HSIRDYF ((u32)0x1<<2) // LSERDYF:LSE就绪中断标志 1:产生外部32kHz振荡器就绪中断 #define RCC_LSERDYF ((u32)0x1<<1) // LSIRDYF:LSI就绪中断标志 #define RCC_LSIRDYF ((u32)0x1<<0) //-------------------------------------------------------------------- // APB2 外设复位寄存器 (RCC_APB2RSTR) //-------------------------------------------------------------------- // USART1RST:USART1复位 0:无效 1:复位USART1 #define RCC_USART1RST ((u32)0x1<<14) // SPI1RST:SPI1复位 #define RCC_SPI1RST ((u32)0x1<<12) // TIM1RST:TIM1复位 #define RCC_TIM1RST ((u32)0x1<<11) // ADC2RST:ADC2复位 #define RCC_ADC2RST ((u32)0x1<<10) // ADC1RST:ADC1复位 #define RCC_ADC1RST ((u32)0x1<<9) // IOPERST:IO口E复位 #define RCC_IOPERST ((u32)0x1<<6) // IOPDRST:IO口D复位 #define RCC_IOPDRST ((u32)0x1<<5) // IOPCRST:IO口C复位 #define RCC_IOPCRST ((u32)0x1<<4) // IOPBRST:IO口B复位 #define RCC_IOPBRST ((u32)0x1<<3) // IOPARST:IO口A复位 #define RCC_IOPARST ((u32)0x1<<2) // AFIORST:辅助功能IO复位 #define RCC_AFIORST ((u32)0x1<<0) //-------------------------------------------------------------------- //APB1 外设复位寄存器 (RCC_APB1RSTR) //-------------------------------------------------------------------- // PWRRST:电源复位 0:无效 1:复位电源电路 #define RCC_PWRRST ((u32)0x1<<28) // BKPRST:备份复位 #define RCC_BKPRST ((u32)0x1<<27) // CANRST:CAN复位 #define RCC_CANRST ((u32)0x1<<25) // USBRST:USB复位 #define RCC_USBRST ((u32)0x1<<23) // I2C2RST:I2C 2复位 #define RCC_I2C2RST ((u32)0x1<<22) // I2C1RST:I2C 1复位 #define RCC_I2C1RST ((u32)0x1<<21) // USART3RST:USART3复位 #define RCC_USART3RST ((u32)0x1<<18) // USART2RST:USART2复位 #define RCC_USART2RST ((u32)0x1<<17) // SPI2RST:SPI2复位 #define RCC_SPI2RST ((u32)0x1<<14) // WWDGRST:窗口看门狗复位 #define RCC_WWDGRST ((u32)0x1<<11) // TIM4RST:定时器4复位 #define RCC_TIM4RST ((u32)0x1<<2) // TIM3RST:定时器3复位 #define RCC_TIM3RST ((u32)0x1<<1) // TIM2RST:定时器2复位 #define RCC_TIM2RST ((u32)0x1<<0) //-------------------------------------------------------------------- Page 4 of 33 Untitled1 * // AHB外设时钟使能寄存器 (RCC_AHBENR //-------------------------------------------------------------------- // FLITFEN:闪存接口电路时钟使能 #define RCC_FLITFEN ((u32)0x1<<4) // SRAMEN:SRAM时钟使能 #define RCC_SRAMEN ((u32)0x1<<2) // DMAEN:DMA时钟使能 #define RCC_DMAEN ((u32)0x1<<0) //-------------------------------------------------------------------- // APB2 外设时钟使能寄存器(RCC_APB2ENR) //-------------------------------------------------------------------- // USART1EN:USART1时钟使能 0:USART1时钟关闭 1:USART1时钟开启 #define RCC_USART1EN ((u32)0x1<<14) // SPI1EN:SPI1时钟使能 #define RCC_SPI1EN ((u32)0x1<<12) // TIM1EN:TIM1时钟使能 #define RCC_TIM1EN ((u32)0x1<<11) // ADC2EN:ADC2时钟使能 #define RCC_ADC2EN ((u32)0x1<<10) // ADC1EN:ADC1时钟使能 #define RCC_ADC1EN ((u32)0x1<<9) // IOPEEN:IO口E时钟使能 #define RCC_IOPEEN ((u32)0x1<<6) // IOPDEN:IO口D时钟使能 #define RCC_IOPDEN ((u32)0x1<<5) // IOPCEN:IO口C时钟使能 #define RCC_IOPCEN ((u32)0x1<<4) // IOPBEN:IO口B时钟使能 #define RCC_IOPBEN ((u32)0x1<<3) // IOPAEN:IO口A时钟使能 #define RCC_IOPAEN ((u32)0x1<<2) // AFIOEN:辅助功能IO时钟使能 #define RCC_AFIOEN ((u32)0x1<<0) //-------------------------------------------------------------------- // APB1 外设时钟使能寄存器(RCC_APB1ENR) //-------------------------------------------------------------------- // PWREN:电源时钟使能 0:电源时钟关闭 1:电源时钟开启 #define RCC_PWREN ((u32)0x1<<28) // BKPEN:备份时钟使能 #define RCC_BKPEN ((u32)0x1<<27) // CANEN:CAN时钟使能 #define RCC_CANEN ((u32)0x1<<25) // USBEN:USB时钟使能 #define RCC_USBEN ((u32)0x1<<23) // I2C2EN:I2C 2时钟使能 #define RCC_I2C2EN ((u32)0x1<<22) // I2C1EN:I2C 1时钟使能 #define RCC_I2C1EN ((u32)0x1<<21) // USART3EN:USART 3时钟使能 #define RCC_USART3EN ((u32)0x1<<18) // USART2EN:USART 2时钟使能 #define RCC_USART2EN ((u32)0x1<<17) // SPI2EN:SPI 2时钟使能 #define RCC_SPI2EN ((u32)0x1<<14) // WWDGEN:窗口看门狗时钟使能 #define RCC_WWDGEN ((u32)0x1<<11) // TIM4EN:定时器4时钟使能 #define RCC_TIM4EN ((u32)0x1<<2) // TIM3EN:定时器3时钟使能 #define RCC_TIM3EN ((u32)0x1<<1) // TIM2EN:定时器2时钟使能 #define RCC_TIM2EN ((u32)0x1<<0) Page 5 of 33 Untitled1 * //-------------------------------------------------------------------- //备份域控制寄存器 (RCC_BDCR) //-------------------------------------------------------------------- //BDRST:备份域软件复位 1:复位整个备份域 #define RCC_BDRST ((u32)0x1<<16) // RTCEN:RTC时钟使能 #define RCC_RTCEN ((u32)0x1<<15) // RTCSEL[1:0]:RTC时钟源选择 // 00:无时钟 // 01:LSE振荡器作为RTC时钟 // 10:LSI振荡器作为RTC时钟 // 11:HSE振荡器在128分频后作为RTC时钟 #define RCC_RTCSEL_NONE ((u32)0x0<<8) #define RCC_RTCSEL_LSE ((u32)0x1<<8) #define RCC_RTCSEL_LSI ((u32)0x2<<8) #define RCC_RTCSEL_HSE_DIV128 ((u32)0x3<<8) // LSEBYP:外部低速时钟振荡器旁路 #define RCC_LSEBYP ((u32)0x1<<2) // LSERDY:外部低速LSE就绪 #define RCC_LSERDY ((u32)0x1<<1) // LSEON:外部低速振荡器使能 #define RCC_LSEON ((u32)0x1<<0) //-------------------------------------------------------------------- // 控制/状态寄存器 (RCC_CSR) //-------------------------------------------------------------------- // 位31 LPWRRSTF:低功耗复位标志 // 位30 WWDGRSTF:窗口看门狗复位标志 // 位29 IWDGRSTF:独立看门狗复位标志 // 位28 SFTRSTF:软件复位标志 // 位27 PORRSTF:上电/掉电复位标志 // 位26 PINRSTF:NRST管脚复位标志 // 位24 RMVF 清除复位标志 // 位1 LSIRDY:内部低速时钟就绪 // 位0 LSION:内部低速振荡器使能 0:内部40kHz RC振荡器关闭 #define RCC_LSION ((u32)0x1<<0) struct RCC_CR_BITS { Uint32 Reserved0 :23; // 31:26 Uint32 PLLRDY :1; // 25 Uint32 PLLON :1; // 24 Uint32 Reserved1 :4; // 23:20 Uint32 CSSON :1; // 19 Uint32 HSEBYP :1; // 18 Uint32 HSERDY :1; // 17 Uint32 HSEON :1; // 16 Uint32 HSICAL :8; // 15:8 Uint32 HSITRIM :5; // 7:3 Uint32 Reserved2 :1; // 2 Uint32 HSIRDY :1; // 1 Uint32 HSION :1; // 0 }; union RCC_CR_REG { Uint32 all; struct RCC_CR_BITS bit; }; struct RCC_CRFGR_BITS { Uint32 Reserved0 :5; // 31:27 Uint32 MCO :3; // 26:24 Uint32 Reserved1 :1; // 23 Uint32 USRPRE :1; // 22 Uint32 PLLMUL :4; // 21:18 Uint32 PLLXTPRE :1; // 17 Uint32 PLLSRC :1; // 16 Uint32 ADCPRE :1; // 15:14 Uint32 PPRE2 :2; // 13:11 Uint32 PPRE1 :2; // 10:8 Uint32 HPRE :3; // 7:4 Uint32 SWS :2; // 3:2 Uint32 SW :2; // 1:0 }; union RCC_CRFGR_REG { Uint32 all; struct RCC_CRFGR_BITS bit; }; Page 6 of 33 Untitled1 * struct RCC_CIR_BITS { Uint32 Reserved0 :5; // 31:24 Uint32 CSSC :1; // 23 Uint32 Reserved1 :2; // 22:21 Uint32 PLLRDYC :1; // 20 Uint32 HSERDYC :1; // 19 Uint32 HSIRDYC :1; // 18 Uint32 LSERDYC :1; // 17 Uint32 LSIRDYC :1; // 16 Uint32 Reserved2 :2; // 15:13 Uint32 PLLRDYIE :1; // 12 Uint32 HSERDYIE :1; // 11 Uint32 HSIRDYIE :1; // 10 Uint32 LSERDYIE :1; // 9 Uint32 LSIRDYIE :1; // 8 Uint32 CSSF :1; // 7 Uint32 Reserved3 :2; // 6:5 Uint32 PLLRDYF :1; // 4 Uint32 HSERDYF :1; // 3 Uint32 HSIRDYF :1; // 2 Uint32 LSERDYF :1; // 1 Uint32 LSIRDYF :1; // 0 }; union RCC_CIR_REG { Uint32 all; struct RCC_CIR_BITS bit; }; struct RCC_APB2RSTR_BITS { Uint32 Reserved0 :17; // 31:15 Uint32 USART1RST :1; // 14 Uint32 Reserved1 :1; // 13 Uint32 SPI1RST :1; // 12 Uint32 TIM1RST :1; // 11 Uint32 ADC2RST :1; // 10 Uint32 ADC1RST :1; // 9 Uint32 Reserved2 :2; // 8:7 Uint32 IOPERST :1; // 6 Uint32 IOPDRST :1; // 5 Uint32 IOPCRST :1; // 4 Uint32 IOPBRST :1; // 3 Uint32 IOPARST :1; // 2 Uint32 Reserved3 :1; // 1 Uint32 AFIORST :1; // 0 }; union RCC_APB2RSTR_REG { Uint32 all; struct RCC_APB2RSTR_BITS bit; }; struct RCC_APB1RSTR_BITS { Uint32 Reserved0 :3; // 31:29 Uint32 PWRRST :1; // 28 Uint32 BKPRST :1; // 27 Uint32 Reserved1 :1; // 26 Uint32 CANRST :1; // 25 Uint32 Reserved2 :1; // 24 Uint32 USBRST :1; // 23 Uint32 I2C2RST :1; // 22 Uint32 I2C1RST :1; // 21 Uint32 Reserved3 :2; // 20:19 Uint32 USART3RST :1; // 18 Uint32 USART2RST :1; // 17 Uint32 Reserved4 :2; // 16:15 Uint32 SPI2RST :1; // 14 Uint32 Reserved5 :2; // 13:12 Uint32 WWDGRST :1; // 11 Uint32 Reserved6 :8; // 10:3 Uint32 TIM4RST :1; // 2 Uint32 TIM3RST :1; // 1 Uint32 TIM2RST :1; // 0 }; union RCC_APB1RSTR_REG { Uint32 all; struct RCC_APB1RSTR_BITS bit; }; struct RCC_AHBENR_BITS { Uint32 Reserved0 :27; // 31:5 Uint32 FLITFEN :1; // 4 Uint32 Reserved1 :1; // 3 Uint32 SRAMEN :1; // 2 Uint32 Reserved2 :1; // 1 Page 7 of 33 Untitled1 * Uint32 DMAEN :1; // 0 }; union RCC_AHBENR_REG { Uint32 all; struct RCC_AHBENR_BITS bit; }; struct RCC_APB2ENR_BITS { Uint32 Reserved0 :17; // 31:15 Uint32 USART1EN :1; // 14 Uint32 Reserved1 :1; // 13 Uint32 SPI1EN :1; // 12 Uint32 TIM1EN :1; // 11 Uint32 ADC2EN :1; // 10 Uint32 ADC1EN :1; // 9 Uint32 Reserved2 :2; // 8:7 Uint32 IOPEEN :1; // 6 Uint32 IOPDEN :1; // 5 Uint32 IOPCEN :1; // 4 Uint32 IOPBEN :1; // 3 Uint32 IOPAEN :1; // 2 Uint32 Reserved3 :1; // 1 Uint32 AFIOEN :1; // 0 }; union RCC_APB2ENR_REG { Uint32 all; struct RCC_APB2ENR_BITS bit; }; struct RCC_APB1ENR_BITS { Uint32 Reserved0 :3; // 31:29 Uint32 PWREN :1; // 28 Uint32 BKPEN :1; // 27 Uint32 Reserved1 :1; // 26 Uint32 CANEN :1; // 25 Uint32 Reserved2 :1; // 24 Uint32 USBEN :1; // 23 Uint32 I2C2EN :1; // 22 Uint32 I2C1EN :1; // 21 Uint32 Reserved3 :1; // 20:19 Uint32 USART3EN :1; // 18 Uint32 USART2EN :1; // 17 Uint32 Reserved4 :1; // 16:15 Uint32 SPI2EN :1; // 14 Uint32 Reserved5 :1; // 13:12 Uint32 WWDGEN :1; // 11 Uint32 Reserved6 :1; // 10:3 Uint32 TIM4EN :1; // 2 Uint32 TIM3EN :1; // 1 Uint32 TIM2EN :1; // 0 }; union RCC_APB1ENR_REG { Uint32 all; struct RCC_APB1ENR_BITS bit; }; struct RCC_BDCR_BITS { Uint32 Reserved0 :15; // 31:17 Uint32 BDRST :1; // 16 Uint32 RTCEN :1; // 15 Uint32 Reserved1 :5; // 14:10 Uint32 RTCSEL :2; // 9:8 Uint32 Reserved2 :1; // 7:3 Uint32 LSEBYP :1; // 2 Uint32 LSERDY :1; // 1 Uint32 LSEON :1; // 0 }; union RCC_BDCR_REG { Uint32 all; struct RCC_BDCR_BITS bit; }; struct RCC_CSR_BITS { Uint32 LPWRRSTF :1; // 31 Uint32 WWDGRSTF :1; // 30 Uint32 IWDGRSTF :1; // 29 Uint32 SFTRSTF :1; // 28 Uint32 PORRSTF :1; // 27 Uint32 PINRSTF :1; // 26 Uint32 Reserved0 :1; // 25 Uint32 RMVF :1; // 24 Page 8 of 33 Untitled1 * Uint32 Reserved1 :22; // 23:2 Uint32 LSIRDY :1; // 1 Uint32 LSION :1; // 0 }; union RCC_CSR_REG { Uint32 all; struct RCC_BDCR_BITS bit; }; //------------------------------------------------------------------------ struct RCC_REGS { union RCC_CR_REG cr ; // 时钟控制寄存器 (RCC_CR) union RCC_CRFGR_REG crfgr ; // 时钟配置寄存器 (RCC_CFGR) union RCC_CIR_REG cir ; // 时钟中断寄存器 (RCC_CIR) union RCC_APB2RSTR_REG apb2rstr; // APB2 外设复位寄存器 (RCC_APB2RSTR) union RCC_APB1RSTR_REG apb1rstr; // APB1 外设复位寄存器 (RCC_APB1RSTR) union RCC_AHBENR_REG ahbenr; // AHB外设时钟使能寄存器 (RCC_AHBENR) union RCC_APB2ENR_REG apb2enr; // APB2 外设时钟使能寄存器 (RCC_APB2ENR) union RCC_APB1ENR_REG apb1enr; // APB1 外设时钟使能寄存器 (RCC_APB1ENR) union RCC_BDCR_REG bdcr; // 备份域控制寄存器 (RCC_BDCR) union RCC_CSR_REG csr; // 控制/状态寄存器 (RCC_CSR) }; // ******************************************************************************************************* // 5 通用和复用功能I/O(GPIO和AFIO) // ******************************************************************************************************* //-------------------------------------------------------------------- // 端口配置寄存器(GPIOx_CRL) (x=A..E) //-------------------------------------------------------------------- // CNFy[1:0]:端口x配置位(y = 0… 7) // 软件通过这些位配置相应的I/O端口,请参考表11端口位配置表。 // 在输入模式(MODE[1:0]=00): // 00:模拟输入模式 // 01:浮空输入模式(复位后的状态) // 10:上拉/下拉输入模式 // 11:保留 // 在输出模式(MODE[1:0]>00): // 00:通用推挽输出模式 // 01:通用开漏输出模式 // 10:复用功能推挽输出模式 // 11:复用功能开漏输出模式 //-------------------------------------------------------------------- // MODEy[1:0]:端口x的模式位(y = 0… 7) // 软件通过这些位配置相应的I/O端口,请参考表11端口位配置表。 // 00:输入模式(复位后的状态) // 01:输出模式,最大速度10MHz // 10:输出模式,最大速度2MHz // 11:输出模式,最大速度50MHz struct GPIO_CRL_BITS { Uint32 MODE0 :2; // 31:30 Uint32 CNF0 :2; // 29:28 Uint32 MODE1 :2; // 27:26 Uint32 CNF1 :2; // 25:24 Uint32 MODE2 :2; // 23:22 Uint32 CNF2 :2; // 21:20 Uint32 MODE3 :2; // 19:18 Uint32 CNF3 :2; // 17:16 Uint32 MODE4 :2; // 15:14 Uint32 CNF4 :2; // 13:12 Uint32 MODE5 :2; // 11:10 Uint32 CNF5 :2; // 9:8 Uint32 MODE6 :2; // 7:6 Uint32 CNF6 :2; // 5:4 Uint32 MODE7 :2; // 3:2 Uint32 CNF7 :2; // 1:0 }; union GPIO_CRL_REG { Uint32 all; struct GPIO_CRL_BITS bit; }; //-------------------------------------------------------------------- // 端口配置寄存器(GPIOx_CRL) (x=A..E) //-------------------------------------------------------------------- // CNFy[1:0]:端口x配置位(y = 8… 15) // 软件通过这些位配置相应的I/O端口,请参考表11端口位配置表。 // 在输入模式(MODE[1:0]=00): // 00:模拟输入模式 // 01:浮空输入模式(复位后的状态) // 10:上拉/下拉输入模式 // 11:保留 // 在输出模式(MODE[1:0]>00): // 00:通用推挽输出模式 // 01:通用开漏输出模式 // 10:复用功能推挽输出模式 // 11:复用功能开漏输出模式 Page 9 of 33 Untitled1 * //-------------------------------------------------------------------- // MODEy[1:0]:端口x的模式位(y = 8… 15) // 软件通过这些位配置相应的I/O端口,请参考表11端口位配置表。 // 00:输入模式(复位后的状态) // 01:输出模式,最大速度10MHz // 10:输出模式,最大速度2MHz // 11:输出模式,最大速度50MHz struct GPIO_CRH_BITS { Uint32 MODE8 :2; // 31:30 Uint32 CNF8 :2; // 29:28 Uint32 MODE9 :2; // 27:26 Uint32 CNF9 :2; // 25:24 Uint32 MODE10 :2; // 23:22 Uint32 CNF10 :2; // 21:20 Uint32 MODE11 :2; // 19:18 Uint32 CNF11 :2; // 17:16 Uint32 MODE12 :2; // 15:14 Uint32 CNF12 :2; // 13:12 Uint32 MODE13 :2; // 11:10 Uint32 CNF13 :2; // 9:8 Uint32 MODE14 :2; // 7:6 Uint32 CNF14 :2; // 5:4 Uint32 MODE15 :2; // 3:2 Uint32 CNF15 :2; // 1:0 }; union GPIO_CRH_REG { Uint32 all; struct GPIO_CRH_BITS bit; }; struct GPIO_IDR_BITS { Uint32 Reserved0 :16; // 31:16 端口输入数据(y = 0… 15) 这些位为只读并只能以字(16位)的形式读出。读出的值为对应I/O口的状态。 Uint32 IDR15 :1; // 15 Uint32 IDR14 :1; // 14 Uint32 IDR13 :1; // 13 Uint32 IDR12 :1; // 12 Uint32 IDR11 :1; // 11 Uint32 IDR10 :1; // 10 Uint32 IDR9 :1; // 9 Uint32 IDR8 :1; // 8 Uint32 IDR7 :1; // 7 Uint32 IDR6 :1; // 6 Uint32 IDR5 :1; // 5 Uint32 IDR4 :1; // 4 Uint32 IDR3 :1; // 3 Uint32 IDR2 :1; // 2 Uint32 IDR1 :1; // 1 Uint32 IDR0 :1; // 0 }; union GPIO_IDR_REG { Uint32 all; struct GPIO_IDR_BITS bit; }; struct GPIO_ODR_BITS { Uint32 Reserved0 :16; // 31:16 端口输出数据(y = 0… 15) 这些位可读可写并只能以字(16位)的形式操作。 Uint32 ODR15 :1; // 15 Uint32 ODR14 :1; // 14 Uint32 ODR13 :1; // 13 Uint32 ODR12 :1; // 12 Uint32 ODR11 :1; // 11 Uint32 ODR10 :1; // 10 Uint32 ODR9 :1; // 9 Uint32 ODR8 :1; // 8 Uint32 ODR7 :1; // 7 Uint32 ODR6 :1; // 6 Uint32 ODR5 :1; // 5 Uint32 ODR4 :1; // 4 Uint32 ODR3 :1; // 3 Uint32 ODR2 :1; // 2 Uint32 ODR1 :1; // 1 Uint32 ODR0 :1; // 0 }; union GPIO_ODR_REG { Uint32 all; struct GPIO_ODR_BITS bit; }; // BRy: 清除端口x的位y (y = 0… 15) // 这些位只能写入并只能以字(16位)的形式操作。 // 0:对对应的ODRy位不产生影响 // 1:清除对应的ODRy位为0 // BSy: 设置端口x的位y (y = 0… 15) // 这些位只能写入并只能以字(16位)的形式操作。 Page 10 of 33 Untitled1 * // 0:对对应的ODRy位不产生影响 // 1:设置对应的ODRy位为1 struct GPIO_BSRR_BITS { Uint32 BR15 :1; // 31 Uint32 BR14 :1; // 30 Uint32 BR13 :1; // 29 Uint32 BR12 :1; // 28 Uint32 BR11 :1; // 27 Uint32 BR10 :1; // 26 Uint32 BR9 :1; // 25 Uint32 BR8 :1; // 24 Uint32 BR7 :1; // 23 Uint32 BR6 :1; // 22 Uint32 BR5 :1; // 21 Uint32 BR4 :1; // 20 Uint32 BR3 :1; // 19 Uint32 BR2 :1; // 18 Uint32 BR1 :1; // 17 Uint32 BR0 :1; // 16 Uint32 BS15 :1; // 15 Uint32 BS14 :1; // 14 Uint32 BS13 :1; // 13 Uint32 BS12 :1; // 12 Uint32 BS11 :1; // 11 Uint32 BS10 :1; // 10 Uint32 BS9 :1; // 9 Uint32 BS8 :1; // 8 Uint32 BS7 :1; // 7 Uint32 BS6 :1; // 6 Uint32 BS5 :1; // 5 Uint32 BS4 :1; // 4 Uint32 BS3 :1; // 3 Uint32 BS2 :1; // 2 Uint32 BS1 :1; // 1 Uint32 BS0 :1; // 0 }; union GPIO_BSRR_REG { Uint32 all; struct GPIO_BSRR_BITS bit; }; // BRy: 清除端口x的位y (y = 0… 15) // 这些位只能写入并只能以字(16位)的形式操作。 // 0:对对应的ODRy位不产生影响 // 1:清除对应的ODRy位为0 struct GPIO_BRR_BITS { Uint32 Reserved :16; // 31:16 Uint32 BR15 :1; // 15 Uint32 BR14 :1; // 14 Uint32 BR13 :1; // 13 Uint32 BR12 :1; // 12 Uint32 BR11 :1; // 11 Uint32 BR10 :1; // 10 Uint32 BR9 :1; // 9 Uint32 BR8 :1; // 8 Uint32 BR7 :1; // 7 Uint32 BR6 :1; // 6 Uint32 BR5 :1; // 5 Uint32 BR4 :1; // 4 Uint32 BR3 :1; // 3 Uint32 BR2 :1; // 2 Uint32 BR1 :1; // 1 Uint32 BR0 :1; // 0 }; union GPIO_BRR_REG { Uint32 all; struct GPIO_BRR_BITS bit; }; // LCKK:锁键 // 该位可随时读出,它只可通过锁键写入序列修改。 // 0:端口配置锁键位未激活 // 1:端口配置锁键位被激活,下次系统复位前GPIOx_LCKR寄存器被锁住。 // LCKy: 端口x的锁位y (y = 0… 15) // 这些位可读可写但只能在LCKK位为0时写入。 // 0:不锁定端口的配置 // 1:锁定端口的配置 struct GPIO_LCKR_BITS { Uint32 Reserved :15; // 31:17 Uint32 LCKK :1; // 16 Uint32 LCK15 :1; // 15 Uint32 LCK14 :1; // 14 Uint32 LCK13 :1; // 13 Uint32 LCK12 :1; // 12 Uint32 LCK11 :1; // 11 Uint32 LCK10 :1; // 10 Page 11 of 33 Untitled1 * Uint32 LCK9 :1; // 9 Uint32 LCK8 :1; // 8 Uint32 LCK7 :1; // 7 Uint32 LCK6 :1; // 6 Uint32 LCK5 :1; // 5 Uint32 LCK4 :1; // 4 Uint32 LCK3 :1; // 3 Uint32 LCK2 :1; // 2 Uint32 LCK1 :1; // 1 Uint32 LCK0 :1; // 0 }; union GPIO_LCKR_REG { Uint32 all; struct GPIO_LCKR_BITS bit; }; struct GPIO_REGS { union GPIO_CRL_REG crl ; // 端口配置低寄存器 (GPIOx_CRL) (x=A..E) union GPIO_CRH_REG crh ; // 端口配置高寄存器 (GPIOx_CRH) (x=A..E) union GPIO_IDR_REG idr ; // 端口输入数据寄存器 (GPIOx_IDR) (x=A..E) union GPIO_ODR_REG odr ; // 端口输出数据寄存器 (GPIOx_ODR) (x=A..E) union GPIO_BSRR_REG bsrr ; // 端口位设置/复位寄存器 (GPIOx_BSRR)(x=A..E) union GPIO_BRR_REG brr ; // 端口位复位寄存器 (GPIOx_BRR) (x=A..E) union GPIO_LCKR_REG lckr ; // 端口配置锁定寄存器 (GPIOx_LCKR)(x=A..E) }; // ******************************************************************************************************* // 复用功能I/O和调试配置(AFIO) // ******************************************************************************************************* struct AFIO_EVCR_BITS { Uint32 Reserved0 :24;// 31:8 Uint32 EVOE :1; // 7 Uint32 PORT :3; // 6:4 Uint32 PIN :4; // 3:0 }; union AFIO_EVCR_REG { Uint32 all; struct AFIO_EVCR_BITS bit; }; //--------------------------------------------------- //复用重映射和调试I/O配置寄存器(AFIO_MAPR) //---------------------------------------------------- // 位26:24 SWJ_CFG[2:0]:串行线JTAG配置 // 000:完全SWJ(JTAG-DP + SW-DP):复位状态 // 001:完全SWJ(JTAG-DP + SW-DP)但没有JNTRST // 010:关闭JTAG-DP,启用SW-DP // 100:关闭JTAG-DP,关闭SW-DP // 位15 PD01_REMAP:端口D0/端口D1映像到OSC_IN/OSC_OUT // 0:不进行PD0和PD1的重映像 // 1:PD0映像到OSC_IN,PD1映像到OSC_OUT // 位14:13 CAN_REMAP[1:0]:CAN复用功能重映像 // 这些位可由软件读写,控制复用功能CANRX和CANTX的重映像 // 00:CANRX映像到PA11,CANTX映像到PA12 // 01:未用组合 // 10:CANRX映像到PB8,CANTX映像到PB9(不能用于36脚的封装) // 11:CANRX映像到PD0,CANTX映像到PD1(只适用于100脚的封装 // 位12 TIM4_REMAP:定时器4的重映像 // 该位可由软件读写,只控制100脚封装中定时器4的通道1至4的映像。 // 0 : 没有重映像(TIM4_CH1/PB6 , TIM4_CH2/PB7 , TIM4_CH3/PB8 ,TIM4_CH4/PB9) // 1 : 完全映像(TIM4_CH1/PD12 , TIM4_CH2/PD13 , TIM4_CH3/PD14 ,TIM4_CH4/PD15) // 位11:10 TIM4_REMAP[1:0]:定时器3的重映像 // 这些位可由软件读写,控制定时器3的通道1至4在GPIO端口的映像。 // 00:没有重映像(CH1/PA6, CH2/PA7, CH3/PB0, CH4/PB1) // 01:未用组合 // 10:部分映像(CH1/PB4, CH2/PB5, CH3/PB0, CH4/PB1) // 11:完全映像(CH1/PC6, CH2/PC7, CH3/PC8, CH4/PC9) // 注:重映像不影响在PD2上的TIM3_ETR。 // 位9:8 TIM2_REMAP[1:0]:定时器2的重映像 // 这些位可由软件读写,控制定时器2的通道1至4和外部触发(ETR)在GPIO端口的映像。 // 00:没有重映像(CH1/ETR/PA0, CH2/PA1, CH3/PA2, CH4/PA3) // 01:部分映像(CH1/ETR/PA15, CH2/PB3, CH3/PA2, CH4/PA3) // 10:部分映像(CH1/ETR/PA0, CH2/PA1, CH3/PB10, CH4/PB11) // 11:完全映像(CH1/ETR/PA15, CH2/PB3, CH3/PB10, CH4/PB11) // 位7:6 TIM1_REMAP[1:0]:定时器1的重映像 // 00 : 没有重映像(ETR/PA12, CH1/PA8, CH2/PA9, CH3/PA10, CH4/PA11, // BKIN/PB12, CH1N/PB13, CH2N/PB14, CH3N/PB15) // 01 : 部分映像(ETR/PA12, CH1/PA8, CH2/PA9, CH3/PA10, CH4/PA11, // BKIN/PA6, CH1N/PA7, CH2N/PB0, CH3N/PB1) // 10: 未用组合 Page 12 of 33 Untitled1 * // 11: 完全映像(ETR/PE7, CH1/PE9, CH2/PE11, CH3/PE13, CH4/PE14, // BKIN/PE15, CH1N/PE8, CH2N/PE10, CH3N/PE12) // 位5:4 USART3_REMAP[1:0]:USART3的重映像 // 这些位可由软件读写,控制USART3的CTS、RTS、CK、TX和RX复用功能在 // GPIO端口的映像。 // 00: 没有重映像(TX/PB10, RX/PB11, CK/PB12, CTS/PB13, RTS/PB14) // 01: 部分映像(TX/PC10, RX/PC11, CK/PC12, CTS/PB13, RTS/PB14) // 10: 未用组合 // 11: 完全映像(TX/PD8, RX/PD9, CK/PD10, CTS/PD11, RTS/PD12) //位3 USART2_REMAP:USART2的重映像 //该位可由软件读写,控制USART2的CTS、RTS、CK、TX和RX复用功能在 //GPIO端口的映像。 //0: 没有重映像(CTS/PA0, RTS/PA1, TX/PA2, RX/PA3, CK/PA4) //1: 重映像(CTS/PD3, RTS/PD4, TX/PD5, RX/PD6, CK/PD7) //位2 USART1_REMAP:USART1的重映像 //该位可由软件读写,控制USART1的TX和RX复用功能在GPIO端口的映像。 //0: 没有重映像(TX/PA9, RX/PA10) //1: 重映像(TX/PB6, RX/PB7) //位1 I2C1_REMAP:I2C1的重映像 //该位可由软件读写,控制I2C1的SCL和SDA复用功能在GPIO端口的映像。 //0: 没有重映像(SCL/PB6, SDA/PB7) //1: 重映像(SCL/PB8, SDA/PB9) //位0 SPI1_REMAP:SPI1的重映像 //该位可由软件读写,控制SPI1的NSS、SCK、MISO和MOSI复用功能在GPIO端 //口的映像。 //0: 没有重映像(NSS/PA4, SCK/PA5, MISO/PA6, MOSI/PA7) //1: 重映像(NSS/PA15, SCK/PB3, MISO/PB4, MOSI/PB5) struct AFIO_MAPR_BITS { Uint32 Reserved0 :5; // 31:27 Uint32 SWJ_CFG :3; // 26:24 Uint32 Reserved1 :8; // 23:16 Uint32 PD01_REMAP :1; // 15 Uint32 CAN_REMAP :2; // 14:13 Uint32 TIM4_REMAP :1; // 12 Uint32 TIM3_REMAP :2; // 11:10 Uint32 TIM2_REMAP :2; // 9:8 Uint32 TIM1_REMAP :2; // 7:6 Uint32 USART3_REMAP :2; // 5:4 Uint32 USART2_REMAP :1; // 3 Uint32 USART1_REMAP :1; // 2 Uint32 I2C1_REMAP :1; // 1 Uint32 SPI1_REMAP :1; // 0 }; union AFIO_MAPR_REG { Uint32 all; struct AFIO_MAPR_BITS bit; }; //----------------------------------------------- // PA0 PB0 PC0 PD0 PE0 选择设置 连接到 EXTI0 // ...... // PA15 PB15 PC15 PD15 PE15 选择设置 连接到 EXTI15 struct AFIO_EXTICR_BITS { Uint32 Reserved0 :16;// 31:16 Uint32 EXTI3 :4; // 15:12 Uint32 EXTI2 :1; // 11:8 Uint32 EXTI1 :1; // 7:4 Uint32 EXTI0 :1; // 3:0 }; union AFIO_EXTICR_REG { Uint32 all; struct AFIO_EXTICR_BITS bit; }; //----------------------------------------------- // 位15:0 EXTIx[3:0]:EXTIx配置(x = 0 … 3) // 这些位可由软件读写,用于选择EXTIx外部中断的输入源。参看6.2.5节外部中断事件线映像。 // 0000:PA[x]脚 // 0001:PB[x]脚 // 0010:PC[x]脚 // 0011:PD[x]脚 // 0100:PE[x]脚 struct AFIO_EXTICR1_BITS { Uint32 Reserved0 :16;// 31:16 Uint32 EXTI3 :4; // 15:12 Uint32 EXTI2 :1; // 11:8 Uint32 EXTI1 :1; // 7:4 Uint32 EXTI0 :1; // 3:0 }; Page 13 of 33 Untitled1 * union AFIO_EXTICR1_REG { Uint32 all; struct AFIO_EXTICR1_BITS bit; }; // 位15:0 EXTIx[3:0]:EXTIx配置(x = 4 … 7) // 这些位可由软件读写,用于选择EXTIx外部中断的输入源。 struct AFIO_EXTICR2_BITS { Uint32 Reserved0 :16;// 31:16 Uint32 EXTI7 :4; // 15:12 Uint32 EXTI6 :1; // 11:8 Uint32 EXTI5 :1; // 7:4 Uint32 EXTI4 :1; // 3:0 }; union AFIO_EXTICR2_REG { Uint32 all; struct AFIO_EXTICR2_BITS bit; }; // 位15:0 EXTIx[3:0]:EXTIx配置(x = 8 … 11) // 这些位可由软件读写,用于选择EXTIx外部中断的输入源。 // 0000:PA[x]脚 // 0001:PB[x]脚 // 0010:PC[x]脚 // 0011:PD[x]脚 // 0100:PE[x]脚 struct AFIO_EXTICR3_BITS { Uint32 Reserved0 :16;// 31:16 Uint32 EXTI11 :4; // 15:12 Uint32 EXTI10 :1; // 11:8 Uint32 EXTI9 :1; // 7:4 Uint32 EXTI8 :1; // 3:0 }; union AFIO_EXTICR3_REG { Uint32 all; struct AFIO_EXTICR3_BITS bit; }; // 位15:0 EXTIx[3:0]:EXTIx配置(x = 12 … 15) // 这些位可由软件读写,用于选择EXTIx外部中断的输入源。 // 0000:PA[x]脚 // 0001:PB[x]脚 // 0010:PC[x]脚 // 0011:PD[x]脚 // 0100:PE[x]脚 struct AFIO_EXTICR4_BITS { Uint32 Reserved0 :16;// 31:16 Uint32 EXTI15 :4; // 15:12 Uint32 EXTI14 :1; // 11:8 Uint32 EXTI13 :1; // 7:4 Uint32 EXTI12 :1; // 3:0 }; union AFIO_EXTICR4_REG { Uint32 all; struct AFIO_EXTICR4_BITS bit; }; struct AFIO_REGS { union AFIO_EVCR_REG evcr ; // 事件控制寄存器 (AFIO_EVCR) union AFIO_MAPR_REG mapr ; // 复用重映射和调试I/O配置寄存器 (AFIO_MAPR) union AFIO_EXTICR_REG exticr[4] ; // 外部中断配置寄存器1-4 (AFIO_EXTICR1-4) }; // ******************************************************************************************************* // 6 中断和事件 // ******************************************************************************************************* // //● EXTI 线16 连接到PVD 输出 //● EXTI 线17 连接到RTC 闹钟事件 //● EXTI 线18 连接到USB 唤醒事件 // //------------------------------------------------------------------------ // 中断屏蔽寄存器(EXTI_IMR) //------------------------------------------------------------------------ // 位18:0 MRx: 线x上的中断屏蔽 // 0:线x上的中断请求被屏蔽 // 1:线x上的中断请求不被屏蔽 struct EXTI_IMR_BITS { Uint32 Reserved0 :13;// 31:19 Uint32 MR18 :1; // 18 Page 14 of 33 Untitled1 * Uint32 MR17 :1; // 17 Uint32 MR16 :1; // 16 Uint32 MR15 :1; // 15 Uint32 MR14 :1; // 14 Uint32 MR13 :1; // 13 Uint32 MR12 :1; // 12 Uint32 MR11 :1; // 11 Uint32 MR10 :1; // 10 Uint32 MR9 :1; // 9 Uint32 MR8 :1; // 8 Uint32 MR7 :1; // 7 Uint32 MR6 :1; // 6 Uint32 MR5 :1; // 5 Uint32 MR4 :1; // 4 Uint32 MR3 :1; // 3 Uint32 MR2 :1; // 2 Uint32 MR1 :1; // 1 Uint32 MR0 :1; // 0 }; union EXTI_IMR_REG { Uint32 all; struct EXTI_IMR_BITS bit; }; //------------------------------------------------------------------------ // 事件屏蔽寄存器(EXTI_EMR) //------------------------------------------------------------------------ // 位18:0 MRx: 线x上的事件屏蔽 // 0:线x上的事件请求被屏蔽 // 1:线x上的事件请求不被屏蔽 struct EXTI_EMR_BITS { Uint32 Reserved0 :13;// 31:19 Uint32 MR18 :1; // 18 Uint32 MR17 :1; // 17 Uint32 MR16 :1; // 16 Uint32 MR15 :1; // 15 Uint32 MR14 :1; // 14 Uint32 MR13 :1; // 13 Uint32 MR12 :1; // 12 Uint32 MR11 :1; // 11 Uint32 MR10 :1; // 10 Uint32 MR9 :1; // 9 Uint32 MR8 :1; // 8 Uint32 MR7 :1; // 7 Uint32 MR6 :1; // 6 Uint32 MR5 :1; // 5 Uint32 MR4 :1; // 4 Uint32 MR3 :1; // 3 Uint32 MR2 :1; // 2 Uint32 MR1 :1; // 1 Uint32 MR0 :1; // 0 }; union EXTI_EMR_REG { Uint32 all; struct EXTI_EMR_BITS bit; }; //------------------------------------------------------------------------ // 上升沿触发选择寄存器(EXTI_RTSR) //------------------------------------------------------------------------ // 位18:0 TRx: 线x上的上升沿触发事件配置位 // 0:禁止输入线x上的上升沿触发(中断和事件) // 1:允许输入线x上的上升沿触发(中断和事件) struct EXTI_RTSR_BITS { Uint32 Reserved0 :13;// 31:19 Uint32 TR18 :1; // 18 Uint32 TR17 :1; // 17 Uint32 TR16 :1; // 16 Uint32 TR15 :1; // 15 Uint32 TR14 :1; // 14 Uint32 TR13 :1; // 13 Uint32 TR12 :1; // 12 Uint32 TR11 :1; // 11 Uint32 TR10 :1; // 10 Uint32 TR9 :1; // 9 Uint32 TR8 :1; // 8 Uint32 TR7 :1; // 7 Uint32 TR6 :1; // 6 Uint32 TR5 :1; // 5 Uint32 TR4 :1; // 4 Uint32 TR3 :1; // 3 Uint32 TR2 :1; // 2 Uint32 TR1 :1; // 1 Uint32 TR0 :1; // 0 }; Page 15 of 33 Untitled1 * union EXTI_RTSR_REG { Uint32 all; struct EXTI_RTSR_BITS bit; }; //------------------------------------------------------------------------ // 下降沿触发选择寄存器(EXTI_FTSR) //------------------------------------------------------------------------ // 位18:0 TRx: 线x上的下降沿触发事件配置位 // 0:禁止输入线x上的下降沿触发(中断和事件) // 1:允许输入线x上的下降沿触发(中断和事件) struct EXTI_FTSR_BITS { Uint32 Reserved0 :13;// 31:19 Uint32 TR18 :1; // 18 Uint32 TR17 :1; // 17 Uint32 TR16 :1; // 16 Uint32 TR15 :1; // 15 Uint32 TR14 :1; // 14 Uint32 TR13 :1; // 13 Uint32 TR12 :1; // 12 Uint32 TR11 :1; // 11 Uint32 TR10 :1; // 10 Uint32 TR9 :1; // 9 Uint32 TR8 :1; // 8 Uint32 TR7 :1; // 7 Uint32 TR6 :1; // 6 Uint32 TR5 :1; // 5 Uint32 TR4 :1; // 4 Uint32 TR3 :1; // 3 Uint32 TR2 :1; // 2 Uint32 TR1 :1; // 1 Uint32 TR0 :1; // 0 }; union EXTI_FTSR_REG { Uint32 all; struct EXTI_FTSR_BITS bit; }; //------------------------------------------------------------------------ // 软件中断事件寄存器(EXTI_SWIER) //------------------------------------------------------------------------ // 位18:0 SWIERx: 线x上的软件中断 // 当该位为0时,写1将设置EXTI_PR中相应的挂起位。如果在EXTI_IMR和 // EXTI_EMR中允许产生该中断,则此时将产生一个中断。 // 通过清除EXTI_PR的对应位(写入1),可以清除该位为0。 struct EXTI_SWIER_BITS { Uint32 Reserved0 :13; // 31:19 Uint32 SWIER18 :1; // 18 Uint32 SWIER17 :1; // 17 Uint32 SWIER16 :1; // 16 Uint32 SWIER15 :1; // 15 Uint32 SWIER14 :1; // 14 Uint32 SWIER13 :1; // 13 Uint32 SWIER12 :1; // 12 Uint32 SWIER11 :1; // 11 Uint32 SWIER10 :1; // 10 Uint32 SWIER9 :1; // 9 Uint32 SWIER8 :1; // 8 Uint32 SWIER7 :1; // 7 Uint32 SWIER6 :1; // 6 Uint32 SWIER5 :1; // 5 Uint32 SWIER4 :1; // 4 Uint32 SWIER3 :1; // 3 Uint32 SWIER2 :1; // 2 Uint32 SWIER1 :1; // 1 Uint32 SWIER0 :1; // 0 }; union EXTI_SWIER_REG { Uint32 all; struct EXTI_SWIER_BITS bit; }; //------------------------------------------------------------------------ // 挂起寄存器(EXTI_PR) //------------------------------------------------------------------------ // 位18:0 PRx: 挂起位 // 0:没有发生触发请求 // 1:发生了选择的触发请求 // 当在外部中断线上发生了选择的边沿事件,该位被置1。在该位中写入1可以清除 // 它,也可以通过改变边沿检测的极性清除。 struct EXTI_PR_BITS { Uint32 Reserved0 :13;// 31:19 Uint32 PR18 :1; // 18 Page 16 of 33 Untitled1 * Uint32 PR17 :1; // 17 Uint32 PR16 :1; // 16 Uint32 PR15 :1; // 15 Uint32 PR14 :1; // 14 Uint32 PR13 :1; // 13 Uint32 PR12 :1; // 12 Uint32 PR11 :1; // 11 Uint32 PR10 :1; // 10 Uint32 PR9 :1; // 9 Uint32 PR8 :1; // 8 Uint32 PR7 :1; // 7 Uint32 PR6 :1; // 6 Uint32 PR5 :1; // 5 Uint32 PR4 :1; // 4 Uint32 PR3 :1; // 3 Uint32 PR2 :1; // 2 Uint32 PR1 :1; // 1 Uint32 PR0 :1; // 0 }; union EXTI_PR_REG { Uint32 all; struct EXTI_PR_BITS bit; }; struct EXTI_REGS { union EXTI_IMR_REG imr ; // 中断屏蔽寄存器(EXTI_IMR) union EXTI_EMR_REG emr ; // 事件屏蔽寄存器(EXTI_EMR) union EXTI_RTSR_REG rtsr ; // 上升沿触发选择寄存器(EXTI_RTSR) union EXTI_FTSR_REG ftsr ; // 下降沿触发选择寄存器(EXTI_FTSR) union EXTI_SWIER_REG swier; // 软件中断事件寄存器(EXTI_SWIER) union EXTI_PR_REG pr ; // 挂起寄存器(EXTI_PR) }; // #define STM32_Exti_Regs (*((volatile struct EXTI_REGS *)(EXTI_BASE))) // ******************************************************************************************************* // 7 DMA 控制器(DMA)) // ******************************************************************************************************* //------------------------------------------------------------------------ // DMA中断状态寄存器(DMA_ISR) //------------------------------------------------------------------------ // TEIFx:通道x的传输错误标志(x = 1 … 7) // HTIFx:通道x的半传输标志(x = 1 … 7) // TCIFx:通道x的传输完成标志(x = 1 … 7) // GIFx: 通道x的全局中断标志(x = 1 … 7) // 硬件设置这些位。在DMA_IFCR寄存器的相应位写入1可以清除这里对应的标志位。 // 0:在通道x没有TE、HT或TC事件 // 1:在通道x产生TE、HT或TC事件 struct DMA_ISR_BITS { Uint32 Reserved0 :4; // 31:28 Uint32 TEIF7 :1; // 27 Uint32 HTIF7 :1; // 26 Uint32 TCIF7 :1; // 25 Uint32 GIF7 :1; // 24 Uint32 TEIF6 :1; // 23 Uint32 HTIF6 :1; // 22 Uint32 TCIF6 :1; // 21 Uint32 GIF6 :1; // 20 Uint32 TEIF5 :1; // 19 Uint32 HTIF5 :1; // 18 Uint32 TCIF5 :1; // 17 Uint32 GIF5 :1; // 16 Uint32 TEIF4 :1; // 15 Uint32 HTIF4 :1; // 14 Uint32 TCIF4 :1; // 13 Uint32 GIF4 :1; // 12 Uint32 TEIF3 :1; // 11 Uint32 HTIF3 :1; // 10 Uint32 TCIF3 :1; // 9 Uint32 GIF3 :1; // 8 Uint32 TEIF2 :1; // 7 Uint32 HTIF2 :1; // 6 Uint32 TCIF2 :1; // 5 Uint32 GIF2 :1; // 4 Uint32 TEIF1 :1; // 3 Uint32 HTIF1 :1; // 2 Uint32 TCIF1 :1; // 1 Uint32 GIF1 :1; // 0 }; union DMA_ISR_REG { Uint32 all; struct DMA_ISR_BITS bit; }; //------------------------------------------------------------------------ Page 17 of 33 Untitled1 * // DMA中断标志清除寄存器(DMA_IFCR) //------------------------------------------------------------------------ // CTEIFx:清除通道x的传输错误标志(x = 1 … 7) // CHTIFx:清除通道x的半传输标志(x = 1 … 7) // CTCIFx:清除通道x的传输完成标志(x = 1 … 7) // CGIFx: 清除通道x的全局中断标志(x = 1 … 7) // 0: 不起作用 // 1: 清除DMA_ISR寄存器中的对应的GIF、TEIF、HTIF和TCIF标志 struct DMA_IFCR_BITS { Uint32 Reserved0 :4; // 31:28 Uint32 CTEIF7 :1; // 27 Uint32 CHTIF7 :1; // 26 Uint32 CTCIF7 :1; // 25 Uint32 CGIF7 :1; // 24 Uint32 CTEIF6 :1; // 23 Uint32 CHTIF6 :1; // 22 Uint32 CTCIF6 :1; // 21 Uint32 CGIF6 :1; // 20 Uint32 CTEIF5 :1; // 19 Uint32 CHTIF5 :1; // 18 Uint32 CTCIF5 :1; // 17 Uint32 CGIF5 :1; // 16 Uint32 CTEIF4 :1; // 15 Uint32 CHTIF4 :1; // 14 Uint32 CTCIF4 :1; // 13 Uint32 CGIF4 :1; // 12 Uint32 CTEIF3 :1; // 11 Uint32 CHTIF3 :1; // 10 Uint32 CTCIF3 :1; // 9 Uint32 CGIF3 :1; // 8 Uint32 CTEIF2 :1; // 7 Uint32 CHTIF2 :1; // 6 Uint32 CTCIF2 :1; // 5 Uint32 CGIF2 :1; // 4 Uint32 CTEIF1 :1; // 3 Uint32 CHTIF1 :1; // 2 Uint32 CTCIF1 :1; // 1 Uint32 CGIF1 :1; // 0 }; union DMA_IFCR_REG { Uint32 all; struct DMA_IFCR_BITS bit; }; //------------------------------------------------------------------------ // DMA通道x配置寄存器(DMA_CCRx)(x = 1… 7) //------------------------------------------------------------------------ struct DMA_CCR_BITS { Uint32 Reserved0 :17; // 31:15 Uint32 MEM2MEM :1; // 14 存储器到存储器模式 Uint32 PL :2; // 13:12 通道优先级 Uint32 MSIZE :2; // 11:10 存储器数据宽度 00:8位 Uint32 PSIZE :2; // 9:8 外设数据宽度 00:8位 Uint32 MINC :1; // 7 存储器地址增量模式 Uint32 PINC :1; // 6 外设地址增量模式 Uint32 CIRC :1; // 5 循环模式 Uint32 DIR :1; // 4 数据传输方向 Uint32 TEIE :1; // 3 允许传输错误中断 Uint32 HTIE :1; // 2 允许半传输中断 Uint32 TCIE :1; // 1 允许传输完成中断 Uint32 EN :1; // 0 通道开启 }; union DMA_CCR_REG { Uint32 all; struct DMA_CCR_BITS bit; }; //------------------------------------------------------------------------ // DMA通道x传输数量寄存器(DMA_CNDTRx)(x =1… 7) //------------------------------------------------------------------------ // 位15:0 NDT[15:0]:数据传输数量 // 数据传输数量为0至65535。这个寄存器只能在通道不工作(DMA_CCRx的 // EN=0)时写入。通道开启后该寄存器变为只读,指示剩余的待传输的字节数 // 目。寄存器内容在每次DMA传输后递减。 // 数据传输结束后,寄存器的内容或者变为0;或者当该通道配置为自动重加载 // 模式时,寄存器的内容将被自动重新加载为之前配置时的数值。 // 当寄存器的内容为0时,无论通道是否开启,都不会发生任何数据传输。 struct DMA_CNDTR_BITS { Uint32 Reserved0 :16; // 31:15 Uint32 NDT :16; // 15:0 }; union DMA_CNDTR_REG { Page 18 of 33 Untitled1 * Uint32 all; struct DMA_CNDTR_BITS bit; }; //------------------------------------------------------------------------ // DMA通道x外设地址寄存器(DMA_CPARx)(x =1… 7) //------------------------------------------------------------------------ // 外设数据寄存器的基地址,作为数据传输的源或目标。 struct DMA_CPAR_BITS { Uint32 CPAR :32; // 31:0 }; union DMA_CPAR_REG { Uint32 all; struct DMA_CPAR_BITS bit; }; //------------------------------------------------------------------------ // DMA通道x存储器地址寄存器(DMA_CMARx)(x =1… 7) //------------------------------------------------------------------------ // 存储器地址作为数据传输的源或目标。 struct DMA_CMAR_BITS { Uint32 CMAR :32; // 31:0 }; union DMA_CMAR_REG { Uint32 all; struct DMA_CMAR_BITS bit; }; struct DMA_REGS { union DMA_ISR_REG isr ; // DMA中断状态寄存器(DMA_ISR) union DMA_IFCR_REG ifcr ; // DMA中断标志清除寄存器(DMA_IFCR) }; struct DMA_CHANNEL_REGS { union DMA_CCR_REG ccr ; // DMA通道x配置寄存器(DMA_CCRx)(x = 1… 7) union DMA_CNDTR_REG cndtr ; // DMA通道x传输数量寄存器(DMA_CNDTRx)(x =1… 7) union DMA_CPAR_REG cpar ; // DMA通道x外设地址寄存器(DMA_CPARx)(x =1… 7) union DMA_CMAR_REG cmar ; // DMA通道x存储器地址寄存器(DMA_CPARx)(x =1… 7) }; //#define STM32_Dma_Regs (*((volatile struct DMA_REGS *)(DMA_BASE))) //#define STM32_Dma_Channel_Regs (*((volatile struct DMA_CHANNEL_REGS *)(DMA_CHANNEL_BASE))) // ******************************************************************************************************* // 8 实时时钟(RTC) // ******************************************************************************************************* //------------------------------------------------------------------------ // RTC控制寄存器高位(RTC_CRH) //------------------------------------------------------------------------ struct RTC_CRH_BITS { Uint16 Reserved0 :13; // 15:3 Uint16 OWIE :1; // 2 允许溢出中断位 Uint16 ALRIE :1; // 1 允许闹钟中断 Uint16 SECIE :1; // 0 允许秒中断 }; union RTC_CRH_REG { Uint16 all; struct RTC_CRH_BITS bit; }; //------------------------------------------------------------------------ // RTC控制寄存器低位(RTC_CRL) //------------------------------------------------------------------------ struct RTC_CRL_BITS { Uint16 Reserved0 :10; // 15:6 Uint16 RTOFF :1; // 5 RTC操作关闭 Uint16 CNF :1; // 4 配置标志 Uint16 RSF :1; // 3 寄存器同步标志 Uint16 OWF :1; // 2 溢出标志 Uint16 ALRF :1; // 1 闹钟标志 Uint16 SECF :1; // 0 秒标志 }; union RTC_CRL_REG { Uint16 all; struct RTC_CRL_BITS bit; }; Page 19 of 33 Untitled1 * //------------------------------------------------------------------------ // RTC预分频装载寄存器(RTC_PRLH/RTC_PRLL) //------------------------------------------------------------------------ // 预分频装载寄存器用来保存RTC 预分频器的周期计数值。它们由在RTC_CR 寄 // 存器的RTOFF 位写保护,并且如果RTOFF 值是1,允许进行写操作。 struct RTC_PRLH_BITS { Uint16 Reserved0 :12; // 15:4 Uint16 PRLH :4; // 3:0 PRL[19:16]:RTC预分频装载值高位 }; union RTC_PRLH_REG { Uint16 all; struct RTC_PRLH_BITS bit; }; struct RTC_PRLL_BITS { Uint16 PRLL :16; // 15:0 PRL[15:0]:RTC预分频装载值低位 }; union RTC_PRLL_REG { Uint16 all; struct RTC_PRLL_BITS bit; }; //------------------------------------------------------------------------ // RTC预分频分频因子寄存器(RTC_DIVH /RTC_DIVL) //------------------------------------------------------------------------ // 在TR_CLK 的每个周期里,RTC 预分频器中计数器的值都会被重新设置为 // RTC_PRL 寄存器的值。用户可读取存储在RTC_DIV 寄存器里的预分频计数器的 // 当前值,而不暂停其工作,从而获得精确的时间测量。此寄存器是只读寄存器, // 其值在RTC_PRL 或RTC_CNT 寄存器中的值发生改变后,由硬件重新装载。 struct RTC_DIVH_BITS { Uint16 Reserved0 :12; // 15:4 Uint16 DIVH :4; // 3:0 RTC_DIV[19:16]:RTC时钟分频因子高位。 }; union RTC_DIVH_REG { Uint16 all; struct RTC_DIVH_BITS bit; }; struct RTC_DIVL_BITS { Uint16 DIVL :16; // 15:0 RTC_DIV[15:0]:RTC时钟分频因子低位 }; union RTC_DIVL_REG { Uint16 all; struct RTC_DIVL_BITS bit; }; //------------------------------------------------------------------------ // RTC计数器寄存器 (RTC_CNTH / RTC_CNTL) //------------------------------------------------------------------------ // RTC 核有一个32 位可编程的计数器,可通过两个16 位的寄存器访问。计数器以 // 预分频器产生的TR_CLK 时间基准为参考进行计数。RTC_CNT 寄存器用来存放 // 计数器的计数值 struct RTC_CNTH_BITS { Uint16 CNTH :16; // 15:0 RTC_CNT[31:16]:RTC计数器高位 }; union RTC_CNTH_REG { Uint16 all; struct RTC_CNTH_BITS bit; }; struct RTC_CNTL_BITS { Uint16 CNTL :16; // 15:0 RTC_CNT[15:0]:RTC计数器低位。 }; union RTC_CNTL_REG { Uint16 all; struct RTC_CNTL_BITS bit; }; //------------------------------------------------------------------------ // RTC闹钟寄存器(RTC_ALRH/RTC_ALRL) //------------------------------------------------------------------------ // 当可编程计数器的值与RTC_ALR 中的32 位值相等时,即触发一个闹钟事件 struct RTC_ALRH_BITS { Uint16 ALRH :16; // 15:0 RTC_ALR[31:16]:RTC闹钟值高位。 }; Page 20 of 33 Untitled1 * union RTC_ALRH_REG { Uint16 all; struct RTC_ALRH_BITS bit; }; struct RTC_ALRL_BITS { Uint16 ALRL :16; // 15:0 RTC_ALR[15:0]:RTC闹钟值低位。 }; union RTC_ALRL_REG { Uint16 all; struct RTC_ALRL_BITS bit; }; struct RTC_REGS { union RTC_CRH_REG crh ; // u16 Reserved0; union RTC_CRL_REG crl ; // u16 Reserved1 ; union RTC_PRLH_REG prlh ; // u16 Reserved2 ; union RTC_PRLL_REG prll ; // u16 Reserved3 ; union RTC_DIVH_REG divh ; // u16 Reserved4 ; union RTC_DIVL_REG divl ; // u16 Reserved5 ; union RTC_CNTH_REG cnth ; // u16 Reserved6 ; union RTC_CNTL_REG cntl ; // u16 Reserved7 ; union RTC_ALRH_REG alrh ; // u16 Reserved8 ; union RTC_ALRL_REG alrl ; // u16 Reserved9 ; }; // #define STM32_Rtc_Regs (*((volatile struct RTC_REGS *)(RTC_BASE))) // ******************************************************************************************************* // 9 备份寄存器(BKP) // ******************************************************************************************************* //------------------------------------------------------------------------ // 备份数据寄存器x(BKP_DRx) (x = 1 … 10) //------------------------------------------------------------------------ // 备份寄存器是10 个16 位的寄存器,可用来存储20 个字节的用户应用程序数 // 据。他们处在备份域里,当VDD 电源被切断,他们仍然由VBAT 维持供电。当系统 // 在待机模式下被唤醒,或系统复位或电源复位时,他们也不会被复位。 struct BKP_DR_BITS { Uint16 DR :16; // 15:0 }; union BKP_DR_REG { Uint16 all; struct BKP_DR_BITS bit; }; //------------------------------------------------------------------------ // RTC时钟校准寄存器(BKP_RTCCR) //------------------------------------------------------------------------ struct BKP_RTCCR_BITS { Uint16 Reserved0 :6; // 15:10 Uint16 ASOS :1; // 9 闹钟或秒输出选择 0:输出RTC闹钟脉冲 1:输出秒脉冲 Uint16 ASOE :1; // 8 允许输出闹钟或秒脉冲 Uint16 CCO :1; // 7 校准时钟输出 1:此位置1可以在侵入检测引脚输出经64分频后的RTC时钟。当CCO位置1时, //必须关闭侵入检测功能以避免检测到无用的侵入信号。 Uint16 CAL :7; // 6:0 校准值 校准值表示在每220个时钟脉冲内将有多少个时钟脉冲被跳过。这可以用来对 //RTC进行校准,以1000000/(220)ppm的比例减慢时钟。 //RTC时钟可以被减慢0~121ppm }; union BKP_RTCCR_REG { Uint16 all; struct BKP_RTCCR_BITS bit; }; //------------------------------------------------------------------------ // 备份控制寄存器(BKP_CR) //------------------------------------------------------------------------ struct BKP_CR_BITS { Uint16 Reserved0 :14; // 15:2 Uint16 TPAL :1; // 1 侵入检测TAMPER引脚有效电平 Page 21 of 33 Untitled1 * Uint16 TPE :1; // 0 启动侵入检测TAMPER引脚 }; union BKP_CR_REG { Uint16 all; struct BKP_CR_BITS bit; }; //------------------------------------------------------------------------ // 备份控制/状态寄存器(BKP_CSR) //------------------------------------------------------------------------ struct BKP_CSR_BITS { Uint16 Reserved0 :6; // 15:10 Uint16 TIFL :1; // 9 侵入中断标志 Uint16 TEF :1; // 8 侵入事件标志 Uint16 Reserved1 :5; // 7:3 Uint16 TPIE :1; // 2 允许侵入TAMPER引脚中断 Uint16 CTI :1; // 1 清除侵入检测中断 Uint16 CTE :1; // 0 清除侵入检测事件 }; union BKP_CSR_REG { Uint16 all; struct BKP_CSR_BITS bit; }; struct BKP_REGS { u32 Reserved0 ; union BKP_DR_REG dr1 ; // u16 Reserved1 ; union BKP_DR_REG dr2 ; // u16 Reserved2 ; union BKP_DR_REG dr3 ; // u16 Reserved3 ; union BKP_DR_REG dr4 ; // u16 Reserved4 ; union BKP_DR_REG dr5 ; // u16 Reserved5 ; union BKP_DR_REG dr6 ; // u16 Reserved6 ; union BKP_DR_REG dr7 ; // u16 Reserved7 ; union BKP_DR_REG dr8 ; // u16 Reserved8 ; union BKP_DR_REG dr9 ; // u16 Reserved9 ; union BKP_DR_REG dr10 ; // u16 Reserved10 ; union BKP_RTCCR_REG rtccr ; // u16 Reserved11 ; union BKP_CR_REG cr ; // u16 Reserved12 ; union BKP_CSR_REG csr ; // u16 Reserved13 ; }; //#define STM32_Bkp_Regs (*((volatile struct BKP_REGS *)(BKP_BASE))) // ******************************************************************************************************* // 10 独立看门狗(IWDG) // ******************************************************************************************************* // 独立看门狗(IWDG)由专用的40kHz 的低速时钟为驱动 。窗口看门狗由从APB1 时钟分频后得到的时钟驱动 // 在键寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗;此时计数器开始 // 从其复位值0xFFF 递减计数。当计数器计数到末尾0x000 时,会产生一个复位信 // 号(IWDG_RESET)。 // 无论何时,只要键寄存器IWDG_KR 中被写入0xAAAA, IWDG_RLR 中的值就 // 会被重新加载到计数器中从而避免产生看门狗复位 //------------------------------------------------------------------------ // 键值寄存器(IWDG_KR) //------------------------------------------------------------------------ //对此寄存器写入0x5555表示允许访问IWDG_PR和IWDG_RLR寄存器。 //对此寄存器写入0xCCCC,启动看门狗工作(若选择了硬件看门狗则不受此命令字限制) struct IWDG_KR_BITS { Uint32 Reserved0 :16; // 31:16 Uint32 KEY :16; // 15:0 }; union IWDG_KR_REG { Uint32 all; struct IWDG_KR_BITS bit; }; //------------------------------------------------------------------------ // 预分频寄存器(IWDG_PR) //------------------------------------------------------------------------ Page 22 of 33 Untitled1 * // 通过设置这些位来选择计数器时钟的预分频因子。 // 要改变预分频因子,IWDG_SR寄存器的PVU位必须为0。 struct IWDG_PR_BITS { Uint32 Reserved0 :29; // 31:3 Uint32 PR :3; // 2:0 }; union IWDG_PR_REG { Uint32 all; struct IWDG_PR_BITS bit; }; //------------------------------------------------------------------------ // 重装载寄存器(IWDG_RLR) //------------------------------------------------------------------------ // 每当向IWDG_KR寄存器写入0xAAAA时,只有当IWDG_SR寄存器中的RVU位为0时,才能对此寄存器进行修改。 struct IWDG_RLR_BITS { Uint32 Reserved0 :20; // 31:12 Uint32 RLR :12; // 11:0 }; union IWDG_RLR_REG { Uint32 all; struct IWDG_RLR_BITS bit; }; //------------------------------------------------------------------------ // 状态寄存器(IWDG_SR) //------------------------------------------------------------------------ struct IWDG_SR_BITS { Uint32 Reserved0 :30; // 31:2 Uint32 RVU :1; // 1 看门狗计数器重装载值更新 此位由硬件置1用来指示重装载值的更新正在进行中,此位由硬件清0 Uint32 PVU :1; // 0 看门狗预分频值更新 此位由硬件置1用来指示预分频值的更新正在进行中,此位由硬件清0 }; union IWDG_SR_REG { Uint32 all; struct IWDG_SR_BITS bit; }; struct IWDG_REGS { union IWDG_KR_REG kr ; // union IWDG_PR_REG pr ; // union IWDG_RLR_REG rlr ; // union IWDG_SR_REG sr ; // }; //#define STM32_Iwdg_Regs (*((volatile struct IWDG_REGS *)(IWDG_BASE))) // ******************************************************************************************************* // 11 窗口看门狗(WWDG) // ******************************************************************************************************* //------------------------------------------------------------------------ // 控制寄存器(WWDG_CR) //------------------------------------------------------------------------ struct WWDG_CR_BITS { Uint32 Reserved0 :24; // 31:8 Uint32 WDGA :1; // 7 激活位 0:禁止看门狗 1:启用看门狗 Uint32 T :6; // 6:0 这些位用来存储看门狗的计数器值 }; union WWDG_CR_REG { Uint32 all; struct WWDG_CR_BITS bit; }; //------------------------------------------------------------------------ // 配置寄存器(WWDG_CFR) //------------------------------------------------------------------------ struct WWDG_CFR_BITS { Uint32 Reserved0 :22; // 31:10 Uint32 EWI :1; // 9 提前唤醒中断 此位若置1,则无论何时,当计数器值达到40h,即产生中断。 Uint32 WDGTB :2; // 8:7 时基 00/01/10/11 : CK计时器时钟(PCLK1除以4096) 除以 1/2/4/8 Uint32 W :7; // 6:0 7位窗口值 这些位包含了用来与递减计数器进行比较用的窗口值 }; union WWDG_CFR_REG { Page 23 of 33 Untitled1 * Uint32 all; struct WWDG_CFR_BITS bit; }; //------------------------------------------------------------------------ // 状态寄存器(WWDG_SR) //------------------------------------------------------------------------ struct WWDG_SR_BITS { Uint32 Reserved0 :31; // 31:1 Uint32 EWIF :1; // 0 提前唤醒中断标志 当计数器值达到40h时,此位由硬件置1。它必须通过软件写“ 0” 来清除 }; union WWDG_SR_REG { Uint32 all; struct WWDG_SR_BITS bit; }; struct WWDG_REGS { union WWDG_CR_REG cr ; // union WWDG_CFR_REG cfr ; // union WWDG_SR_REG sr ; // }; //#define STM32_Wwdg_Regs (*((volatile struct WWDG_REGS *)(WWDG_BASE))) // ******************************************************************************************************* // 12 高级控制定时器(TIM1) // ******************************************************************************************************* //------------------------------------------------------------------------ // 控制寄存器1(TIM1_CR1) //------------------------------------------------------------------------ struct TIM1_CR1_BITS { Uint16 Reserved0 :6; // 15:10 Uint16 CKD :2; // 9:8 时钟分频因子 Uint16 ARPE :1; // 7 自动重装载预装载允许位 0:TIM1_ARR寄存器没有缓冲 Uint16 CMS :1; // 6:5 选择中央对齐模式 Uint16 DIR :1; // 4 方向 0:计数器向上计数 Uint16 OPM :1; // 3 单脉冲模式 1:在发生下一次更新事件(清除CEN位)时,计数器停止。 Uint16 URS :1; // 2 更新请求源 软件通过该位选择UEV事件的源 Uint16 UDIS :1; // 1 禁止更新 软件通过该位允许/禁止UEV事件的产生 Uint16 CEN :1; // 0 允许计数器 }; union TIM1_CR1_REG { Uint16 all; struct TIM1_CR1_BITS bit; }; //------------------------------------------------------------------------ // 控制寄存器2(TIM1_CR2) //------------------------------------------------------------------------ struct TIM1_CR2_BITS { Uint16 Reserved0 :1; // 15 Uint16 OIS4 :1; // 14 Uint16 OIS3N :1; // 13 Uint16 OIS3 :1; // 12 Uint16 OIS2N :1; // 11 Uint16 OIS2 :1; // 10 Uint16 OIS1N :1; // 9 Uint16 OIS1 :1; // 8 Uint16 TI1S :1; // 7 Uint16 MMS :3; // 6:4 Uint16 CCDS :1; // 3 Uint16 CCUS :1; // 2 Uint16 Reserved1 :1; // 1 Uint16 CEN :1; // 0 }; union TIM1_CR2_REG { Uint16 all; struct TIM1_CR2_BITS bit; }; //------------------------------------------------------------------------ // 从模式控制寄存器(TIM1_SMCR) //------------------------------------------------------------------------ struct TIM1_SMCR_BITS { Uint16 ETP :1; // 15 Page 24 of 33 Untitled1 * Uint16 CEC :1; // 14 Uint16 ETPS :2; // 13:12 Uint16 ETF :4; // 11:8 Uint16 MSM :1; // 7 Uint16 TS :3; // 6:4 Uint16 Reserved1 :1; // 3 Uint16 SMS :3; // 2:0 }; union TIM1_SMCR_REG { Uint16 all; struct TIM1_SMCR_BITS bit; }; //------------------------------------------------------------------------ // DMA/中断使能寄存器(TIM1_DIER) //------------------------------------------------------------------------ struct TIM1_DIER_BITS { Uint16 Reserved0 :1; // 15 Uint16 TDE :1; // 14 Uint16 COMDE :1; // 13 Uint16 CC4DE :1; // 12 Uint16 CC3DE :1; // 11 Uint16 CC2DE :1; // 10 Uint16 CC1DE :1; // 9 Uint16 UDE :1; // 8 Uint16 BIE :1; // 7 Uint16 TIE :1; // 6 Uint16 CCMIE :1; // 5 Uint16 CC4IE :1; // 4 Uint16 CC3IE :1; // 3 Uint16 CC2IE :1; // 2 Uint16 CC1IE :1; // 1 Uint16 UIE :1; // 0 }; union TIM1_DIER_REG { Uint16 all; struct TIM1_DIER_BITS bit; }; //------------------------------------------------------------------------ // 状态寄存器(TIM1_SR) //------------------------------------------------------------------------ struct TIM1_SR_BITS { Uint16 Reserved0 :3; // 15:13 Uint16 CC4OF :1; // 12 Uint16 CC3OF :1; // 11 Uint16 CC2OF :1; // 10 Uint16 CC1OF :1; // 9 Uint16 Reserved1 :1; // 8 Uint16 BIF :1; // 7 Uint16 TIF :1; // 6 Uint16 COMIF :1; // 5 Uint16 CC4IF :1; // 4 Uint16 CC3IF :1; // 3 Uint16 CC2IF :1; // 2 Uint16 CC1IF :1; // 1 Uint16 UIF :1; // 0 }; union TIM1_SR_REG { Uint16 all; struct TIM1_SR_BITS bit; }; //------------------------------------------------------------------------ // 事件产生寄存器(TIM1_EGR) //------------------------------------------------------------------------ struct TIM1_EGR_BITS { Uint16 Reserved0 :8; // 15:8 Uint16 BG :1; // 7 Uint16 TG :1; // 6 Uint16 COMG :1; // 5 Uint16 CC4G :1; // 4 Uint16 CC3G :1; // 3 Uint16 CC2G :1; // 2 Uint16 CC1G :1; // 1 Uint16 UG :1; // 0 }; union TIM1_EGR_REG { Uint16 all; Page 25 of 33 Untitled1 * struct TIM1_EGR_BITS bit; }; //------------------------------------------------------------------------ // 捕获/比较模式寄存器1(TIM1_CCMR1) //------------------------------------------------------------------------ struct TIM1_CCMR1_OU_BITS { Uint16 OC2CE :1; // 15 Uint16 OC2M :3; // 14:12 Uint16 OC2PE :1; // 11 Uint16 CC2FE :1; // 10 Uint16 CC2S :2; // 9:8 Uint16 COC1CE :1; // 7 Uint16 OC1M :3; // 6:4 Uint16 OC1PE :1; // 3 Uint16 OC1FE :1; // 2 Uint16 CC1S :2; // 1:0 }; struct TIM1_CCMR1_IN_BITS { Uint16 ICF2 :4; // 15:12 Uint16 IC2PSC :2; // 11:10 Uint16 CC2S :2; // 9:8 Uint16 IC1F :4; // 7:4 Uint16 C1PSC :2; // 3:2 Uint16 CC1S :2; // 1:0 }; union TIM1_CCMR1_REG { Uint16 all; struct TIM1_CCMR1_OU_BITS ou_bit; struct TIM1_CCMR1_IN_BITS in_bit; }; //------------------------------------------------------------------------ // 捕获/比较模式寄存器2(TIM1_CCMR2) //------------------------------------------------------------------------ struct TIM1_CCMR2_OU_BITS { Uint16 OC4CE :1; // 15 Uint16 OC4M :3; // 14:12 Uint16 OC4PE :1; // 11 Uint16 OC4FE :1; // 10 Uint16 CC4S :2; // 9:8 Uint16 OC3CE :1; // 7 Uint16 OC3M :3; // 6:4 Uint16 OC3PE :1; // 3 Uint16 OC3FE :1; // 2 Uint16 CC3S :2; // 1:0 }; struct TIM1_CCMR2_IN_BITS { Uint16 IC4F :4; // 15:12 Uint16 IC4PSC :2; // 11:10 Uint16 CC4S :2; // 9:8 Uint16 IC3F :4; // 7:4 Uint16 IC3PSC :2; // 3:2 Uint16 CC3S :2; // 1:0 }; union TIM1_CCMR2_REG { Uint16 all; struct TIM1_CCMR2_OU_BITS ou_bit; struct TIM1_CCMR2_IN_BITS in_bit; }; //------------------------------------------------------------------------ // 捕获/比较使能寄存器(TIM1_CCER) //------------------------------------------------------------------------ struct TIM1_CCER_BITS { Uint16 Reserved0 :2; // 15:14 Uint16 CC4P :1; // 13 Uint16 CC4E :1; // 12 Uint16 CC3NP :1; // 11 Uint16 CC3NE :1; // 10 Uint16 CC3P :1; // 9 Uint16 CC3E :1; // 8 Uint16 CC2NP :1; // 7 Uint16 CC2NE :1; // 6 Uint16 CC2P :1; // 5 Uint16 CC2E :1; // 4 Uint16 CC1NP :1; // 3 Uint16 CC1NE :1; // 2 Page 26 of 33 Untitled1 * Uint16 CC1P :1; // 1 Uint16 CC1E :1; // 0 }; union TIM1_CCER_REG { Uint16 all; struct TIM1_CCER_BITS bit; }; //------------------------------------------------------------------------ // 计数器(TIM1_CNT) //------------------------------------------------------------------------ struct TIM1_CNT_BITS { Uint16 CNT :16; // 15:0 计数器的值 }; union TIM1_CNT_REG { Uint16 all; struct TIM1_CNT_BITS bit; }; //------------------------------------------------------------------------ // 预分频器(TIM1_PSC) //------------------------------------------------------------------------ struct TIM1_PSC_BITS { Uint16 PSC :16; // 15:0 预分频器的值 }; union TIM1_PSC_REG { Uint16 all; struct TIM1_PSC_BITS bit; }; //------------------------------------------------------------------------ // 自动重装载寄存器(TIM1_ARR) //------------------------------------------------------------------------ struct TIM1_ARR_BITS { Uint16 ARR :16; // 15:0 自动重装载的值 }; union TIM1_ARR_REG { Uint16 all; struct TIM1_ARR_BITS bit; }; //------------------------------------------------------------------------ // 周期计数寄存器(TIM1_RCR) //------------------------------------------------------------------------ struct TIM1_RCR_BITS { Uint16 Reserved0 :8; // 15:8 Uint16 RCR :8; // 7:0 周期计数器的值 }; union TIM1_RCR_REG { Uint16 all; struct TIM1_RCR_BITS bit; }; //------------------------------------------------------------------------ // 捕获/比较寄存器1-4(TIM1_CCR1-4) //------------------------------------------------------------------------ struct TIM1_CCR_BITS { Uint16 CCR :16; // 15:0 捕获/比较1的值 }; union TIM1_CCR_REG { Uint16 all; struct TIM1_CCR_BITS bit; }; //------------------------------------------------------------------------ // 刹车和死区寄存器(TIM1_BDTR) //------------------------------------------------------------------------ struct TIM1_BDTR_BITS { Uint16 MOE :1; // 15 Uint16 AOE :1; // 14 Uint16 BKP :1; // 13 Uint16 BKE :1; // 12 Uint16 OSSR :1; // 11 Page 27 of 33 Untitled1 * Uint16 OSSI :1; // 10 Uint16 LOCK :2; // 9:8 Uint16 DTG :8; // 7:0 }; union TIM1_BDTR_REG { Uint16 all; struct TIM1_BDTR_BITS bit; }; //------------------------------------------------------------------------ // DMA控制寄存器(TIM1_DCR) //------------------------------------------------------------------------ struct TIM1_DCR_BITS { Uint16 Reserved0 :3; // 15:13 Uint16 DBL :5; // 12:8 Uint16 Reserved1 :3; // 7:5 Uint16 DBA :8; // 4:0 }; union TIM1_DCR_REG { Uint16 all; struct TIM1_DCR_BITS bit; }; //------------------------------------------------------------------------ // 连续模式的DMA地址(TIM1_DMAR) //------------------------------------------------------------------------ struct TIM1_DMAR_BITS { Uint16 DMAB :16; // 15:0 DMA连续传送寄存器 }; union TIM1_DMAR_REG { Uint16 all; struct TIM1_DMAR_BITS bit; }; struct TIM1_REGS { union TIM1_CR1_REG cr1 ; // u16 Reserved0 ; union TIM1_CR2_REG cr2; // u16 Reserved1 ; union TIM1_SMCR_REG smcr; // u16 Reserved2 ; union TIM1_DIER_REG dier; // u16 Reserved3 ; union TIM1_SR_REG sr ; // u16 Reserved4 ; union TIM1_EGR_REG egr; // u16 Reserved5 ; union TIM1_CCMR1_REG ccmr1; // u16 Reserved6 ; union TIM1_CCMR2_REG ccmr2; // u16 Reserved7 ; union TIM1_CCER_REG ccer; // u16 Reserved8 ; union TIM1_CNT_REG cnt ; // u16 Reserved9 ; union TIM1_PSC_REG psc ; // u16 Reserved10 ; union TIM1_ARR_REG arr ; // u16 Reserved11 ; union TIM1_RCR_REG rcr ; // u16 Reserved12 ; union TIM1_CCR_REG ccr1; // u16 Reserved13 ; union TIM1_CCR_REG ccr2; // u16 Reserved14 ; union TIM1_CCR_REG ccr3; // u16 Reserved15 ; union TIM1_CCR_REG ccr4; // u16 Reserved16 ; union TIM1_BDTR_REG bdtr; // u16 Reserved17 ; union TIM1_DCR_REG dcr ; // u16 Reserved18 ; union TIM1_DMAR_REG dmar; // u16 Reserved19 ; }; //#define STM32_Tim1_Regs (*((volatile struct TIM1_REGS *)(TIM1_BASE))) // ******************************************************************************************************* // 13 通用定时器(TIMx) x=2 3 4 Page 28 of 33 Untitled1 * // ******************************************************************************************************* //------------------------------------------------------------------------ // 控制寄存器1(TIMx_CR1) //------------------------------------------------------------------------ struct TIM_CR1_BITS { Uint16 Reserved0 :6; // 15:10 Uint16 CKD :2; // 9:8 时钟分频因子 Uint16 ARPE :1; // 7 自动重装载预装载允许位 0:TIM1_ARR寄存器没有缓冲 Uint16 CMS :1; // 6:5 选择中央对齐模式 Uint16 DIR :1; // 4 方向 0:计数器向上计数 Uint16 OPM :1; // 3 单脉冲模式 1:在发生下一次更新事件(清除CEN位)时,计数器停止。 Uint16 URS :1; // 2 更新请求源 软件通过该位选择UEV事件的源 Uint16 UDIS :1; // 1 禁止更新 软件通过该位允许/禁止UEV事件的产生 Uint16 CEN :1; // 0 允许计数器 }; union TIM_CR1_REG { Uint16 all; struct TIM_CR1_BITS bit; }; //------------------------------------------------------------------------ // 控制寄存器2(TIM_CR2) //------------------------------------------------------------------------ struct TIM_CR2_BITS { Uint16 Reserved0 :1; // 15:7 Uint16 TI1S :1; // 7 Uint16 MMS :3; // 6:4 Uint16 CCDS :1; // 3 Uint16 Reserved1 :1; // 2:0 }; union TIM_CR2_REG { Uint16 all; struct TIM_CR2_BITS bit; }; //------------------------------------------------------------------------ // 13.5.3 从模式控制寄存器(TIMx_SMCR) //------------------------------------------------------------------------ struct TIM_SMCR_BITS { Uint16 ETP :1; // 15 Uint16 CEC :1; // 14 Uint16 ETPS :2; // 13:12 Uint16 ETF :4; // 11:8 Uint16 MSM :1; // 7 Uint16 TS :3; // 6:4 Uint16 Reserved1 :1; // 3 Uint16 SMS :3; // 2:0 }; union TIM_SMCR_REG { Uint16 all; struct TIM_SMCR_BITS bit; }; //------------------------------------------------------------------------ // 13.5.4 DMA/中断使能寄存器(TIMx_DIER) //------------------------------------------------------------------------ struct TIM_DIER_BITS { Uint16 Reserved0 :1; // 15 Uint16 TDE :1; // 14 Uint16 Reserved1 :1; // 13 Uint16 CC4DE :1; // 12 Uint16 CC3DE :1; // 11 Uint16 CC2DE :1; // 10 Uint16 CC1DE :1; // 9 Uint16 UDE :1; // 8 Uint16 Reserved2 :1; // 7 Uint16 TIE :1; // 6 Uint16 Reserved3 :1; // 5 Uint16 CC4IE :1; // 4 Uint16 CC3IE :1; // 3 Uint16 CC2IE :1; // 2 Uint16 CC1IE :1; // 1 Uint16 UIE :1; // 0 }; union TIM_DIER_REG { Uint16 all; Page 29 of 33 Untitled1 * struct TIM_DIER_BITS bit; }; //------------------------------------------------------------------------ // 13.5.5 状态寄存器(TIMx_SR) //------------------------------------------------------------------------ struct TIM_SR_BITS { Uint16 Reserved0 :3; // 15:13 Uint16 CC4OF :1; // 12 Uint16 CC3OF :1; // 11 Uint16 CC2OF :1; // 10 Uint16 CC1OF :1; // 9 Uint16 Reserved1 :2; // 8:7 Uint16 TIF :1; // 6 Uint16 Reserved2 :1; // 5 Uint16 CC4IF :1; // 4 Uint16 CC3IF :1; // 3 Uint16 CC2IF :1; // 2 Uint16 CC1IF :1; // 1 Uint16 UIF :1; // 0 }; union TIM_SR_REG { Uint16 all; struct TIM_SR_BITS bit; }; //------------------------------------------------------------------------ // 13.5.6 事件产生寄存器(TIMx_EGR) //------------------------------------------------------------------------ struct TIM_EGR_BITS { Uint16 Reserved0 :9; // 15:7 Uint16 TG :1; // 6 Uint16 Reserved1 :1; // 5 Uint16 CC4G :1; // 4 Uint16 CC3G :1; // 3 Uint16 CC2G :1; // 2 Uint16 CC1G :1; // 1 Uint16 UG :1; // 0 }; union TIM_EGR_REG { Uint16 all; struct TIM_EGR_BITS bit; }; //------------------------------------------------------------------------ // 13.5.7 捕获/比较模式寄存器1(TIMx_CCMR1) //------------------------------------------------------------------------ struct TIM_CCMR1_OU_BITS { Uint16 OC2CE :1; // 15 Uint16 OC2M :3; // 14:12 Uint16 OC2PE :1; // 11 Uint16 CC2FE :1; // 10 Uint16 CC2S :2; // 9:8 Uint16 COC1CE :1; // 7 Uint16 OC1M :3; // 6:4 Uint16 OC1PE :1; // 3 Uint16 OC1FE :1; // 2 Uint16 CC1S :2; // 1:0 }; struct TIM_CCMR1_IN_BITS { Uint16 ICF2 :4; // 15:12 Uint16 IC2PSC :2; // 11:10 Uint16 CC2S :2; // 9:8 Uint16 IC1F :4; // 7:4 Uint16 C1PSC :2; // 3:2 Uint16 CC1S :2; // 1:0 }; union TIM_CCMR1_REG { Uint16 all; struct TIM_CCMR1_OU_BITS ou_bit; struct TIM_CCMR1_IN_BITS in_bit; }; //------------------------------------------------------------------------ // 13.5.8 捕获/比较模式寄存器2(TIMx_CCMR2) //------------------------------------------------------------------------ struct TIM_CCMR2_OU_BITS { Uint16 OC4CE :1; // 15 Page 30 of 33 Untitled1 * Uint16 OC4M :3; // 14:12 Uint16 OC4PE :1; // 11 Uint16 OC4FE :1; // 10 Uint16 CC4S :2; // 9:8 Uint16 OC3CE :1; // 7 Uint16 OC3M :3; // 6:4 Uint16 OC3PE :1; // 3 Uint16 OC3FE :1; // 2 Uint16 CC3S :2; // 1:0 }; struct TIM_CCMR2_IN_BITS { Uint16 IC4F :4; // 15:12 Uint16 IC4PSC :2; // 11:10 Uint16 CC4S :2; // 9:8 Uint16 IC3F :4; // 7:4 Uint16 IC3PSC :2; // 3:2 Uint16 CC3S :2; // 1:0 }; union TIM_CCMR2_REG { Uint16 all; struct TIM_CCMR2_OU_BITS ou_bit; struct TIM_CCMR2_IN_BITS in_bit; }; //------------------------------------------------------------------------ // 13.5.9 捕获/比较使能寄存器(TIMx_CCER) //------------------------------------------------------------------------ struct TIM_CCER_BITS { Uint16 Reserved0 :2; // 15:14 Uint16 CC4P :1; // 13 Uint16 CC4E :1; // 12 Uint16 Reserved1 :2; // 11:10 Uint16 CC3P :1; // 9 Uint16 CC3E :1; // 8 Uint16 Reserved2 :2; // 7:6 Uint16 CC2P :1; // 5 Uint16 CC2E :1; // 4 Uint16 Reserved3 :2; // 3:2 Uint16 CC1P :1; // 1 Uint16 CC1E :1; // 0 }; union TIM_CCER_REG { Uint16 all; struct TIM_CCER_BITS bit; }; //------------------------------------------------------------------------ // 13.5.10 计数器(TIMx_CNT) //------------------------------------------------------------------------ struct TIM_CNT_BITS { Uint16 CNT :16; // 15:0 计数器的值 }; union TIM_CNT_REG { Uint16 all; struct TIM_CNT_BITS bit; }; //------------------------------------------------------------------------ // 13.5.11 预分频器(TIMx_PSC) //------------------------------------------------------------------------ struct TIM_PSC_BITS { Uint16 PSC :16; // 15:0 预分频器的值 }; union TIM_PSC_REG { Uint16 all; struct TIM_PSC_BITS bit; }; //------------------------------------------------------------------------ // 13.5.12 自动重装载寄存器(TIMx_ARR) //------------------------------------------------------------------------ struct TIM_ARR_BITS { Uint16 ARR :16; // 15:0 自动重装载的值 }; Page 31 of 33 Untitled1 * union TIM_ARR_REG { Uint16 all; struct TIM_ARR_BITS bit; }; //------------------------------------------------------------------------ // 13.5.13 捕获/比较寄存器1-4(TIM1_CCR1-4) //------------------------------------------------------------------------ struct TIM_CCR_BITS { Uint16 CCR :16; // 15:0 捕获/比较1的值 }; union TIM_CCR_REG { Uint16 all; struct TIM_CCR_BITS bit; }; //------------------------------------------------------------------------ // 13.5.17 DMA控制寄存器(TIMx_DCR) //------------------------------------------------------------------------ struct TIM_DCR_BITS { Uint16 Reserved0 :3; // 15:13 Uint16 DBL :5; // 12:8 Uint16 Reserved1 :3; // 7:5 Uint16 DBA :8; // 4:0 }; union TIM_DCR_REG { Uint16 all; struct TIM_DCR_BITS bit; }; //------------------------------------------------------------------------ // 13.5.18 连续模式的DMA地址(TIMx_DMAR) //------------------------------------------------------------------------ struct TIM_DMAR_BITS { Uint16 DMAB :16; // 15:0 DMA连续传送寄存器 }; union TIM_DMAR_REG { Uint16 all; struct TIM_DMAR_BITS bit; }; struct TIM_REGS { union TIM_CR1_REG cr1 ; // u16 Reserved0 ; union TIM_CR2_REG cr2; // u16 Reserved1 ; union TIM_SMCR_REG smcr; // u16 Reserved2 ; union TIM_DIER_REG dier; // u16 Reserved3 ; union TIM_SR_REG sr ; // u16 Reserved4 ; union TIM_EGR_REG egr; // u16 Reserved5 ; union TIM_CCMR1_REG ccmr1; // u16 Reserved6 ; union TIM_CCMR2_REG ccmr2; // u16 Reserved7 ; union TIM_CCER_REG ccer; // u16 Reserved8 ; union TIM_CNT_REG cnt ; // u16 Reserved9 ; union TIM_PSC_REG psc ; // u16 Reserved10 ; union TIM_ARR_REG arr ; // u16 Reserved11[3] ; union TIM_CCR_REG ccr1; // u16 Reserved12 ; union TIM_CCR_REG ccr2; // u16 Reserved13 ; union TIM_CCR_REG ccr3; // u16 Reserved14 ; union TIM_CCR_REG ccr4; // u16 Reserved15[3] ; union TIM_DCR_REG dcr ; // u16 Reserved16 ; union TIM_DMAR_REG dmar; // u16 Reserved17 ; }; //#define STM32_Tim_Regs (*((volatile struct TIM_REGS *)(TIM_BASE))) Page 32 of 33 Untitled1 * Page 33 of 33
最新回复(0)