190 lines
		
	
	
	
		
			4.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			190 lines
		
	
	
	
		
			4.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|  | /********************************** (C) COPYRIGHT *******************************
 | |||
|  |  * File Name          : CH59x_SYS.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_SYS_H__
 | |||
|  | #define __CH59x_SYS_H__
 | |||
|  | 
 | |||
|  | #ifdef __cplusplus
 | |||
|  | extern "C" { | |||
|  | #endif
 | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief  reset state define | |||
|  |  */ | |||
|  | typedef enum | |||
|  | { | |||
|  |     RST_STATUS_SW = 0, // 软件复位
 | |||
|  |     RST_STATUS_RPOR,   // 上电复位
 | |||
|  |     RST_STATUS_WTR,    // 看门狗超时复位
 | |||
|  |     RST_STATUS_MR,     // 外部手动复位
 | |||
|  |     RST_STATUS_LRM0,   // 唤醒复位-软复位引起
 | |||
|  |     RST_STATUS_GPWSM,  // 下电模式唤醒复位
 | |||
|  |     RST_STATUS_LRM1,   //	唤醒复位-看门狗引起
 | |||
|  |     RST_STATUS_LRM2,   //	唤醒复位-手动复位引起
 | |||
|  | 
 | |||
|  | } SYS_ResetStaTypeDef; | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief  sys info state define | |||
|  |  */ | |||
|  | typedef enum | |||
|  | { | |||
|  |     INFO_ROM_READ = 0, // FlashROM 代码和数据区 是否可读
 | |||
|  |     INFO_RESET_EN = 2, // RST#外部手动复位输入功能是否开启
 | |||
|  |     INFO_BOOT_EN,      // 系统引导程序 BootLoader 是否开启
 | |||
|  |     INFO_DEBUG_EN,     // 系统仿真调试接口是否开启
 | |||
|  |     INFO_LOADER,       // 当前系统是否处于Bootloader 区
 | |||
|  |     STA_SAFEACC_ACT,   // 当前系统是否处于安全访问状态,否则RWA属性区域不可访问
 | |||
|  | 
 | |||
|  | } SYS_InfoStaTypeDef; | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief  获取芯片ID类,一般为固定值 | |||
|  |  */ | |||
|  | #define SYS_GetChipID()      R8_CHIP_ID
 | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief  获取安全访问ID,一般为固定值 | |||
|  |  */ | |||
|  | #define SYS_GetAccessID()    R8_SAFE_ACCESS_ID
 | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   配置系统运行时钟 | |||
|  |  * | |||
|  |  * @param   sc      - 系统时钟源选择 refer to SYS_CLKTypeDef | |||
|  |  */ | |||
|  | void SetSysClock(SYS_CLKTypeDef sc); | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   获取当前系统时钟 | |||
|  |  * | |||
|  |  * @return  Hz | |||
|  |  */ | |||
|  | uint32_t GetSysClock(void); | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   获取当前系统信息状态 | |||
|  |  * | |||
|  |  * @param   i       - refer to SYS_InfoStaTypeDef | |||
|  |  * | |||
|  |  * @return  是否开启 | |||
|  |  */ | |||
|  | uint8_t SYS_GetInfoSta(SYS_InfoStaTypeDef i); | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   获取系统上次复位状态 | |||
|  |  * | |||
|  |  * @return  refer to SYS_ResetStaTypeDef | |||
|  |  */ | |||
|  | #define SYS_GetLastResetSta()    (R8_RESET_STATUS & RB_RESET_FLAG)
 | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   执行系统软件复位 | |||
|  |  */ | |||
|  | void SYS_ResetExecute(void); | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   设置复位保存寄存器的值,不受手动复位、 软件复位、 看门狗复位或者普通唤醒复位的影响 | |||
|  |  * | |||
|  |  * @param   i       - refer to SYS_InfoStaTypeDef | |||
|  |  */ | |||
|  | #define SYS_ResetKeepBuf(d)    (R8_GLOB_RESET_KEEP = d)
 | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   关闭所有中断,并保留当前中断值 | |||
|  |  * | |||
|  |  * @param   pirqv   - 当前保留中断值 | |||
|  |  */ | |||
|  | void SYS_DisableAllIrq(uint32_t *pirqv); | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   恢复之前关闭的中断值 | |||
|  |  * | |||
|  |  * @param   irq_status  - 当前保留中断值 | |||
|  |  */ | |||
|  | void SYS_RecoverIrq(uint32_t irq_status); | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   获取当前系统(SYSTICK)计数值 | |||
|  |  * | |||
|  |  * @return  当前计数值 | |||
|  |  */ | |||
|  | uint32_t SYS_GetSysTickCnt(void); | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   加载看门狗计数初值,递增型 | |||
|  |  * | |||
|  |  * @param   c       - 看门狗计数初值 | |||
|  |  */ | |||
|  | #define WWDG_SetCounter(c)    (R8_WDOG_COUNT = c)
 | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   看门狗定时器溢出中断使能 | |||
|  |  * | |||
|  |  * @param   s       - 溢出是否中断 | |||
|  |  */ | |||
|  | void WWDG_ITCfg(FunctionalState s); | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   看门狗定时器复位功能 | |||
|  |  * | |||
|  |  * @param   s       - 溢出是否复位 | |||
|  |  */ | |||
|  | void WWDG_ResetCfg(FunctionalState s); | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   获取当前看门狗定时器溢出标志 | |||
|  |  * | |||
|  |  * @return  看门狗定时器溢出标志 | |||
|  |  */ | |||
|  | #define WWDG_GetFlowFlag()    (R8_RST_WDOG_CTRL & RB_WDOG_INT_FLAG)
 | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   清除看门狗中断标志,重新加载计数值也可清除 | |||
|  |  */ | |||
|  | void WWDG_ClearFlag(void); | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   uS 延时 | |||
|  |  * | |||
|  |  * @param   t       - 时间参数 | |||
|  |  */ | |||
|  | void mDelayuS(uint16_t t); | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief   mS 延时 | |||
|  |  * | |||
|  |  * @param   t       - 时间参数 | |||
|  |  */ | |||
|  | void mDelaymS(uint16_t t); | |||
|  | 
 | |||
|  | /**
 | |||
|  |  * @brief Enter safe access mode. | |||
|  |  *  | |||
|  |  * @NOTE: After enter safe access mode, about 16 system frequency cycles  | |||
|  |  * are in safe mode, and one or more secure registers can be rewritten  | |||
|  |  * within the valid period. The safe mode will be automatically  | |||
|  |  * terminated after the above validity period is exceeded. | |||
|  |  *  if sys_safe_access_enable() is called, | |||
|  |  *  you must call sys_safe_access_disable() before call sys_safe_access_enable() again. | |||
|  |  */ | |||
|  | #define sys_safe_access_enable()        do{volatile uint32_t mpie_mie;mpie_mie=__risc_v_disable_irq();SAFEOPERATE;\
 | |||
|  |                                         R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;SAFEOPERATE; | |||
|  | 
 | |||
|  | #define sys_safe_access_disable()       R8_SAFE_ACCESS_SIG = 0;__risc_v_enable_irq(mpie_mie);SAFEOPERATE;}while(0)
 | |||
|  | 
 | |||
|  | #ifdef __cplusplus
 | |||
|  | } | |||
|  | #endif
 | |||
|  | 
 | |||
|  | #endif // __CH59x_SYS_H__
 |