/************************************************************************************************/ /** * @file ciu32l051_std_rcc.h * @author MCU Ecosystem Development Team * @brief RCC STD库驱动头文件。 * 提供RCC相关的STD库操作函数声明、数据类型以及常量的定义。 * * ************************************************************************************************** * @attention * Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved. * ************************************************************************************************** */ /* 避免头文件重复引用 */ #ifndef CIU32L051_STD_RCC_H #define CIU32L051_STD_RCC_H /************************************************************************************************/ /** * @addtogroup CIU32L051_STD_Driver * @{ */ /** * @defgroup RCC RCC * @brief 复位和时钟控制器的STD库驱动 * @{ */ /************************************************************************************************/ #ifdef __cplusplus extern "C" { #endif /*------------------------------------------includes--------------------------------------------*/ #include "ciu32l051_std_common.h" /*--------------------------------------------define--------------------------------------------*/ /************************************************************************************************/ /** * @defgroup RCC_Constants RCC Constants * @brief RCC常量定义及宏定义 * @{ * */ /************************************************************************************************/ /* HXTAL配置参数定义 */ #define RCC_HXTAL_ON (0x00000001UL) /**< HXTAL时钟开启 */ #define RCC_HXTAL_BYPASS (0x00000002UL) /**< HXTAL为外部时钟模式 */ /* LXTAL配置参数定义 */ #define RCC_LXTAL_ON (0x00000001UL) /**< LXTAL时钟开启 */ /* RCH分频系数参数定义 */ #define RCC_RCH_DIV1 RCC_CSR1_RCHDIV_1 /**< RCH时钟不分频 */ #define RCC_RCH_DIV2 RCC_CSR1_RCHDIV_2 /**< RCH时钟分频因子 = 2 */ #define RCC_RCH_DIV4 RCC_CSR1_RCHDIV_4 /**< RCH时钟分频因子 = 4 */ #define RCC_RCH_DIV8 RCC_CSR1_RCHDIV_8 /**< RCH时钟分频因子 = 8 */ /* HXTAL驱动能力参数定义 */ #define RCC_HXTAL_DRIVE_LEVEL0 RCC_CSR1_HXTAL_DRV_0 /**< 低档驱动能力 */ #define RCC_HXTAL_DRIVE_LEVEL1 RCC_CSR1_HXTAL_DRV_1 /**< 中低档驱动能力 */ #define RCC_HXTAL_DRIVE_LEVEL2 RCC_CSR1_HXTAL_DRV_2 /**< 中高档驱动能力 */ #define RCC_HXTAL_DRIVE_LEVEL3 RCC_CSR1_HXTAL_DRV_3 /**< 高档驱动能力 */ /* HXTAL时钟稳定周期数定义 */ #define RCC_HXTAL_STAB_SEL_256 (0x00000000UL) /**< HXTAL时钟稳定周期为256个时钟周期 */ #define RCC_HXTAL_STAB_SEL_1024 (0x1UL << RCC_STABC_HXTAL_STAB_SEL_POS) /**< HXTAL时钟稳定周期为1024个时钟周期 */ #define RCC_HXTAL_STAB_SEL_4096 (0x2UL << RCC_STABC_HXTAL_STAB_SEL_POS) /**< HXTAL时钟稳定周期为4096个时钟周期 */ #define RCC_HXTAL_STAB_SEL_16384 (0x3UL << RCC_STABC_HXTAL_STAB_SEL_POS) /**< HXTAL时钟稳定周期为16384个时钟周期 */ /* PLL VCO分频参数定义 */ #define RCC_PLL_DIV1 RCC_PLLCFG_PLLDIV_1 /**< PLL分频因子 = 1 */ #define RCC_PLL_DIV2 RCC_PLLCFG_PLLDIV_2 /**< PLL分频因子 = 2 */ #define RCC_PLL_DIV4 RCC_PLLCFG_PLLDIV_4 /**< PLL分频因子 = 4 */ #define RCC_PLL_DIV8 RCC_PLLCFG_PLLDIV_8 /**< PLL分频因子 = 8 */ /* PLLM倍频参数定义 */ #define RCC_PLLM_MUL1 (0x01UL << RCC_PLLCFG_PLLM_POS) /**< PLLM倍频因子 = 1 */ #define RCC_PLLM_MUL2 (0x02UL << RCC_PLLCFG_PLLM_POS) /**< PLLM倍频因子 = 2 */ #define RCC_PLLM_MUL3 (0x03UL << RCC_PLLCFG_PLLM_POS) /**< PLLM倍频因子 = 3 */ #define RCC_PLLM_MUL4 (0x04UL << RCC_PLLCFG_PLLM_POS) /**< PLLM倍频因子 = 4 */ #define RCC_PLLM_MUL5 (0x05UL << RCC_PLLCFG_PLLM_POS) /**< PLLM倍频因子 = 5 */ #define RCC_PLLM_MUL6 (0x06UL << RCC_PLLCFG_PLLM_POS) /**< PLLM倍频因子 = 6 */ #define RCC_PLLM_MUL7 (0x07UL << RCC_PLLCFG_PLLM_POS) /**< PLLM倍频因子 = 7 */ #define RCC_PLLM_MUL8 (0x08UL << RCC_PLLCFG_PLLM_POS) /**< PLLM倍频因子 = 8 */ #define RCC_PLLM_MUL9 (0x09UL << RCC_PLLCFG_PLLM_POS) /**< PLLM倍频因子 = 9 */ #define RCC_PLLM_MUL10 (0x0AUL << RCC_PLLCFG_PLLM_POS) /**< PLLM倍频因子 = 10 */ #define RCC_PLLM_MUL11 (0x0BUL << RCC_PLLCFG_PLLM_POS) /**< PLLM倍频因子 = 11 */ #define RCC_PLLM_MUL12 (0x0CUL << RCC_PLLCFG_PLLM_POS) /**< PLLM倍频因子 = 12 */ #define RCC_PLLM_MUL13 (0x0DUL << RCC_PLLCFG_PLLM_POS) /**< PLLM倍频因子 = 13 */ #define RCC_PLLM_MUL14 (0x0EUL << RCC_PLLCFG_PLLM_POS) /**< PLLM倍频因子 = 14 */ #define RCC_PLLM_MUL15 (0x0FUL << RCC_PLLCFG_PLLM_POS) /**< PLLM倍频因子 = 15 */ #define RCC_PLLM_MUL16 (0x10UL << RCC_PLLCFG_PLLM_POS) /**< PLLM倍频因子 = 16 */ #define RCC_PLLM_MUL17 (0x11UL << RCC_PLLCFG_PLLM_POS) /**< PLLM倍频因子 = 17 */ #define RCC_PLLM_MUL18 (0x12UL << RCC_PLLCFG_PLLM_POS) /**< PLLM倍频因子 = 18 */ #define RCC_PLLM_MUL19 (0x13UL << RCC_PLLCFG_PLLM_POS) /**< PLLM倍频因子 = 19 */ #define RCC_PLLM_MUL20 (0x14UL << RCC_PLLCFG_PLLM_POS) /**< PLLM倍频因子 = 20 */ #define RCC_PLLM_MUL21 (0x15UL << RCC_PLLCFG_PLLM_POS) /**< PLLM倍频因子 = 21 */ #define RCC_PLLM_MUL22 (0x16UL << RCC_PLLCFG_PLLM_POS) /**< PLLM倍频因子 = 22 */ #define RCC_PLLM_MUL23 (0x17UL << RCC_PLLCFG_PLLM_POS) /**< PLLM倍频因子 = 23 */ #define RCC_PLLM_MUL24 (0x18UL << RCC_PLLCFG_PLLM_POS) /**< PLLM倍频因子 = 24 */ #define RCC_PLLM_MUL25 (0x19UL << RCC_PLLCFG_PLLM_POS) /**< PLLM倍频因子 = 25 */ #define RCC_PLLM_MUL26 (0x1AUL << RCC_PLLCFG_PLLM_POS) /**< PLLM倍频因子 = 26 */ #define RCC_PLLM_MUL27 (0x1BUL << RCC_PLLCFG_PLLM_POS) /**< PLLM倍频因子 = 27 */ #define RCC_PLLM_MUL28 (0x1CUL << RCC_PLLCFG_PLLM_POS) /**< PLLM倍频因子 = 28 */ #define RCC_PLLM_MUL29 (0x1DUL << RCC_PLLCFG_PLLM_POS) /**< PLLM倍频因子 = 29 */ #define RCC_PLLM_MUL30 (0x1EUL << RCC_PLLCFG_PLLM_POS) /**< PLLM倍频因子 = 30 */ #define RCC_PLLM_MUL31 (0x1FUL << RCC_PLLCFG_PLLM_POS) /**< PLLM倍频因子 = 31 */ #define RCC_PLLM_MUL32 (0x00000000UL) /**< PLLM倍频因子 = 32 */ /* PLLN分频参数定义 */ #define RCC_PLLN_DIV1 (0x1UL << RCC_PLLCFG_PLLN_POS) /**< PLLN分频因子 = 1 */ #define RCC_PLLN_DIV2 (0x2UL << RCC_PLLCFG_PLLN_POS) /**< PLLN分频因子 = 2 */ #define RCC_PLLN_DIV3 (0x3UL << RCC_PLLCFG_PLLN_POS) /**< PLLN分频因子 = 3 */ #define RCC_PLLN_DIV4 (0x4UL << RCC_PLLCFG_PLLN_POS) /**< PLLN分频因子 = 4 */ #define RCC_PLLN_DIV5 (0x5UL << RCC_PLLCFG_PLLN_POS) /**< PLLN分频因子 = 5 */ #define RCC_PLLN_DIV6 (0x6UL << RCC_PLLCFG_PLLN_POS) /**< PLLN分频因子 = 6 */ #define RCC_PLLN_DIV7 (0x7UL << RCC_PLLCFG_PLLN_POS) /**< PLLN分频因子 = 7 */ #define RCC_PLLN_DIV8 (0x00000000UL) /**< PLLN分频因子 = 8 */ /* PLL时钟源定义 */ #define RCC_PLLSRC_RCH RCC_PLLCFG_PLLSRC_RCH /**< RCH时钟作为PLL的时钟源 */ #define RCC_PLLSRC_HXTAL RCC_PLLCFG_PLLSRC_HXTAL /**< HXTAL作为PLL的时钟源 */ /* 系统时钟源选择 */ #define RCC_SYSCLK_SRC_RCHSYS RCC_CFG_SYSW_RCHSYS /**< 选择RCHSYS作为系统时钟源 */ #define RCC_SYSCLK_SRC_HXTAL RCC_CFG_SYSW_HXTAL /**< 选择HXTAL作为系统时钟源 */ #define RCC_SYSCLK_SRC_PLLCLK RCC_CFG_SYSW_PLL /**< 选择PLL作为系统时钟源 */ #define RCC_SYSCLK_SRC_RCL RCC_CFG_SYSW_RCL /**< 选择RCL作为系统时钟源 */ #define RCC_SYSCLK_SRC_LXTAL RCC_CFG_SYSW_LXTAL /**< 选择LXTAL作为系统时钟源 */ /* 系统时钟源状态定义 */ #define RCC_SYSCLK_SRC_STATUS_RCHSYS RCC_CFG_SYSWS_RCHSYS /**< 系统时钟为RCHSYS */ #define RCC_SYSCLK_SRC_STATUS_HXTAL RCC_CFG_SYSWS_HXTAL /**< 系统时钟为HXTAL */ #define RCC_SYSCLK_SRC_STATUS_PLLCLK RCC_CFG_SYSWS_PLL /**< 系统时钟为PLL */ #define RCC_SYSCLK_SRC_STATUS_RCL RCC_CFG_SYSWS_RCL /**< 系统时钟为RCL */ #define RCC_SYSCLK_SRC_STATUS_LXTAL RCC_CFG_SYSWS_LXTAL /**< 系统时钟为LXTAL */ /* AHB时钟分频参数定义 */ #define RCC_HCLK_DIV1 RCC_CFG_HPRE_1 /**< HCLK不分频 */ #define RCC_HCLK_DIV2 RCC_CFG_HPRE_2 /**< HCLK分频因子 = 2 */ #define RCC_HCLK_DIV4 RCC_CFG_HPRE_4 /**< HCLK分频因子 = 4 */ #define RCC_HCLK_DIV8 RCC_CFG_HPRE_8 /**< HCLK分频因子 = 8 */ #define RCC_HCLK_DIV16 RCC_CFG_HPRE_16 /**< HCLK分频因子 = 16 */ #define RCC_HCLK_DIV32 RCC_CFG_HPRE_32 /**< HCLK分频因子 = 32 */ #define RCC_HCLK_DIV64 RCC_CFG_HPRE_64 /**< HCLK分频因子 = 64 */ #define RCC_HCLK_DIV128 RCC_CFG_HPRE_128 /**< HCLK分频因子 = 128 */ /* APB1时钟分频参数定义 */ #define RCC_PCLK1_DIV1 RCC_CFG_P1PRE_1 /**< APB1总线时钟不分频 */ #define RCC_PCLK1_DIV2 RCC_CFG_P1PRE_2 /**< APB1总线时钟分频因子 = 2 */ #define RCC_PCLK1_DIV4 RCC_CFG_P1PRE_4 /**< APB1总线时钟分频因子 = 4 */ #define RCC_PCLK1_DIV8 RCC_CFG_P1PRE_8 /**< APB1总线时钟分频因子 = 8 */ #define RCC_PCLK1_DIV16 RCC_CFG_P1PRE_16 /**< APB1总线时钟分频因子 = 16 */ /* APB2时钟分频参数定义 */ #define RCC_PCLK2_DIV1 RCC_CFG_P2PRE_1 /**< APB2总线时钟不分频 */ #define RCC_PCLK2_DIV2 RCC_CFG_P2PRE_2 /**< APB2总线时钟分频因子 = 2 */ #define RCC_PCLK2_DIV4 RCC_CFG_P2PRE_4 /**< APB2总线时钟分频因子 = 4 */ #define RCC_PCLK2_DIV8 RCC_CFG_P2PRE_8 /**< APB2总线时钟分频因子 = 8 */ #define RCC_PCLK2_DIV16 RCC_CFG_P2PRE_16 /**< APB2总线时钟分频因子 = 16 */ /* MCO时钟源参数定义 */ #define RCC_MCO_SRC_DISABLE RCC_CFG_MCOSEL_DISABLE /**< MCO输出无效 */ #define RCC_MCO_SRC_SYSCLK RCC_CFG_MCOSEL_SYSCLK /**< MCO选择SYSCLK输出 */ #define RCC_MCO_SRC_RCH RCC_CFG_MCOSEL_RCH /**< MCO选择RCH输出 */ #define RCC_MCO_SRC_HXTAL RCC_CFG_MCOSEL_HXTAL /**< MCO选择HXTAL输出 */ #define RCC_MCO_SRC_PLLCLK RCC_CFG_MCOSEL_PLLCLK /**< MCO选择PLLCLK输出 */ #define RCC_MCO_SRC_RCL RCC_CFG_MCOSEL_RCL /**< MCO选择RCL输出 */ #define RCC_MCO_SRC_LXTAL RCC_CFG_MCOSEL_LXTAL /**< MCO选择LXTAL输出 */ /* MCO时钟分频参数定义 */ #define RCC_MCO_DIV1 RCC_CFG_MCOPRE_DIV1 /**< MCO分频因子 = 1 */ #define RCC_MCO_DIV2 RCC_CFG_MCOPRE_DIV2 /**< MCO分频因子 = 2 */ #define RCC_MCO_DIV4 RCC_CFG_MCOPRE_DIV4 /**< MCO分频因子 = 4 */ #define RCC_MCO_DIV8 RCC_CFG_MCOPRE_DIV8 /**< MCO分频因子 = 8 */ #define RCC_MCO_DIV16 RCC_CFG_MCOPRE_DIV16 /**< MCO分频因子 = 16 */ #define RCC_MCO_DIV32 RCC_CFG_MCOPRE_DIV32 /**< MCO分频因子 = 32 */ #define RCC_MCO_DIV64 RCC_CFG_MCOPRE_DIV64 /**< MCO分频因子 = 64 */ #define RCC_MCO_DIV128 RCC_CFG_MCOPRE_DIV128 /**< MCO分频因子 = 128 */ /* RCC中断控制位定义 */ #define RCC_INTERRUPT_RCL_READY RCC_IER_RCL_RDYIE /**< RCL Ready的中断控制位 */ #define RCC_INTERRUPT_LXTAL_READY RCC_IER_LXTAL_RDYIE /**< LXTAL Ready的中断控制位 */ #define RCC_INTERRUPT_RCH_READY RCC_IER_RCH_RDYIE /**< RCH Ready的中断控制位 */ #define RCC_INTERRUPT_HXTAL_READY RCC_IER_HXTAL_RDYIE /**< HXTAL Ready的中断控制位 */ #define RCC_INTERRUPT_PLL_READY RCC_IER_PLL_RDYIE /**< PLL Ready的中断控制位 */ /* RCC中断标志位定义 */ #define RCC_FLAG_RCL_READY RCC_ISR_RCL_RDYF /**< RCL Ready的中断标志位 */ #define RCC_FLAG_LXTAL_READY RCC_ISR_LXTAL_RDYF /**< LXTAL Ready的中断标志位 */ #define RCC_FLAG_RCH_READY RCC_ISR_RCH_RDYF /**< RCH Ready的中断标志位 */ #define RCC_FLAG_HXTAL_READY RCC_ISR_HXTAL_RDYF /**< HXTAL Ready的中断标志位 */ #define RCC_FLAG_PLL_READY RCC_ISR_PLL_RDYF /**< PLL Ready的中断标志位 */ #define RCC_FLAG_HXTALCSS RCC_ISR_HXTAL_CSSF /**< HXTAL CSS的中断标志位 */ /* RCC清除控制位定义 */ #define RCC_CLEAR_RCL_READY RCC_ICR_RCL_RDYC /**< RCL Ready的清除控制位 */ #define RCC_CLEAR_LXTAL_READY RCC_ICR_LXTAL_RDYC /**< LXTAL Ready的清除控制位 */ #define RCC_CLEAR_RCH_READY RCC_ICR_RCH_RDYC /**< RCH Ready的清除控制位 */ #define RCC_CLEAR_HXTAL_READY RCC_ICR_HXTAL_RDYC /**< HXTAL Ready的清除控制位 */ #define RCC_CLEAR_PLL_READY RCC_ICR_PLL_RDYC /**< PLL Ready的清除控制位 */ #define RCC_CLEAR_HXTALCSS RCC_ICR_HXTAL_CSSC /**< HXTAL CSS的清除控制位 */ /* LXTAL驱动模式参数定义 */ #define RCC_LXTAL_DRIVE_MODE_NORMAL (0x00000000UL) /**< LXTAL驱动能力为普通型 */ #define RCC_LXTAL_DRIVE_MODE_ENHANCE (0x1UL << RCC_AWCR_LXTAL_DRV_MODE_POS) /**< LXTAL驱动能力为增强型 */ /* LXTAL驱动参数配置定义 */ #define RCC_LXTAL_DRIVE_LEVEL0 RCC_AWCR_LXTAL_DRV_0 /**< LXTAL低驱动能力 */ #define RCC_LXTAL_DRIVE_LEVEL1 RCC_AWCR_LXTAL_DRV_1 /**< LXTAL中低驱动能力 */ #define RCC_LXTAL_DRIVE_LEVEL2 RCC_AWCR_LXTAL_DRV_2 /**< LXTAL中高驱动能力 */ #define RCC_LXTAL_DRIVE_LEVEL3 RCC_AWCR_LXTAL_DRV_3 /**< LXTAL高驱动能力 */ /* LXTAL时钟稳定周期数定义 */ #define RCC_LXTAL_STAB_SEL_256 (0x00000000UL) /**< LXTAL时钟稳定周期为256个时钟周期 */ #define RCC_LXTAL_STAB_SEL_1024 (0x1UL << RCC_AWCR_LXTAL_STAB_SEL_POS) /**< LXTAL时钟稳定周期为1024个时钟周期 */ #define RCC_LXTAL_STAB_SEL_4096 (0x2UL << RCC_AWCR_LXTAL_STAB_SEL_POS) /**< LXTAL时钟稳定周期为4096个时钟周期 */ #define RCC_LXTAL_STAB_SEL_16384 (0x3UL << RCC_AWCR_LXTAL_STAB_SEL_POS) /**< LXTAL时钟稳定周期为16384个时钟周期 */ /* IO端口时钟选择 */ #define RCC_PERIPH_CLK_GPIOA RCC_IOPEN_GPIOAEN /**< GPIOA 时钟控制位 */ #define RCC_PERIPH_CLK_GPIOB RCC_IOPEN_GPIOBEN /**< GPIOB 时钟控制位 */ #define RCC_PERIPH_CLK_GPIOC RCC_IOPEN_GPIOCEN /**< GPIOC 时钟控制位 */ #define RCC_PERIPH_CLK_GPIOD RCC_IOPEN_GPIODEN /**< GPIOD 时钟控制位 */ #define RCC_PERIPH_CLK_GPIOF RCC_IOPEN_GPIOFEN /**< GPIOF 时钟控制位 */ /* IO端口复位选择 */ #define RCC_PERIPH_RESET_GPIO_ALL RCC_IOPRST_GPIOA_RST | RCC_IOPRST_GPIOB_RST \ | RCC_IOPRST_GPIOC_RST \ | RCC_IOPRST_GPIOD_RST \ | RCC_IOPRST_GPIOF_RST /**< GPIO所有端口复位控制位 */ #define RCC_PERIPH_RESET_GPIOA RCC_IOPRST_GPIOA_RST /**< GPIOA端口复位控制位 */ #define RCC_PERIPH_RESET_GPIOB RCC_IOPRST_GPIOB_RST /**< GPIOB端口复位控制位 */ #define RCC_PERIPH_RESET_GPIOC RCC_IOPRST_GPIOC_RST /**< GPIOC端口复位控制位 */ #define RCC_PERIPH_RESET_GPIOD RCC_IOPRST_GPIOD_RST /**< GPIOD端口复位控制位 */ #define RCC_PERIPH_RESET_GPIOF RCC_IOPRST_GPIOF_RST /**< GPIOF端口复位控制位 */ /* AHB外设时钟选择 */ #define RCC_PERIPH_CLK_DMA RCC_AHBEN_DMAEN /**< AHB外设DMA时钟控制位 */ #define RCC_PERIPH_CLK_FLASH RCC_AHBEN_FLASHEN /**< AHB外设Flash时钟控制位 */ #define RCC_PERIPH_CLK_CRC RCC_AHBEN_CRCEN /**< AHB外设CRC时钟控制位 */ #define RCC_PERIPH_CLK_AES RCC_AHBEN_AESEN /**< AHB外设AES时钟控制位 */ /* AHB外设复位选择 */ #define RCC_PERIPH_RESET_AHB RCC_AHBRST_DMA_RST | RCC_AHBRST_CRC_RST \ | RCC_AHBRST_AES_RST /**< AHB所有外设复位控制位 */ #define RCC_PERIPH_RESET_DMA RCC_AHBRST_DMA_RST /**< AHB外设DMA复位控制位 */ #define RCC_PERIPH_RESET_CRC RCC_AHBRST_CRC_RST /**< AHB外设CRC复位控制位 */ #define RCC_PERIPH_RESET_AES RCC_AHBRST_AES_RST /**< AHB外设AES复位控制位 */ /* APB1外设时钟选择 */ #define RCC_PERIPH_CLK_TIM3 RCC_APB1EN_TIM3EN /**< APB1外设TIM3时钟控制位 */ #define RCC_PERIPH_CLK_TIM4 RCC_APB1EN_TIM4EN /**< APB1外设TIM4时钟控制位 */ #define RCC_PERIPH_CLK_TIM5 RCC_APB1EN_TIM5EN /**< APB1外设TIM5时钟控制位 */ #define RCC_PERIPH_CLK_TIM8 RCC_APB1EN_TIM8EN /**< APB1外设TIM8时钟控制位 */ #define RCC_PERIPH_CLK_LCD RCC_APB1EN_LCDEN /**< APB1外设LCD时钟控制位 */ #define RCC_PERIPH_CLK_RTC RCC_APB1EN_RTCAPBEN /**< APB1外设RTC时钟控制位 */ #define RCC_PERIPH_CLK_WWDG RCC_APB1EN_WWDGEN /**< APB1外设WWDGSH时钟控制位 */ #define RCC_PERIPH_CLK_SPI2 RCC_APB1EN_SPI2EN /**< APB1外设SPI2时钟控制位 */ #define RCC_PERIPH_CLK_UART2 RCC_APB1EN_UART2EN /**< APB1外设UART2时钟控制位 */ #define RCC_PERIPH_CLK_UART3 RCC_APB1EN_UART3EN /**< APB1外设UART3时钟控制位 */ #define RCC_PERIPH_CLK_UART4 RCC_APB1EN_UART4EN /**< APB1外设UART4时钟控制位 */ #define RCC_PERIPH_CLK_LPUART1 RCC_APB1EN_LPUART1EN /**< APB1外设LPUART1时钟控制位 */ #define RCC_PERIPH_CLK_LPUART2 RCC_APB1EN_LPUART2EN /**< APB1外设LPUART2时钟控制位 */ #define RCC_PERIPH_CLK_I2C1 RCC_APB1EN_I2C1EN /**< APB1外设I2C1时钟控制位 */ #define RCC_PERIPH_CLK_PMU RCC_APB1EN_PMUEN /**< APB1外设PMU时钟控制位 */ #define RCC_PERIPH_CLK_LPTIM1 RCC_APB1EN_LPTIM1EN /**< APB1外设LPTIM1时钟控制位 */ #define RCC_PERIPH_CLK_LPTIM2 RCC_APB1EN_LPTIM2EN /**< APB1外设LPTIM2时钟控制位 */ /* APB1外设复位选择 */ #define RCC_PERIPH_RESET_APB1 RCC_APB1RST_TIM3_RST | RCC_APB1RST_TIM4_RST \ | RCC_APB1RST_TIM5_RST \ | RCC_APB1RST_TIM8_RST \ | RCC_APB1RST_LCD_RST \ | RCC_APB1RST_SPI2_RST \ | RCC_APB1RST_UART2_RST \ | RCC_APB1RST_UART3_RST \ | RCC_APB1RST_UART4_RST \ | RCC_APB1RST_LPUART1_RST \ | RCC_APB1RST_LPUART2_RST \ | RCC_APB1RST_I2C1_RST \ | RCC_APB1RST_LPTIM1_RST \ | RCC_APB1RST_LPTIM2_RST /**< APB1所有外设复位控制位 */ #define RCC_PERIPH_RESET_TIM3 RCC_APB1RST_TIM3_RST /**< APB1外设TIM3复位控制位 */ #define RCC_PERIPH_RESET_TIM4 RCC_APB1RST_TIM4_RST /**< APB1外设TIM4复位控制位 */ #define RCC_PERIPH_RESET_TIM5 RCC_APB1RST_TIM5_RST /**< APB1外设TIM5复位控制位 */ #define RCC_PERIPH_RESET_TIM8 RCC_APB1RST_TIM8_RST /**< APB1外设TIM8复位控制位 */ #define RCC_PERIPH_RESET_LCD RCC_APB1RST_LCD_RST /**< APB1外设LCD复位控制位 */ #define RCC_PERIPH_RESET_SPI2 RCC_APB1RST_SPI2_RST /**< APB1外设SPI2时复位制位 */ #define RCC_PERIPH_RESET_UART2 RCC_APB1RST_UART2_RST /**< APB1外设UART2复位控制位 */ #define RCC_PERIPH_RESET_UART3 RCC_APB1RST_UART3_RST /**< APB1外设UART3复位控制位 */ #define RCC_PERIPH_RESET_UART4 RCC_APB1RST_UART4_RST /**< APB1外设UART4复位控制位 */ #define RCC_PERIPH_RESET_LPUART1 RCC_APB1RST_LPUART1_RST /**< APB1外设LPUART1复位控制位 */ #define RCC_PERIPH_RESET_LPUART2 RCC_APB1RST_LPUART2_RST /**< APB1外设LPUART2复位控制位 */ #define RCC_PERIPH_RESET_I2C1 RCC_APB1RST_I2C1_RST /**< APB1外设I2C1复位控制位 */ #define RCC_PERIPH_RESET_LPTIM1 RCC_APB1RST_LPTIM1_RST /**< APB1外设LPTIM1复位控制位 */ #define RCC_PERIPH_RESET_LPTIM2 RCC_APB1RST_LPTIM2_RST /**< APB1外设LPTIM2复位控制位 */ /* APB2外设时钟选择 */ #define RCC_PERIPH_CLK_SYSCFG RCC_APB2EN_SYSCFGEN /**< APB2外设SYSCFG时钟控制位 */ #define RCC_PERIPH_CLK_TRNG RCC_APB2EN_TRNGEN /**< APB2外设TRNG时钟控制位 */ #define RCC_PERIPH_CLK_SPI1 RCC_APB2EN_SPI1EN /**< APB2外设SPI1时钟控制位 */ #define RCC_PERIPH_CLK_USART1 RCC_APB2EN_USART1EN /**< APB2外设USART1时钟控制位 */ #define RCC_PERIPH_CLK_ADC RCC_APB2EN_ADCEN /**< APB2外设ADC时钟控制位 */ #define RCC_PERIPH_CLK_DBG RCC_APB2EN_DBGEN /**< APB2外设DBG时钟控制位 */ /* APB2外设复位选择 */ #define RCC_PERIPH_RESET_APB2 RCC_APB2RST_SYSCFG_RST | RCC_APB2RST_TRNG_RST \ | RCC_APB2RST_SPI1_RST \ | RCC_APB2RST_USART1_RST \ | RCC_APB2RST_ADC_RST \ | RCC_APB2RST_DBG_RST /**< APB2所有外设复位控制位 */ #define RCC_PERIPH_RESET_SYSCFG RCC_APB2RST_SYSCFG_RST /**< APB2外设SYSCFG复位控制位 */ #define RCC_PERIPH_RESET_TRNG RCC_APB2RST_TRNG_RST /**< APB2外设TRNG时复位制位 */ #define RCC_PERIPH_RESET_SPI1 RCC_APB2RST_SPI1_RST /**< APB2外设SPI1复位控制位 */ #define RCC_PERIPH_RESET_USART1 RCC_APB2RST_USART1_RST /**< APB2外设USART复位控制位 */ #define RCC_PERIPH_RESET_ADC RCC_APB2RST_ADC_RST /**< APB2外设ADC复位控制位 */ #define RCC_PERIPH_RESET_DBG RCC_APB2RST_DBG_RST /**< APB2外设DBG复位控制位 */ /* LPUART1异步时钟源选择 */ #define RCC_LPUART1_ASYNC_CLK_SRC_PCLK1 RCC_CLKSEL_LPUART1_SEL_PCLK /**< APB时钟作为LPUART1的时钟 */ #define RCC_LPUART1_ASYNC_CLK_SRC_SYSCLK RCC_CLKSEL_LPUART1_SEL_SYSCLK /**< 系统时钟作为LPUART1的时钟 */ #define RCC_LPUART1_ASYNC_CLK_SRC_RCH RCC_CLKSEL_LPUART1_SEL_RCH /**< RCH时钟作为LPUART1的时钟 */ #define RCC_LPUART1_ASYNC_CLK_SRC_LXTAL RCC_CLKSEL_LPUART1_SEL_LXTAL /**< LXTAL时钟作为LPUART1的时钟 */ /* LPUART2异步时钟源选择 */ #define RCC_LPUART2_ASYNC_CLK_SRC_PCLK1 RCC_CLKSEL_LPUART2_SEL_PCLK /**< APB时钟作为LPUART2的时钟 */ #define RCC_LPUART2_ASYNC_CLK_SRC_SYSCLK RCC_CLKSEL_LPUART2_SEL_SYSCLK /**< 系统时钟作为LPUART2的时钟 */ #define RCC_LPUART2_ASYNC_CLK_SRC_RCH RCC_CLKSEL_LPUART2_SEL_RCH /**< RCH时钟作为LPUART2的时钟 */ #define RCC_LPUART2_ASYNC_CLK_SRC_LXTAL RCC_CLKSEL_LPUART2_SEL_LXTAL /**< LXTAL时钟作为LPUART2的时钟 */ /* LPTIM1异步时钟源选择 */ #define RCC_LPTIM1_ASYNC_CLK_SRC_PCLK1 RCC_CLKSEL_LPTIM1_SEL_PCLK /**< APB1时钟作为LPTIM1的时钟 */ #define RCC_LPTIM1_ASYNC_CLK_SRC_RCL RCC_CLKSEL_LPTIM1_SEL_RCL /**< RCL作为LPTIM1的时钟 */ #define RCC_LPTIM1_ASYNC_CLK_SRC_RCH RCC_CLKSEL_LPTIM1_SEL_RCH /**< RCH时钟作为LPTIM1的时钟 */ #define RCC_LPTIM1_ASYNC_CLK_SRC_LXTAL RCC_CLKSEL_LPTIM1_SEL_LXTAL /**< LXTAL时钟作为LPTIM1的时钟 */ /* LPTIM2异步时钟源选择 */ #define RCC_LPTIM2_ASYNC_CLK_SRC_PCLK1 RCC_CLKSEL_LPTIM2_SEL_PCLK /**< APB1时钟作为LPTIM2的时钟 */ #define RCC_LPTIM2_ASYNC_CLK_SRC_RCL RCC_CLKSEL_LPTIM2_SEL_RCL /**< RCL作为LPTIM2的时钟 */ #define RCC_LPTIM2_ASYNC_CLK_SRC_RCH RCC_CLKSEL_LPTIM2_SEL_RCH /**< RCH时钟作为LPTIM2的时钟 */ #define RCC_LPTIM2_ASYNC_CLK_SRC_LXTAL RCC_CLKSEL_LPTIM2_SEL_LXTAL /**< LXTAL时钟作为LPTIM2的时钟 */ /* I2C1异步时钟源选择 */ #define RCC_I2C1_ASYNC_CLK_SRC_PCLK1 RCC_CLKSEL_I2C1_SEL_PCLK /**< APB时钟作为I2C1的时钟 */ #define RCC_I2C1_ASYNC_CLK_SRC_SYSCLK RCC_CLKSEL_I2C1_SEL_SYSCLK /**< 系统时钟作为I2C1的时钟 */ #define RCC_I2C1_ASYNC_CLK_SRC_RCH RCC_CLKSEL_I2C1_SEL_RCH /**< RCH时钟作为I2C1的时钟 */ /* ADC异步时钟源选择 */ #define RCC_ADC_ASYNC_CLK_SRC_SYSCLK RCC_CLKSEL_ADC_SEL_SYSCLK /**< 系统时钟作为ADC时钟 */ #define RCC_ADC_ASYNC_CLK_SRC_SYS_DIV2 RCC_CLKSEL_ADC_SEL_SYSCLK_DIV2 /**< 系统时钟2分频作为ADC时钟 */ #define RCC_ADC_ASYNC_CLK_SRC_SYS_DIV4 RCC_CLKSEL_ADC_SEL_SYSCLK_DIV4 /**< 系统时钟4分频作为ADC时钟 */ #define RCC_ADC_ASYNC_CLK_SRC_RCH RCC_CLKSEL_ADC_SEL_RCH /**< RCH时钟作为ADC时钟 */ /* RTC、LCD异步时钟源选择 */ #define RCC_RTC_ASYNC_CLK_SRC_NONE RCC_AWCR_RTCSEL_NONE /**< RTC无时钟配置 */ #define RCC_RTC_ASYNC_CLK_SRC_LXTAL RCC_AWCR_RTCSEL_LXTAL /**< RTC时钟为LXTAL */ #define RCC_RTC_ASYNC_CLK_SRC_RCL RCC_AWCR_RTCSEL_RCL /**< RTC时钟为RCL */ /* 复位标志定义 */ #define RCC_RESET_FLAG_LOCKUP RCC_CSR2_LOCKUP_RSTF /**< LOCKUP复位标志 */ #define RCC_RESET_FLAG_OBL RCC_CSR2_OBL_RSTF /**< 选项字节加载复位标志 */ #define RCC_RESET_FLAG_NRST RCC_CSR2_NRST_RSTF /**< NRST引脚复位标志 */ #define RCC_RESET_FLAG_PMU RCC_CSR2_PMU_RSTF /**< POR/PDR、BOR复位标志 */ #define RCC_RESET_FLAG_SW RCC_CSR2_SW_RSTF /**< 软件复位标志 */ #define RCC_RESET_FLAG_IWDG RCC_CSR2_IWDG_RSTF /**< IWDG复位标志 */ #define RCC_RESET_FLAG_WWDG RCC_CSR2_WWDG_RSTF /**< WWDG复位标志 */ #define RCC_RESET_FLAG_LPM RCC_CSR2_LPM_RSTF /**< 低功耗复位标志 */ #define RCC_RESET_FLAG_ALL (0xFFUL<CSR1 |= RCC_CSR1_RCHON; } /** * @brief 关闭RCH时钟 * @note 如果RCH为系统时钟源,则其不能被停止。此时用户应先将系统时钟源切换为其他时钟,再关闭该时钟源 * @note 当关闭RCH时,需等待RCHRDY标志清零 * @retval 无 */ __STATIC_INLINE void std_rcc_rch_disable(void) { RCC->CSR1 &= (~RCC_CSR1_RCHON); } /** * @brief 获取RCH ready标志 * @retval bool 返回逻辑表达式的判断结果 * @arg true: 表示RCH ready置位 * @arg false:表示RCH ready未置位 */ __STATIC_INLINE bool std_rcc_get_rch_ready(void) { return((RCC->CSR1 & RCC_CSR1_RCHRDY) == RCC_CSR1_RCHRDY); } /** * @brief RCH分频因子配置 * @param rchdiv 定义RCH的分频因子 * @arg RCC_RCH_DIV1:RCH时钟1分频 * @arg RCC_RCH_DIV2:RCH时钟2分频 * @arg RCC_RCH_DIV4:RCH时钟4分频 * @arg RCC_RCH_DIV8:RCH时钟8分频 * @retval 无 */ __STATIC_INLINE void std_rcc_set_rchdiv(uint32_t rchdiv) { MODIFY_REG(RCC->CSR1, RCC_CSR1_RCHDIV, (rchdiv)); } /** * @brief 获取RCH分频因子 * @retval uint32_t RCH的分频因子 * @arg RCC_RCH_DIV1:RCH时钟1分频 * @arg RCC_RCH_DIV2:RCH时钟2分频 * @arg RCC_RCH_DIV4:RCH时钟4分频 * @arg RCC_RCH_DIV8:RCH时钟8分频 */ __STATIC_INLINE uint32_t std_rcc_get_rchdiv(void) { return(RCC->CSR1 & RCC_CSR1_RCHDIV); } /** * @brief 设置PLL时钟参数 * @param pllsource PLL时钟源 * @arg RCC_PLLSRC_RCH * @arg RCC_PLLSRC_HXTAL * @param pllm PLL时钟倍频因子m * @arg RCC_PLLM_MUL1 * @arg RCC_PLLM_MUL4 * @arg ... * @arg RCC_PLLM_MUL32 * @param plln PLL时钟分频因子n * @arg RCC_PLLN_DIV1 * @arg RCC_PLLN_DIV2 * @arg ... * @arg RCC_PLLN_DIV8 * @param plldiv PLL VCO分频因子 * @arg RCC_PLL_DIV1 * @arg RCC_PLL_DIV2 * @arg RCC_PLL_DIV4 * @arg RCC_PLL_DIV8 * @note PLL参数配置必须在PLL使能前完成,一旦PLL使能后,PLL参数不能更改 * @retval 无 */ __STATIC_INLINE void std_rcc_pll_config(uint32_t pllsource, uint32_t pllm, uint32_t plln, uint32_t plldiv) { MODIFY_REG(RCC->PLLCFG, RCC_PLLCFG_PLLSRC | RCC_PLLCFG_PLLDIV | RCC_PLLCFG_PLLM | RCC_PLLCFG_PLLN, pllsource | plldiv | pllm | plln); } /** * @brief 获取PLL时钟源信息 * @retval uint32_t PLL时钟源 * @arg RCC_PLLSRC_RCH * @arg RCC_PLLSRC_HXTAL */ __STATIC_INLINE uint32_t std_rcc_get_pllsource(void) { return(RCC->PLLCFG & RCC_PLLCFG_PLLSRC); } /** * @brief 使能PLL时钟输出 * @retval 无 */ __STATIC_INLINE void std_rcc_pll_output_enable(void) { RCC->PLLCFG |= RCC_PLLCFG_PLLEN; } /** * @brief 禁止PLL时钟输出 * @retval 无 */ __STATIC_INLINE void std_rcc_pll_output_disable(void) { RCC->PLLCFG &= (~RCC_PLLCFG_PLLEN); } /** * @brief 使能PLL时钟 * @note 使能PLL后,软件应等待PLLRDY标志置位后,再使用该时钟 * @retval 无 */ __STATIC_INLINE void std_rcc_pll_enable(void) { RCC->CSR1 |= RCC_CSR1_PLLON; } /** * @brief 关闭PLL时钟 * @note 如果PLL为系统时钟源,则其不能被停止。此时用户应先将系统时钟源切换为其他时钟,再关闭该时钟源 * @retval 无 */ __STATIC_INLINE void std_rcc_pll_disable(void) { RCC->CSR1 &= (~RCC_CSR1_PLLON); } /** * @brief 获取PLL ready标志 * @retval bool 返回逻辑表达式的判断结果 * @arg true: 表示PLL ready置位 * @arg false:表示PLL ready未置位 */ __STATIC_INLINE bool std_rcc_get_pll_ready(void) { return((RCC->CSR1 & RCC_CSR1_PLLRDY) == RCC_CSR1_PLLRDY); } /** * @brief 设置系统时钟源 * @param clocksource 系统时钟源 * @arg RCC_SYSCLK_SRC_RCHSYS * @arg RCC_SYSCLK_SRC_HXTAL * @arg RCC_SYSCLK_SRC_PLLCLK * @arg RCC_SYSCLK_SRC_RCL * @arg RCC_SYSCLK_SRC_LXTAL * @retval 无 */ __STATIC_INLINE void std_rcc_set_sysclk_source(uint32_t clocksource) { MODIFY_REG(RCC->CFG, RCC_CFG_SYSW, clocksource); } /** * @brief 获取系统时钟源信息 * @retval uint32_t 系统时钟源 * @arg RCC_SYSCLK_SRC_STATUS_RCHSYS * @arg RCC_SYSCLK_SRC_STATUS_HXTAL * @arg RCC_SYSCLK_SRC_STATUS_PLLCLK * @arg RCC_SYSCLK_SRC_STATUS_RCL * @arg RCC_SYSCLK_SRC_STATUS_LXTAL */ __STATIC_INLINE uint32_t std_rcc_get_sysclk_source(void) { return(RCC->CFG & RCC_CFG_SYSWS); } /** * @brief 设置AHB时钟分频因子 * @param ahb_div AHB分频因子 * @arg RCC_HCLK_DIV1 * @arg RCC_HCLK_DIV2 * @arg ... * @arg RCC_HCLK_DIV128 * @retval 无 */ __STATIC_INLINE void std_rcc_set_ahbdiv(uint32_t ahb_div) { MODIFY_REG(RCC->CFG, RCC_CFG_HPRE, ahb_div); } /** * @brief 获取AHB时钟分频因子 * @retval uint32_t HCLK时钟分频因子 * @arg RCC_HCLK_DIV1 * @arg RCC_HCLK_DIV2 * @arg ... * @arg RCC_HCLK_DIV128 */ __STATIC_INLINE uint32_t std_rcc_get_ahbdiv(void) { return(RCC->CFG & RCC_CFG_HPRE); } /** * @brief 设置APB1时钟分频因子 * @param apb1_div APB1分频因子 * @arg RCC_PCLK1_DIV1 * @arg RCC_PCLK1_DIV2 * @arg ... * @arg RCC_PCLK1_DIV16 * @retval 无 */ __STATIC_INLINE void std_rcc_set_apb1div(uint32_t apb1_div) { MODIFY_REG(RCC->CFG, RCC_CFG_P1PRE, apb1_div); } /** * @brief 获取APB1时钟分频因子 * @retval uint32_t PCLK1时钟分频因子 * @arg RCC_PCLK1_DIV1 * @arg RCC_PCLK1_DIV2 * @arg ... * @arg RCC_PCLK1_DIV16 */ __STATIC_INLINE uint32_t std_rcc_get_apb1div(void) { return(RCC->CFG & RCC_CFG_P1PRE); } /** * @brief 设置APB2时钟分频因子 * @param apb2_div APB1分频因子 * @arg RCC_PCLK2_DIV1 * @arg RCC_PCLK2_DIV2 * @arg ... * @arg RCC_PCLK2_DIV16 * @retval 无 */ __STATIC_INLINE void std_rcc_set_apb2div(uint32_t apb2_div) { MODIFY_REG(RCC->CFG, RCC_CFG_P2PRE, apb2_div); } /** * @brief 获取APB2时钟分频因子 * @retval uint32_t PCLK2时钟分频因子 * @arg RCC_PCLK2_DIV1 * @arg RCC_PCLK2_DIV2 * @arg ... * @arg RCC_PCLK2_DIV16 */ __STATIC_INLINE uint32_t std_rcc_get_apb2div(void) { return(RCC->CFG & RCC_CFG_P2PRE); } /** * @brief 配置MCO输出信息 * @param mco_source MCO输出源选择 * @arg RCC_MCO_SRC_SYSCLK * @arg RCC_MCO_SRC_RCH * @arg RCC_MCO_SRC_HXTAL * @arg RCC_MCO_SRC_PLLCLK * @arg RCC_MCO_SRC_RCL * @arg RCC_MCO_SRC_LXTAL * @param mco_psc MCO输出分频因子 * @arg RCC_MCO_DIV1 * @arg RCC_MCO_DIV2 * @arg ... * @arg RCC_MCO_DIV128 * @retval 无 */ __STATIC_INLINE void std_rcc_mco_config(uint32_t mco_source, uint32_t mco_psc) { MODIFY_REG(RCC->CFG, RCC_CFG_MCOSEL | RCC_CFG_MCOPRE, mco_source | mco_psc); } /** * @brief 关闭HXTAL时钟 * @note 如果HXTAL为系统时钟源,则其不能被停止。此时用户应先将系统时钟源切换为其他时钟,再关闭该时钟源 * @note 当关闭HXTAL时,需等待HXTALRDY标志清零 * @retval 无 */ __STATIC_INLINE void std_rcc_hxtal_disable(void) { RCC->CSR1 &= (~RCC_CSR1_HXTALON); RCC->CSR1 &= (~RCC_CSR1_HXTALBYP); } /** * @brief 使能HXTAL时钟 * @param mode HXTAL的模式选择 * @arg RCC_HXTAL_ON: 使能晶体模式 * @arg RCC_HXTAL_BYPASS:使能外部时钟模式 * @note 使能HXTAL后,软件应等待HXTALRDY标志置位后,再使用该时钟 * @retval 无 */ __STATIC_INLINE void std_rcc_hxtal_enable(uint32_t mode) { if(mode == RCC_HXTAL_BYPASS) { RCC->CSR1 |= RCC_CSR1_HXTALBYP; } RCC->CSR1 |= RCC_CSR1_HXTALON; } /** * @brief 获取HXTAL ready标志 * @retval bool 返回逻辑表达式的判断结果 * @arg true: 表示HXTAL ready置位 * @arg false:表示HXTAL ready未置位 */ __STATIC_INLINE bool std_rcc_get_hxtal_ready(void) { return((RCC->CSR1 & RCC_CSR1_HXTALRDY) == RCC_CSR1_HXTALRDY); } /** * @brief 配置HXTAL驱动能力 * @param drive_level HXTAL驱动能力参数 * @arg RCC_HXTAL_DRIVE_LEVEL0 * @arg RCC_HXTAL_DRIVE_LEVEL1 * @arg RCC_HXTAL_DRIVE_LEVEL2 * @arg RCC_HXTAL_DRIVE_LEVEL3 * @retval 无 * */ __STATIC_INLINE void std_rcc_hxtal_drive_config(uint32_t drive_level) { MODIFY_REG(RCC->CSR1, RCC_CSR1_HXTAL_DRV, (drive_level)); } /** * @brief 配置HXTAL时钟稳定周期 * @param drive_stabc HXTAL时钟稳定周期 * @arg RCC_HXTAL_STAB_SEL_256 * @arg ... * @arg RCC_HXTAL_STAB_SEL_16384 * @retval 无 * */ __STATIC_INLINE void std_rcc_hxtal_stabc_config(uint32_t drive_stabc) { MODIFY_REG(RCC->STABC, RCC_STABC_HXTAL_STAB_SEL, (drive_stabc)); } /** * @brief 关闭LXTAL时钟 * @note 如果LXTAL为系统时钟源,则其不能被停止。此时用户应先将系统时钟源切换为其他时钟,再关闭该时钟源 * @note 当关闭LXTAL时,需等待LXTALRDY标志清零 * @note 调用该函数前应先调用std_pmu_vaon_write_enable(void),解除RCC_AWCR的写保护 * @retval 无 */ __STATIC_INLINE void std_rcc_lxtal_disable(void) { RCC->AWCR &= (~RCC_AWCR_LXTALON); } /** * @brief 使能LXTAL时钟 * @param mode LXTAL的旁路模式选择 @arg RCC_LXTAL_ON * @note 使能LXTAL后,软件应等待LXTALRDY标志置位后,再使用该时钟 * @note 调用该函数前应先调用std_pmu_vaon_write_enable(void),解除RCC_AWCR的写保护 * @retval 无 */ __STATIC_INLINE void std_rcc_lxtal_enable(uint32_t mode) { RCC->AWCR |= RCC_AWCR_LXTALON; } /** * @brief 获取LXTAL ready标志 * @retval bool 返回逻辑表达式的判断结果 * @arg true: 表示LXTAL ready置位 * @arg false:表示LXTAL ready未置位 */ __STATIC_INLINE bool std_rcc_get_lxtal_ready(void) { return((RCC->AWCR & RCC_AWCR_LXTALRDY) == RCC_AWCR_LXTALRDY); } /** * @brief LXTAL时钟驱动模式选择 * @param lxtal_drv_mode LXTAL驱动模式选择 * @arg RCC_LXTAL_DRIVE_MODE_NORMAL: 普通模式 * @arg RCC_LXTAL_DRIVE_MODE_ENHANCE:增强模式 * @retval 无 */ __STATIC_INLINE void std_rcc_lxtal_drive_mode_config(uint32_t lxtal_drv_mode) { MODIFY_REG(RCC->AWCR, RCC_AWCR_LXTAL_DRV_MODE, (lxtal_drv_mode)); } /** * @brief 配置LXTAL时钟驱动能力 * @param drive_level LXTAL时钟驱动能力参数 * @arg RCC_LXTAL_DRIVE_LEVEL0 * @arg RCC_LXTAL_DRIVE_LEVEL1 * @arg RCC_LXTAL_DRIVE_LEVEL2 * @arg RCC_LXTAL_DRIVE_LEVEL3 * @note 调用该函数前应先调用std_pmu_vaon_write_enable(void),解除RCC_AWCR的写保护 * @retval 无 */ __STATIC_INLINE void std_rcc_lxtal_drive_config(uint32_t drive_level) { MODIFY_REG(RCC->AWCR, RCC_AWCR_LXTAL_DRV, (drive_level)); } /** * @brief 配置LXTAL时钟稳定周期 * @param drive_stabc LXTAL时钟稳定周期 * @arg RCC_LXTAL_STAB_SEL_256 * @arg ... * @arg RCC_LXTAL_STAB_SEL_16384 * @note 调用该函数前应先调用std_pmu_vaon_write_enable(void),解除RCC_AWCR的写保护 * @retval 无 */ __STATIC_INLINE void std_rcc_lxtal_stabc_config(uint32_t drive_stabc) { MODIFY_REG(RCC->AWCR, RCC_AWCR_LXTAL_STAB_SEL, (drive_stabc)); } /** * @brief 使能RCC中断 * @param interrupt 使能RCC中断源的信息 * @arg RCC_INTERRUPT_RCL_READY * @arg RCC_INTERRUPT_LXTAL_READY * @arg RCC_INTERRUPT_RCH_READY * @arg RCC_INTERRUPT_HXTAL_READY * @arg RCC_INTERRUPT_PLL_READY * @retval 无 */ __STATIC_INLINE void std_rcc_interrupt_enable(uint32_t interrupt) { RCC->IER |= (interrupt); } /** * @brief 关闭RCC中断 * @param interrupt 关闭RCC中断源的信息 * @arg RCC_INTERRUPT_RCL_READY * @arg RCC_INTERRUPT_LXTAL_READY * @arg RCC_INTERRUPT_RCH_READY * @arg RCC_INTERRUPT_HXTAL_READY * @arg RCC_INTERRUPT_PLL_READY * @retval 无 */ __STATIC_INLINE void std_rcc_interrupt_disable(uint32_t interrupt) { RCC->IER &= (~(interrupt)); } /** * @brief 获取RCC中断使能状态 * @param interrupt RCC中断源信息 * @arg RCC_INTERRUPT_RCL_READY * @arg RCC_INTERRUPT_LXTAL_READY * @arg RCC_INTERRUPT_RCH_READY * @arg RCC_INTERRUPT_HXTAL_READY * @arg RCC_INTERRUPT_PLL_READY * @retval bool 返回输入中断标志置位状态 * @arg true: 表示指定的中断使能 * @arg false:表示指定的中断未使能 */ __STATIC_INLINE bool std_rcc_get_interrupt_enable(uint32_t interrupt) { return((RCC->IER & (interrupt)) == (interrupt)); } /** * @brief 获取RCC中断标志状态 * @param flag RCC中断标志信息 * @arg RCC_FLAG_RCL_READY * @arg RCC_FLAG_LXTAL_READY * @arg RCC_FLAG_RCH_READY * @arg RCC_FLAG_HXTAL_READY * @arg RCC_FLAG_PLL_READY * @arg RCC_FLAG_HXTALCSS * @retval bool 返回输入中断标志置位状态 * @arg true: 表示指定的中断标志置位 * @arg false:表示指定的中断标志未置位 */ __STATIC_INLINE bool std_rcc_get_flag(uint32_t flag) { return((RCC->ISR & (flag)) == (flag)); } /** * @brief 清除RCC标志 * @param flags 清除标志位 * @arg RCC_CLEAR_RCL_READY * @arg RCC_CLEAR_LXTAL_READY * @arg RCC_CLEAR_RCH_READY * @arg RCC_CLEAR_HXTAL_READY * @arg RCC_CLEAR_PLL_READY * @arg RCC_CLEAR_HXTALCSS * @retval 无 */ __STATIC_INLINE void std_rcc_clear_flag(uint32_t flags) { RCC->ICR |= (flags); } /** * @brief 使能RCL时钟 * @note 使能RCL后,软件应等待RCLRDY标志置位后,再使用该时钟 * @retval 无 */ __STATIC_INLINE void std_rcc_rcl_enable(void) { RCC->CSR2 |= RCC_CSR2_RCLON; } /** * @brief 关闭RCL时钟 * @note 如果RCL为系统时钟源,则其不能被停止。此时用户应先将系统时钟源切换为其他时钟,再关闭该时钟源 * @note 当关闭RCL时,需等待RCLRDY标志清零 * @retval 无 */ __STATIC_INLINE void std_rcc_rcl_disable(void) { RCC->CSR2 &= (~RCC_CSR2_RCLON); } /** * @brief 获取RCL ready标志 * @retval bool 返回逻辑表达式的判断结果 * @arg true: 表示RCL ready置位 * @arg false:表示RCL ready未置位 */ __STATIC_INLINE bool std_rcc_get_rcl_ready(void) { return((RCC->CSR2 & RCC_CSR2_RCLRDY) == RCC_CSR2_RCLRDY); } /** * @brief 使能HXTAL CSS * @note 使能HXTAL CSS后,软件无法关闭,直到复位或者发生CSS故障才允许关闭 * @retval 无 */ __STATIC_INLINE void std_rcc_hxtal_css_enable(void) { RCC->CSR1 |= RCC_CSR1_HXTAL_CSSON; } /** * @brief 获取复位标志 * @param reset_flag 指定要获取的复位标志 * @arg RCC_RESET_FLAG_LOCKUP * @arg RCC_RESET_FLAG_OBL * @arg RCC_RESET_FLAG_NRST * @arg RCC_RESET_FLAG_PMU * @arg RCC_RESET_FLAG_SW * @arg RCC_RESET_FLAG_IWDG * @arg RCC_RESET_FLAG_WWDG * @arg RCC_RESET_FLAG_LPM * @arg RCC_RESET_FLAG_ALL * @retval bool 返回逻辑表达式的判断结果 * @arg true:表示指定的复位标志置位 * @arg false:表示指定的复位标志未置位 */ __STATIC_INLINE bool std_rcc_get_reset_flag(uint32_t reset_flag) { return((RCC->CSR2 & (reset_flag)) == (reset_flag)); } /** * @brief 清除复位标志 * @note 该函数将清除所有复位标志 * @retval 无 */ __STATIC_INLINE void std_rcc_clear_reset_flags(void) { RCC->CSR2 |= RCC_CSR2_RMVF; } /** * @brief GPIO端口时钟使能 * @param gpiox_clock 指定使能的GPIO时钟 * @arg RCC_PERIPH_CLK_GPIOA * @arg ... * @arg RCC_PERIPH_CLK_GPIOF * @retval 无 */ __STATIC_INLINE void std_rcc_gpio_clk_enable(uint32_t gpiox_clock) { RCC->IOPEN |= gpiox_clock; /* RCC外围时钟启用后的延迟 */ __NOP(); __NOP(); __NOP(); } /** * @brief GPIO端口时钟禁止 * @param gpiox_clock 指定禁止的GPIO时钟 * @arg RCC_PERIPH_CLK_GPIOA * @arg ... * @arg RCC_PERIPH_CLK_GPIOF * @retval 无 */ __STATIC_INLINE void std_rcc_gpio_clk_disable(uint32_t gpiox_clock) { RCC->IOPEN &= (~(gpiox_clock)); /* RCC外围时钟启用后的延迟 */ __NOP(); __NOP(); __NOP(); } /** * @brief GPIO端口复位 * @param gpiox_rst 指定复位的GPIO端口 * @arg RCC_PERIPH_RESET_GPIO_ALL * @arg RCC_PERIPH_RESET_GPIOA * @arg ... * @arg RCC_PERIPH_RESET_GPIOF * @retval 无 */ __STATIC_INLINE void std_rcc_gpio_reset(uint32_t gpiox_rst) { RCC->IOPRST |= (gpiox_rst); RCC->IOPRST &= (~(gpiox_rst)); } /** * @brief AHB外设时钟使能 * @param periph_clock 指定使能的AHB外设时钟 * @arg RCC_PERIPH_CLK_DMA * @arg RCC_PERIPH_CLK_FLASH * @arg RCC_PERIPH_CLK_CRC * @arg RCC_PERIPH_CLK_AES * @retval 无 */ __STATIC_INLINE void std_rcc_ahb_clk_enable(uint32_t periph_clock) { RCC->AHBEN |= periph_clock; /* RCC外围时钟启用后的延迟 */ __NOP(); __NOP(); __NOP(); } /** * @brief AHB外设时钟禁止 * @param periph_clock 指定禁止的AHB外设时钟 * @arg RCC_PERIPH_CLK_DMA * @arg RCC_PERIPH_CLK_FLASH * @arg RCC_PERIPH_CLK_CRC * @arg RCC_PERIPH_CLK_AES * @retval 无 */ __STATIC_INLINE void std_rcc_ahb_clk_disable(uint32_t periph_clock) { RCC->AHBEN &= (~(periph_clock)); } /** * @brief AHB外设复位 * @param periph_rst 指定复位的AHB外设 * @arg RCC_PERIPH_RESET_AHB * @arg RCC_PERIPH_RESET_DMA * @arg RCC_PERIPH_RESET_CRC * @arg RCC_PERIPH_RESET_AES * @retval 无 */ __STATIC_INLINE void std_rcc_ahb_reset(uint32_t periph_rst) { RCC->AHBRST |= (periph_rst); RCC->AHBRST &= (~(periph_rst)); } /** * @brief APB1外设时钟使能 * @param periph_clock 指定使能的APB1外设时钟 * @arg RCC_PERIPH_CLK_TIM3 * @arg RCC_PERIPH_CLK_TIM4 * @arg RCC_PERIPH_CLK_TIM5 * @arg RCC_PERIPH_CLK_TIM8 * @arg RCC_PERIPH_CLK_LCD * @arg RCC_PERIPH_CLK_RTC * @arg RCC_PERIPH_CLK_WWDG * @arg RCC_PERIPH_CLK_SPI2 * @arg RCC_PERIPH_CLK_UART2 * @arg RCC_PERIPH_CLK_UART3 * @arg RCC_PERIPH_CLK_UART4 * @arg RCC_PERIPH_CLK_LPUART1 * @arg RCC_PERIPH_CLK_I2C1 * @arg RCC_PERIPH_CLK_LPUART2 * @arg RCC_PERIPH_CLK_PMU * @arg RCC_PERIPH_CLK_LPTIM1 * @arg RCC_PERIPH_CLK_LPTIM2 * @retval 无 */ __STATIC_INLINE void std_rcc_apb1_clk_enable(uint32_t periph_clock) { RCC->APB1EN |= periph_clock; /* RCC外围时钟启用后的延迟 */ __NOP(); __NOP(); __NOP(); } /** * @brief APB1外设时钟禁止 * @param periph_clock 指定禁止的APB1外设时钟 * @arg RCC_PERIPH_CLK_TIM3 * @arg RCC_PERIPH_CLK_TIM4 * @arg RCC_PERIPH_CLK_TIM5 * @arg RCC_PERIPH_CLK_TIM8 * @arg RCC_PERIPH_CLK_LCD * @arg RCC_PERIPH_CLK_RTC * @arg RCC_PERIPH_CLK_WWDG * @arg RCC_PERIPH_CLK_SPI2 * @arg RCC_PERIPH_CLK_UART2 * @arg RCC_PERIPH_CLK_UART3 * @arg RCC_PERIPH_CLK_UART4 * @arg RCC_PERIPH_CLK_LPUART1 * @arg RCC_PERIPH_CLK_I2C1 * @arg RCC_PERIPH_CLK_LPUART2 * @arg RCC_PERIPH_CLK_PMU * @arg RCC_PERIPH_CLK_LPTIM1 * @arg RCC_PERIPH_CLK_LPTIM2 * @retval 无 */ __STATIC_INLINE void std_rcc_apb1_clk_disable(uint32_t periph_clock) { RCC->APB1EN &= (~(periph_clock)); } /** * @brief APB1外设复位 * @param periph_rst 指定复位的APB1外设 * @arg RCC_PERIPH_RESET_APB1 * @arg RCC_PERIPH_RESET_TIM3 * @arg RCC_PERIPH_RESET_TIM4 * @arg RCC_PERIPH_RESET_TIM5 * @arg RCC_PERIPH_RESET_TIM8 * @arg RCC_PERIPH_RESET_LCD * @arg RCC_PERIPH_RESET_SPI2 * @arg RCC_PERIPH_RESET_UART2 * @arg RCC_PERIPH_RESET_UART3 * @arg RCC_PERIPH_RESET_UART4 * @arg RCC_PERIPH_RESET_LPUART1 * @arg RCC_PERIPH_RESET_I2C1 * @arg RCC_PERIPH_RESET_LPUART2 * @arg RCC_PERIPH_RESET_LPTIM1 * @arg RCC_PERIPH_RESET_LPTIM2 * @retval 无 */ __STATIC_INLINE void std_rcc_apb1_reset(uint32_t periph_rst) { RCC->APB1RST |= (periph_rst); RCC->APB1RST &= (~(periph_rst)); } /** * @brief APB2外设时钟使能 * @param periph_clock 指定使能的APB2外设时钟 * @arg RCC_PERIPH_CLK_SYSCFG * @arg RCC_PERIPH_CLK_TRNG * @arg RCC_PERIPH_CLK_SPI1 * @arg RCC_PERIPH_CLK_USART1 * @arg RCC_PERIPH_CLK_ADC * @arg RCC_PERIPH_CLK_DBG * @retval 无 */ __STATIC_INLINE void std_rcc_apb2_clk_enable(uint32_t periph_clock) { RCC->APB2EN |= periph_clock; /* RCC外围时钟启用后的延迟 */ __NOP(); __NOP(); __NOP(); } /** * @brief APB2外设时钟禁止 * @param periph_clock 指定禁止的APB2外设时钟 * @arg RCC_PERIPH_CLK_SYSCFG * @arg RCC_PERIPH_CLK_TRNG * @arg RCC_PERIPH_CLK_SPI1 * @arg RCC_PERIPH_CLK_USART1 * @arg RCC_PERIPH_CLK_ADC * @arg RCC_PERIPH_CLK_DBG * @retval 无 */ __STATIC_INLINE void std_rcc_apb2_clk_disable(uint32_t periph_clock) { RCC->APB2EN &= (~(periph_clock)); } /** * @brief APB2外设复位 * @param periph_rst 指定复位的APB2外设 * @arg RCC_PERIPH_RESET_APB2 * @arg RCC_PERIPH_RESET_SYSCFG * @arg RCC_PERIPH_RESET_TRNG * @arg RCC_PERIPH_RESET_SPI1 * @arg RCC_PERIPH_RESET_USART1 * @arg RCC_PERIPH_RESET_ADC * @arg RCC_PERIPH_RESET_DBG * @retval 无 */ __STATIC_INLINE void std_rcc_apb2_reset(uint32_t periph_rst) { RCC->APB2RST |= (periph_rst); RCC->APB2RST &= (~(periph_rst)); } /** * @brief 使能LOCKUP复位 * @retval 无 */ __STATIC_INLINE void std_rcc_lockup_reset_enable(void) { RCC->CSR2 |= RCC_CSR2_LOCKUP_RSTEN; } /** * @brief 禁止LOCKUP复位 * @retval 无 */ __STATIC_INLINE void std_rcc_lockup_reset_disable(void) { RCC->CSR2 &= (~RCC_CSR2_LOCKUP_RSTEN); } /** * @brief ADC时钟源选择 * @param adcclk_select ADC时钟源 * @arg RCC_ADC_ASYNC_CLK_SRC_SYSCLK * @arg RCC_ADC_ASYNC_CLK_SRC_SYS_DIV2 * @arg RCC_ADC_ASYNC_CLK_SRC_SYS_DIV4 * @arg RCC_ADC_ASYNC_CLK_SRC_RCH * @retval 无 */ __STATIC_INLINE void std_rcc_set_adcclk_source(uint32_t adcclk_select) { MODIFY_REG(RCC->CLKSEL, RCC_CLKSEL_ADC_SEL, (adcclk_select)); } /** * @brief 获取ADC时钟源 * @retval uint32_t 返回ADC时钟源信息 * @arg RCC_ADC_ASYNC_CLK_SRC_SYSCLK * @arg RCC_ADC_ASYNC_CLK_SRC_SYS_DIV2 * @arg RCC_ADC_ASYNC_CLK_SRC_SYS_DIV4 * @arg RCC_ADC_ASYNC_CLK_SRC_RCH */ __STATIC_INLINE uint32_t std_rcc_get_adcclk_source(void) { return(RCC->CLKSEL & RCC_CLKSEL_ADC_SEL); } /** * @brief LPTIM1时钟源选择 * @param lptim1clk_select LPTIM1时钟源 * @arg RCC_LPTIM1_ASYNC_CLK_SRC_PCLK1 * @arg RCC_LPTIM1_ASYNC_CLK_SRC_RCL * @arg RCC_LPTIM1_ASYNC_CLK_SRC_RCH * @arg RCC_LPTIM1_ASYNC_CLK_SRC_LXTAL * @retval 无 */ __STATIC_INLINE void std_rcc_set_lptim1clk_source(uint32_t lptim1clk_select) { MODIFY_REG(RCC->CLKSEL, RCC_CLKSEL_LPTIM1_SEL, (lptim1clk_select)); } /** * @brief 获取LPTIM1时钟源 * @retval uint32_t 返回LPTIM1时钟源信息 * @arg RCC_LPTIM1_ASYNC_CLK_SRC_PCLK1 * @arg RCC_LPTIM1_ASYNC_CLK_SRC_RCL * @arg RCC_LPTIM1_ASYNC_CLK_SRC_RCH * @arg RCC_LPTIM1_ASYNC_CLK_SRC_LXTAL */ __STATIC_INLINE uint32_t std_rcc_get_lptim1clk_source(void) { return(RCC->CLKSEL & RCC_CLKSEL_LPTIM1_SEL); } /** * @brief LPTIM2时钟源选择 * @param lptim2clk_select LPTIM2时钟源 * @arg RCC_LPTIM2_ASYNC_CLK_SRC_PCLK1 * @arg RCC_LPTIM2_ASYNC_CLK_SRC_RCL * @arg RCC_LPTIM2_ASYNC_CLK_SRC_RCH * @arg RCC_LPTIM2_ASYNC_CLK_SRC_LXTAL * @retval 无 */ __STATIC_INLINE void std_rcc_set_lptim2clk_source(uint32_t lptim2clk_select) { MODIFY_REG(RCC->CLKSEL, RCC_CLKSEL_LPTIM2_SEL, (lptim2clk_select)); } /** * @brief 获取LPTIM2时钟源 * @retval uint32_t 返回LPTIM2时钟源信息 * @arg RCC_LPTIM2_ASYNC_CLK_SRC_PCLK1 * @arg RCC_LPTIM2_ASYNC_CLK_SRC_RCL * @arg RCC_LPTIM2_ASYNC_CLK_SRC_RCH * @arg RCC_LPTIM2_ASYNC_CLK_SRC_LXTAL */ __STATIC_INLINE uint32_t std_rcc_get_lptim2clk_source(void) { return(RCC->CLKSEL & RCC_CLKSEL_LPTIM2_SEL); } /** * @brief I2C1时钟源选择 * @param i2c1clk_select I2C1时钟源 * @arg RCC_I2C1_ASYNC_CLK_SRC_PCLK1 * @arg RCC_I2C1_ASYNC_CLK_SRC_SYSCLK * @arg RCC_I2C1_ASYNC_CLK_SRC_RCH * @retval 无 */ __STATIC_INLINE void std_rcc_set_i2c1clk_source(uint32_t i2c1clk_select) { MODIFY_REG(RCC->CLKSEL, RCC_CLKSEL_I2C1_SEL, (i2c1clk_select)); } /** * @brief 获取I2C1时钟源 * @retval uint32_t 返回I2C1时钟源信息 * @arg RCC_I2C1_ASYNC_CLK_SRC_PCLK1 * @arg RCC_I2C1_ASYNC_CLK_SRC_SYSCLK * @arg RCC_I2C1_ASYNC_CLK_SRC_RCH */ __STATIC_INLINE uint32_t std_rcc_get_i2c1clk_source(void) { return(RCC->CLKSEL & RCC_CLKSEL_I2C1_SEL); } /** * @brief LPUART1时钟源选择 * @param lpuart1clk_select LPUART1时钟源 * @arg RCC_LPUART1_ASYNC_CLK_SRC_PCLK1 * @arg RCC_LPUART1_ASYNC_CLK_SRC_SYSCLK * @arg RCC_LPUART1_ASYNC_CLK_SRC_RCH * @arg RCC_LPUART1_ASYNC_CLK_SRC_LXTAL * @retval 无 */ __STATIC_INLINE void std_rcc_set_lpuart1clk_source(uint32_t lpuart1clk_select) { MODIFY_REG(RCC->CLKSEL, RCC_CLKSEL_LPUART1_SEL, (lpuart1clk_select)); } /** * @brief 获取LPUART1时钟源 * @retval uint32_t 返回LPUART1时钟源信息 * @arg RCC_LPUART1_ASYNC_CLK_SRC_PCLK1 * @arg RCC_LPUART1_ASYNC_CLK_SRC_SYSCLK * @arg RCC_LPUART1_ASYNC_CLK_SRC_RCH * @arg RCC_LPUART1_ASYNC_CLK_SRC_LXTAL */ __STATIC_INLINE uint32_t std_rcc_get_lpuart1clk_source(void) { return(RCC->CLKSEL & RCC_CLKSEL_LPUART1_SEL); } /** * @brief LPUART2时钟源选择 * @param lpuart2clk_select LPUART2时钟源 * @arg RCC_LPUART2_ASYNC_CLK_SRC_PCLK1 * @arg RCC_LPUART2_ASYNC_CLK_SRC_SYSCLK * @arg RCC_LPUART2_ASYNC_CLK_SRC_RCH * @arg RCC_LPUART2_ASYNC_CLK_SRC_LXTAL * @retval 无 */ __STATIC_INLINE void std_rcc_set_lpuart2clk_source(uint32_t lpuart2clk_select) { MODIFY_REG(RCC->CLKSEL, RCC_CLKSEL_LPUART2_SEL, (lpuart2clk_select)); } /** * @brief 获取LPUART2时钟源 * @retval uint32_t 返回LPUART2时钟源信息 * @arg RCC_LPUART2_ASYNC_CLK_SRC_PCLK1 * @arg RCC_LPUART2_ASYNC_CLK_SRC_SYSCLK * @arg RCC_LPUART2_ASYNC_CLK_SRC_RCH * @arg RCC_LPUART2_ASYNC_CLK_SRC_LXTAL */ __STATIC_INLINE uint32_t std_rcc_get_lpuart2clk_source(void) { return(RCC->CLKSEL & RCC_CLKSEL_LPUART2_SEL); } /** * @brief RTC/LCD时钟源选择 * @param rtcclk_select RTC/LCD时钟源 * @arg RCC_RTC_ASYNC_CLK_SRC_LXTAL * @arg RCC_RTC_ASYNC_CLK_SRC_RCL * @note 调用该函数前应先调用std_pmu_vaon_write_enable(void),解除RCC_AWCR的写保护 * @retval 无 */ __STATIC_INLINE void std_rcc_set_rtcclk_source(uint32_t rtcclk_select) { MODIFY_REG(RCC->AWCR, RCC_AWCR_RTCSEL, (rtcclk_select)); } /** * @brief 获取RTC/LCD时钟源 * @retval uint32_t 返回RTC/LCD时钟源信息 * @arg RCC_RTC_ASYNC_CLK_SRC_LXTAL * @arg RCC_RTC_ASYNC_CLK_SRC_RCL */ __STATIC_INLINE uint32_t std_rcc_get_rtcclk_source(void) { return(RCC->AWCR & RCC_AWCR_RTCSEL); } /** * @brief 使能RTC时钟 * @note 调用该函数前应先调用std_pmu_vaon_write_enable(void),解除RCC_AWCR的写保护 * @note 应先选择RTC时钟源后再调用该函数使能RTC KCLK时钟 * @retval 无 */ __STATIC_INLINE void std_rcc_rtc_enable(void) { RCC->AWCR |= RCC_AWCR_RTCEN; } /** * @brief 关闭RTC时钟 * @note 调用该函数前应先调用std_pmu_vaon_write_enable(void),解除RCC_AWCR的写保护 * @retval 无 */ __STATIC_INLINE void std_rcc_rtc_disable(void) { RCC->AWCR &= (~RCC_AWCR_RTCEN); } /** * @brief 使能RCH常开功能 * @note 使能后在Stop模式下,RCH仍旧保持打开状态,可用作LPUART的工作时钟,避免因RCH启动时间而减慢通讯速度 * @note 此功能的置位和清除对RCHON位无影响 * @retval 无 */ __STATIC_INLINE void std_rcc_rchawon_enable(void) { RCC->CSR1 |= RCC_CSR1_RCH_AWON; } /** * @brief 禁止RCH常开功能 * @note 此功能的置位和清除对RCHON位无影响 * @retval 无 */ __STATIC_INLINE void std_rcc_rchawon_disable(void) { RCC->CSR1 &= (~RCC_CSR1_RCH_AWON); } /** * @brief VCORE_AON 域复位 * @note 此函数用于重置RTC/TAMP外设(包括备份寄存器)和 RCC_AWCR部分控制位 * @note 调用该函数前应先调用std_pmu_vaon_write_enable(void),解除RCC_AWCR的写保护 * @retval 无 */ __STATIC_INLINE void std_rcc_vcore_aon_reset(void) { RCC->AWCR |= RCC_AWCR_AW_RST; RCC->AWCR &= (~RCC_AWCR_AW_RST); } /** * @brief 写RCL校准值 * @param cal_value RCL校准值,范围为:0x00~0x1F * @retval 无 */ __STATIC_INLINE void std_rcc_write_rcl_calibration(uint32_t cal_value) { MODIFY_REG(RCC->RCLCAL, RCC_RCLCAL_RCL_CAL, cal_value << RCC_RCLCAL_RCL_CAL_POS); } /** * @brief 读取RCL校准值 * @retval uint32_t RCL校准值,范围为:0x00~0x1F */ __STATIC_INLINE uint32_t std_rcc_read_rcl_calibration(void) { return(RCC->RCLCAL & RCC_RCLCAL_RCL_CAL); } /** * @brief 写RCH校准值 * @param cal_value RCH校准值,范围为:0x00~0x7F * @retval 无 */ __STATIC_INLINE void std_rcc_write_rch_calibration(uint32_t cal_value) { MODIFY_REG(RCC->RCHCAL, RCC_RCHCAL_RCH_CAL, cal_value << RCC_RCHCAL_RCH_CAL_POS); } /** * @brief 读取RCH校准值 * @retval uint32_t RCH校准值,范围为:0x00~0x7F */ __STATIC_INLINE uint32_t std_rcc_read_rch_calibration(void) { return(RCC->RCHCAL & RCC_RCHCAL_RCH_CAL); } /** * @brief 写VREFBUF输出电压校准值 * @param cal_value VREFBUF校准值,范围为:0x00~0x7F * @retval 无 */ __STATIC_INLINE void std_rcc_write_vrefbuf_calibration(uint32_t cal_value) { MODIFY_REG(RCC->VREFBUFCAL, RCC_VRBUFCAL_VRBUF_CAL, cal_value); } /** * @brief 读取VREFBUF输出电压校准值 * @retval uint32_t VREFBUF校准值,范围为:0x00~0x7F */ __STATIC_INLINE uint32_t std_rcc_read_vrefbuf_calibration(void) { return(RCC->VREFBUFCAL & RCC_VRBUFCAL_VRBUF_CAL); } /* 获取时钟频率函数 */ uint32_t std_rcc_get_sysclkfreq(void); uint32_t std_rcc_get_pllfreq(void); uint32_t std_rcc_get_hclkfreq(void); uint32_t std_rcc_get_pclk1freq(void); uint32_t std_rcc_get_pclk2freq(void); /** * @} */ #ifdef __cplusplus } #endif /** * @} */ /** * @} */ #endif /* CIU32L051_STD_RCC_H */