292 lines
		
	
	
	
		
			6.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			292 lines
		
	
	
	
		
			6.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|  | /********************************** (C) COPYRIGHT *******************************
 | |||
|  |  * File Name          : CH59x_clk.h | |||
|  |  * Author             : WCH | |||
|  |  * Version            : V1.2 | |||
|  |  * Date               : 2021/11/17 | |||
|  |  * Description | |||
|  |  ********************************************************************************* | |||
|  |  * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. | |||
|  |  * Attention: This software (modified or not) and binary are used for  | |||
|  |  * microcontroller manufactured by Nanjing Qinheng Microelectronics. | |||
|  |  *******************************************************************************/ | |||
|  | 
 | |||
|  | #ifndef __CH59x_CLK_H__
 | |||
|  | #define __CH59x_CLK_H__
 | |||
|  | 
 | |||
|  | #ifdef __cplusplus
 | |||
|  | extern "C" { | |||
|  | #endif
 | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief  系统主频定义 | |||
|  |  */ | |||
|  | typedef enum | |||
|  | { | |||
|  |     CLK_SOURCE_LSI = 0x00, | |||
|  |     CLK_SOURCE_LSE, | |||
|  | 
 | |||
|  |     CLK_SOURCE_HSE_16MHz = 0x22, | |||
|  |     CLK_SOURCE_HSE_8MHz = 0x24, | |||
|  |     CLK_SOURCE_HSE_6_4MHz = 0x25, | |||
|  |     CLK_SOURCE_HSE_4MHz = 0x28, | |||
|  | 
 | |||
|  |     CLK_SOURCE_PLL_60MHz = 0x48, | |||
|  |     CLK_SOURCE_PLL_48MHz = (0x40 | 10), | |||
|  |     CLK_SOURCE_PLL_32MHz = (0x40 | 15), | |||
|  |     CLK_SOURCE_PLL_24MHz = (0x40 | 20), | |||
|  | } SYS_CLKTypeDef; | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief  32K时钟选择 | |||
|  |  */ | |||
|  | typedef enum | |||
|  | { | |||
|  |     Clk32K_LSI = 0, | |||
|  |     Clk32K_LSE, | |||
|  | 
 | |||
|  | } LClk32KTypeDef; | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief  32M晶振电流挡位 | |||
|  |  */ | |||
|  | typedef enum | |||
|  | { | |||
|  |     HSE_RCur_75 = 0, | |||
|  |     HSE_RCur_100, | |||
|  |     HSE_RCur_125, | |||
|  |     HSE_RCur_150 | |||
|  | 
 | |||
|  | } HSECurrentTypeDef; | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief  32M晶振内部电容挡位 | |||
|  |  */ | |||
|  | typedef enum | |||
|  | { | |||
|  |     HSECap_10p = 0, | |||
|  |     HSECap_12p, | |||
|  |     HSECap_14p, | |||
|  |     HSECap_16p, | |||
|  |     HSECap_18p, | |||
|  |     HSECap_20p, | |||
|  |     HSECap_22p, | |||
|  |     HSECap_24p | |||
|  | 
 | |||
|  | } HSECapTypeDef; | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief  32K晶振电流挡位 | |||
|  |  */ | |||
|  | typedef enum | |||
|  | { | |||
|  |     LSE_RCur_70 = 0, | |||
|  |     LSE_RCur_100, | |||
|  |     LSE_RCur_140, | |||
|  |     LSE_RCur_200 | |||
|  | 
 | |||
|  | } LSECurrentTypeDef; | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief  32K晶振内部电容挡位 | |||
|  |  */ | |||
|  | typedef enum | |||
|  | { | |||
|  |     LSECap_2p = 0,  // 定义保留,实际上为12p
 | |||
|  |     LSECap_12p = 0, | |||
|  |     LSECap_13p, | |||
|  |     LSECap_14p, | |||
|  |     LSECap_15p, | |||
|  |     LSECap_16p, | |||
|  |     LSECap_17p, | |||
|  |     LSECap_18p, | |||
|  |     LSECap_19p, | |||
|  |     LSECap_20p, | |||
|  |     LSECap_21p, | |||
|  |     LSECap_22p, | |||
|  |     LSECap_23p, | |||
|  |     LSECap_24p, | |||
|  |     LSECap_25p, | |||
|  |     LSECap_26p, | |||
|  |     LSECap_27p | |||
|  | 
 | |||
|  | } LSECapTypeDef; | |||
|  | 
 | |||
|  | #define RTC_MAX_COUNT             0xA8C00000
 | |||
|  | 
 | |||
|  | #define MAX_DAY                   0x00004000
 | |||
|  | #define MAX_2_SEC                 0x0000A8C0
 | |||
|  | //#define	 MAX_SEC		0x545FFFFF
 | |||
|  | 
 | |||
|  | #define BEGYEAR                   2020
 | |||
|  | #define IsLeapYear(yr)            (!((yr) % 400) || (((yr) % 100) && !((yr) % 4)))
 | |||
|  | #define YearLength(yr)            (IsLeapYear(yr) ? 366 : 365)
 | |||
|  | #define monthLength(lpyr, mon)    (((mon) == 1) ? (28 + (lpyr)) : (((mon) > 6) ? (((mon) & 1) ? 31 : 30) : (((mon) & 1) ? 30 : 31)))
 | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief  rtc timer mode period define | |||
|  |  */ | |||
|  | typedef enum | |||
|  | { | |||
|  |     Period_0_125_S = 0, // 0.125s 周期
 | |||
|  |     Period_0_25_S,      // 0.25s 周期
 | |||
|  |     Period_0_5_S,       // 0.5s 周期
 | |||
|  |     Period_1_S,         // 1s 周期
 | |||
|  |     Period_2_S,         // 2s 周期
 | |||
|  |     Period_4_S,         // 4s 周期
 | |||
|  |     Period_8_S,         // 8s 周期
 | |||
|  |     Period_16_S,        // 16s 周期
 | |||
|  | } RTC_TMRCycTypeDef; | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief  rtc interrupt event define | |||
|  |  */ | |||
|  | typedef enum | |||
|  | { | |||
|  |     RTC_TRIG_EVENT = 0, // RTC 触发事件
 | |||
|  |     RTC_TMR_EVENT,      // RTC 周期定时事件
 | |||
|  | 
 | |||
|  | } RTC_EVENTTypeDef; | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief  rtc interrupt event define | |||
|  |  */ | |||
|  | typedef enum | |||
|  | { | |||
|  |     RTC_TRIG_MODE = 0, // RTC 触发模式
 | |||
|  |     RTC_TMR_MODE,      // RTC 周期定时模式
 | |||
|  | 
 | |||
|  | } RTC_MODETypeDef; | |||
|  | 
 | |||
|  | typedef enum | |||
|  | { | |||
|  |     /* 校准精度越高,耗时越长 */ | |||
|  |     Level_32 = 3, // 用时 1.2ms 1000ppm (32M 主频)  1100ppm (60M 主频)
 | |||
|  |     Level_64,     // 用时 2.2ms 800ppm  (32M 主频)  1000ppm (60M 主频)
 | |||
|  |     Level_128,    // 用时 4.2ms 600ppm  (32M 主频)  800ppm  (60M 主频)
 | |||
|  | 
 | |||
|  | } Cali_LevelTypeDef; | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   32K 低频时钟来源 | |||
|  |  * | |||
|  |  * @param   hc  - 选择32K使用内部还是外部 | |||
|  |  */ | |||
|  | void LClk32K_Select(LClk32KTypeDef hc); | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   HSE晶体 偏置电流配置 | |||
|  |  * | |||
|  |  * @param   c   - 75%,100%,125%,150% | |||
|  |  */ | |||
|  | void HSECFG_Current(HSECurrentTypeDef c); | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   HSE晶体 负载电容配置 | |||
|  |  * | |||
|  |  * @param   c   - refer to HSECapTypeDef | |||
|  |  */ | |||
|  | void HSECFG_Capacitance(HSECapTypeDef c); | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   LSE晶体 偏置电流配置 | |||
|  |  * | |||
|  |  * @param   c   - 70%,100%,140%,200% | |||
|  |  */ | |||
|  | void LSECFG_Current(LSECurrentTypeDef c); | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   LSE晶体 负载电容配置 | |||
|  |  * | |||
|  |  * @param   c   - refer to LSECapTypeDef | |||
|  |  */ | |||
|  | void LSECFG_Capacitance(LSECapTypeDef c); | |||
|  | 
 | |||
|  | void Calibration_LSI(Cali_LevelTypeDef cali_Lv); /* 用主频校准内部32K时钟 */ | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   RTC时钟初始化当前时间 | |||
|  |  * | |||
|  |  * @param   y       - 配置年,MAX_Y = BEGYEAR + 44 | |||
|  |  * @param   mon     - 配置月,MAX_MON = 12 | |||
|  |  * @param   d       - 配置日,MAX_D = 31 | |||
|  |  * @param   h       - 配置小时,MAX_H = 23 | |||
|  |  * @param   m       - 配置分钟,MAX_M = 59 | |||
|  |  * @param   s       - 配置秒,MAX_S = 59 | |||
|  |  */ | |||
|  | void RTC_InitTime(uint16_t y, uint16_t mon, uint16_t d, uint16_t h, uint16_t m, uint16_t s); | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   获取当前时间 | |||
|  |  * | |||
|  |  * @param   py      - 获取到的年,MAX_Y = BEGYEAR + 44 | |||
|  |  * @param   pmon    - 获取到的月,MAX_MON = 12 | |||
|  |  * @param   pd      - 获取到的日,MAX_D = 31 | |||
|  |  * @param   ph      - 获取到的小时,MAX_H = 23 | |||
|  |  * @param   pm      - 获取到的分钟,MAX_M = 59 | |||
|  |  * @param   ps      - 获取到的秒,MAX_S = 59 | |||
|  |  */ | |||
|  | void RTC_GetTime(uint16_t *py, uint16_t *pmon, uint16_t *pd, uint16_t *ph, uint16_t *pm, uint16_t *ps); | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   基于LSE/LSI时钟,配置当前RTC 周期数 | |||
|  |  * | |||
|  |  * @param   cyc     - 配置周期计数初值,MAX_CYC = 0xA8BFFFFF = 2831155199 | |||
|  |  */ | |||
|  | void RTC_SetCycle32k(uint32_t cyc); | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   基于LSE/LSI时钟,获取当前RTC 周期数 | |||
|  |  * | |||
|  |  * @return  当前周期数,MAX_CYC = 0xA8BFFFFF = 2831155199 | |||
|  |  */ | |||
|  | uint32_t RTC_GetCycle32k(void); | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   RTC定时模式配置(注意定时基准固定为32768Hz) | |||
|  |  * | |||
|  |  * @param   t   - refer to RTC_TMRCycTypeDef | |||
|  |  */ | |||
|  | void RTC_TRIGFunCfg(uint32_t cyc); | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   RTC定时模式配置(注意定时基准固定为32768Hz) | |||
|  |  * | |||
|  |  * @param   t   - refer to RTC_TMRCycTypeDef | |||
|  |  */ | |||
|  | void RTC_TMRFunCfg(RTC_TMRCycTypeDef t); | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   RTC 模式功能关闭 | |||
|  |  * | |||
|  |  * @param   m   - 需要关闭的当前模式 | |||
|  |  */ | |||
|  | void RTC_ModeFunDisable(RTC_MODETypeDef m); | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   获取RTC中断标志 | |||
|  |  * | |||
|  |  * @param   f   - refer to RTC_EVENTTypeDef | |||
|  |  * | |||
|  |  * @return  中断标志状态 | |||
|  |  */ | |||
|  | uint8_t RTC_GetITFlag(RTC_EVENTTypeDef f); | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   清除RTC中断标志 | |||
|  |  * | |||
|  |  * @param   f   - refer to RTC_EVENTTypeDef | |||
|  |  */ | |||
|  | void RTC_ClearITFlag(RTC_EVENTTypeDef f); | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   32K 低频时钟电源配置 | |||
|  |  */ | |||
|  | void LClk32K_Cfg(LClk32KTypeDef hc, FunctionalState s); | |||
|  | 
 | |||
|  | 
 | |||
|  | #ifdef __cplusplus
 | |||
|  | } | |||
|  | #endif
 | |||
|  | 
 | |||
|  | #endif // __CH59x_CLK_H__
 |