CIU32_L051_M307R/Peripheral/CIU32L051_Lib/Include/ciu32l051_std_rcc.h

1593 lines
63 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/************************************************************************************************/
/**
* @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<<RCC_CSR2_LOCKUP_RSTF_POS) /**< 所有复位标志 */
/**
* @}
*/
/*-------------------------------------------functions------------------------------------------*/
/************************************************************************************************/
/**
* @defgroup RCC_External_Functions RCC External Functions
* @brief RCC对外函数
* @{
*
*/
/************************************************************************************************/
/**
* @brief 使能RCH时钟
* @note 使能RCH后软件应等待RCHRDY标志置位后再使用该时钟
* @retval 无
*/
__STATIC_INLINE void std_rcc_rch_enable(void)
{
RCC->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_DIV1RCH时钟1分频
* @arg RCC_RCH_DIV2RCH时钟2分频
* @arg RCC_RCH_DIV4RCH时钟4分频
* @arg RCC_RCH_DIV8RCH时钟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_DIV1RCH时钟1分频
* @arg RCC_RCH_DIV2RCH时钟2分频
* @arg RCC_RCH_DIV4RCH时钟4分频
* @arg RCC_RCH_DIV8RCH时钟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 */