Files
VK035_Template/MDK-ARM/platform/plib035/inc/plib035_rcu.h

956 lines
40 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 plib035_rcu.h
*
* @brief Файл содержит прототипы и компактные inline реализации функций для
* RCU (Reset & Clock control Unit), а также сопутствующие
* макроопределения и перечисления
*
* @author НИИЭТ, Богдан Колбов <kolbov@niiet.ru>
*
******************************************************************************
* @attention
*
* ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО
* ГАРАНТИЙ, ЯВНО ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ ГАРАНТИИ ТОВАРНОЙ
* ПРИГОДНОСТИ, СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ И ОТСУТСТВИЯ
* НАРУШЕНИЙ, НО НЕ ОГРАНИЧИВАЯСЬ ИМИ. ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ
* ПРЕДНАЗНАЧЕНО ДЛЯ ОЗНАКОМИТЕЛЬНЫХ ЦЕЛЕЙ И НАПРАВЛЕНО ТОЛЬКО НА
* ПРЕДОСТАВЛЕНИЕ ДОПОЛНИТЕЛЬНОЙ ИНФОРМАЦИИ О ПРОДУКТЕ, С ЦЕЛЬЮ СОХРАНИТЬ ВРЕМЯ
* ПОТРЕБИТЕЛЮ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ
* ОТВЕТСТВЕННОСТИ ПО КАКИМ-ЛИБО ИСКАМ, ЗА ПРЯМОЙ ИЛИ КОСВЕННЫЙ УЩЕРБ, ИЛИ
* ПО ИНЫМ ТРЕБОВАНИЯМ, ВОЗНИКШИМ ИЗ-ЗА ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
* ИЛИ ИНЫХ ДЕЙСТВИЙ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ.
*
* <h2><center>&copy; 2018 ОАО "НИИЭТ"</center></h2>
******************************************************************************
*/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __PLIB035_RCU_H
#define __PLIB035_RCU_H
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "plib035.h"
/** @addtogroup Peripheral
* @{
*/
/** @defgroup RCU
* @brief Драйвер для работы с тактированием и сбросом периферийных блоков
* @{
*/
/** @defgroup RCU_Exported_Defines Константы
* @{
*/
/** @defgroup RCU_ClkStatus_Define Cтатусы источников тактового сигнала
* @{
*/
#define RCU_ClkStatus_SysClkFail RCU_SYSCLKSTAT_SYSFAIL_Msk /*!< Ошибка текущей системной частоты */
#define RCU_ClkStatus_OSEClkFail RCU_SYSCLKSTAT_OSECLKERR_Msk /*!< Ошибка сигнала внешнего осциллятора */
#define RCU_ClkStatus_PLLClkFail RCU_SYSCLKSTAT_PLLCLKERR_Msk /*!< Ошибка сигнала с PLL */
#define RCU_ClkStatus_PLLDivClkFail RCU_SYSCLKSTAT_PLLDIVCLKERR_Msk /*!< Ошибка сигнала с деленного выхода PLL */
#define RCU_ClkStatus_OSEClkGood RCU_SYSCLKSTAT_OSECLKOK_Msk /*!< Нормальная работа сигнала внешнего осциллятора */
#define RCU_ClkStatus_PLLClkGood RCU_SYSCLKSTAT_PLLCLKOK_Msk /*!< Нормальная работа сигнала с PLL */
#define RCU_ClkStatus_PLLDivClkGood RCU_SYSCLKSTAT_PLLDIVCLKOK_Msk /*!< Нормальная работа сигнала с деленного выхода PLL */
#define IS_RCU_CLK_STATUS(VALUE) (((VALUE) == RCU_ClkStatus_SysClkFail) || \
((VALUE) == RCU_ClkStatus_OSEClkFail) || \
((VALUE) == RCU_ClkStatus_PLLClkFail) || \
((VALUE) == RCU_ClkStatus_PLLDivClkFail) || \
((VALUE) == RCU_ClkStatus_OSEClkGood) || \
((VALUE) == RCU_ClkStatus_PLLClkGood) || \
((VALUE) == RCU_ClkStatus_PLLDivClkGood))
/**
* @}
*/
/** @defgroup RCU_RstStatus_Define Источник, вызвавший последний сброс системы
* @{
*/
#define RCU_RstStatus_POR RCU_SYSRSTSTAT_POR_Msk /*!< Сброс от блока POR */
#define RCU_RstStatus_WDT RCU_SYSRSTSTAT_WDOG_Msk /*!< Сброс от сторожевого таймера */
#define RCU_RstStatus_Sys RCU_SYSRSTSTAT_SYSRST_Msk /*!< Системный сброс */
#define RCU_RstStatus_LockUp RCU_SYSRSTSTAT_LOCKUP_Msk /*!< Сброс по состоянию LockUp ядра */
#define IS_RCU_RST_STATUS(VALUE) (((VALUE) == RCU_RstStatus_POR) || \
((VALUE) == RCU_RstStatus_WDT) || \
((VALUE) == RCU_RstStatus_Sys) || \
((VALUE) == RCU_RstStatus_LockUp))
/**
* @}
*/
/** @defgroup RCU_ITSource_Define Источники прерываний
* @{
*/
#define RCU_ITSource_OSEClkFail RCU_INTEN_OSECLKERR_Msk /*!< Произошла ошибка сигнала внешнего осциллятора */
#define RCU_ITSource_PLLClkFail RCU_INTEN_PLLCLKERR_Msk /*!< Произошла ошибка сигнала с PLL */
#define RCU_ITSource_PLLDivClkFail RCU_INTEN_PLLDIVCLKERR_Msk /*!< Произошла ошибка сигнала с деленного выхода PLL */
#define RCU_ITSource_OSEClkGood RCU_INTEN_OSECLKOK_Msk /*!< Произошел переход к нормальной работе сигнала внешнего осциллятора */
#define RCU_ITSource_PLLClkGood RCU_INTEN_PLLCLKOK_Msk /*!< Произошел переход к нормальной работе сигнала с PLL */
#define RCU_ITSource_PLLDivClkGood RCU_INTEN_PLLDIVCLKOK_Msk /*!< Произошел переход к нормальной работе сигнала с деленного выхода PLL */
#define RCU_ITSource_PLLLock RCU_INTEN_PLLLOCK_Msk /*!< Произошел захват частоты PLL */
#define IS_RCU_IT_SOURCE(VALUE) (((VALUE) == RCU_ITSource_OSEClkFail) || \
((VALUE) == RCU_ITSource_PLLClkFail) || \
((VALUE) == RCU_ITSource_PLLDivClkFail) || \
((VALUE) == RCU_ITSource_OSEClkGood) || \
((VALUE) == RCU_ITSource_PLLClkGood) || \
((VALUE) == RCU_ITSource_PLLDivClkGood) || \
((VALUE) == RCU_ITSource_PLLLock))
/**
* @}
*/
/** @defgroup RCU_ITStatus_Define Статусы прерываний
* @{
*/
#define RCU_ITStatus_OSEClkFail RCU_INTSTAT_OSECLKERR_Msk /*!< Флаг ошибки сигнала внешнего осциллятора */
#define RCU_ITStatus_PLLClkFail RCU_INTSTAT_PLLCLKERR_Msk /*!< Флаг ошибки сигнала с PLL */
#define RCU_ITStatus_PLLDivClkFail RCU_INTSTAT_PLLDIVCLKERR_Msk /*!< Флаг ошибки сигнала с деленного выхода PLL */
#define RCU_ITStatus_OSEClkGood RCU_INTSTAT_OSECLKOK_Msk /*!< Флаг перехода к нормальной работе сигнала внешнего осциллятора */
#define RCU_ITStatus_PLLClkGood RCU_INTSTAT_PLLCLKOK_Msk /*!< Флаг перехода к нормальной работе сигнала с PLL */
#define RCU_ITStatus_PLLDivClkGood RCU_INTSTAT_PLLDIVCLKOK_Msk /*!< Флаг перехода к нормальной работе сигнала с деленного выхода PLL */
#define RCU_ITStatus_PLLLock RCU_INTSTAT_PLLLOCK_Msk /*!< Флаг захвата частоты PLL */
#define RCU_ITStatus_SysFail RCU_INTSTAT_SYSFAIL_Msk /*!< Флаг сбоя системной частоты */
#define IS_RCU_IT_STATUS(VALUE) (((VALUE) == RCU_ITStatus_OSEClkFail) || \
((VALUE) == RCU_ITStatus_PLLClkFail) || \
((VALUE) == RCU_ITStatus_PLLDivClkFail) || \
((VALUE) == RCU_ITStatus_OSEClkGood) || \
((VALUE) == RCU_ITStatus_PLLClkGood) || \
((VALUE) == RCU_ITStatus_PLLDivClkGood) || \
((VALUE) == RCU_ITStatus_PLLLock) || \
((VALUE) == RCU_ITStatus_SysFail))
/**
* @}
*/
/** @defgroup RCU_APBClk_Define Управление тактированием периферийных блоков APB
* @{
*/
#define RCU_APBClk_TMR0 RCU_PCLKCFG_TMR0EN_Msk /*!< Управление тактированием блока TMR 0 */
#define RCU_APBClk_TMR1 RCU_PCLKCFG_TMR1EN_Msk /*!< Управление тактированием блока TMR 1 */
#define RCU_APBClk_TMR2 RCU_PCLKCFG_TMR2EN_Msk /*!< Управление тактированием блока TMR 2 */
#define RCU_APBClk_TMR3 RCU_PCLKCFG_TMR3EN_Msk /*!< Управление тактированием блока TMR 3 */
#define RCU_APBClk_PWM0 RCU_PCLKCFG_PWM0EN_Msk /*!< Управление тактированием блока PWM 0 */
#define RCU_APBClk_PWM1 RCU_PCLKCFG_PWM1EN_Msk /*!< Управление тактированием блока PWM 1 */
#define RCU_APBClk_PWM2 RCU_PCLKCFG_PWM2EN_Msk /*!< Управление тактированием блока PWM 2 */
#define RCU_APBClk_I2C RCU_PCLKCFG_I2CEN_Msk /*!< Управление тактированием блока I2C */
#define RCU_APBClk_QEP RCU_PCLKCFG_QEPEN_Msk /*!< Управление тактированием блока QEP */
#define RCU_APBClk_ECAP0 RCU_PCLKCFG_ECAP0EN_Msk /*!< Управление тактированием блока ECAP 0 */
#define RCU_APBClk_ECAP1 RCU_PCLKCFG_ECAP1EN_Msk /*!< Управление тактированием блока ECAP 1 */
#define RCU_APBClk_ECAP2 RCU_PCLKCFG_ECAP2EN_Msk /*!< Управление тактированием блока ECAP 2 */
#define IS_RCU_APB_CLK(VALUE) (((VALUE) == RCU_APBClk_TMR0) || \
((VALUE) == RCU_APBClk_TMR1) || \
((VALUE) == RCU_APBClk_TMR2) || \
((VALUE) == RCU_APBClk_TMR3) || \
((VALUE) == RCU_APBClk_PWM0) || \
((VALUE) == RCU_APBClk_PWM1) || \
((VALUE) == RCU_APBClk_PWM2) || \
((VALUE) == RCU_APBClk_I2C) || \
((VALUE) == RCU_APBClk_QEP) || \
((VALUE) == RCU_APBClk_ECAP0) || \
((VALUE) == RCU_APBClk_ECAP1) || \
((VALUE) == RCU_APBClk_ECAP2))
/**
* @}
*/
/** @defgroup RCU_AHBClk_Define Управление тактированием периферийных блоков AHB
* @{
*/
#define RCU_AHBClk_GPIOA RCU_HCLKCFG_GPIOAEN_Msk /*!< Управление тактированием блока GPIOA */
#define RCU_AHBClk_GPIOB RCU_HCLKCFG_GPIOBEN_Msk /*!< Управление тактированием блока GPIOB */
#define RCU_AHBClk_CAN RCU_HCLKCFG_CANEN_Msk /*!< Управление тактированием блока CAN */
#define IS_RCU_AHB_CLK(VALUE) (((VALUE) == RCU_AHBClk_GPIOA) || \
((VALUE) == RCU_AHBClk_GPIOB) || \
((VALUE) == RCU_AHBClk_CAN))
/**
* @}
*/
/** @defgroup RCU_APBRst_Define Управление сбросом периферийных блоков APB
* @{
*/
#define RCU_APBRst_TMR0 RCU_PRSTCFG_TMR0EN_Msk /*!< Управление сбросом блока TMR 0 */
#define RCU_APBRst_TMR1 RCU_PRSTCFG_TMR1EN_Msk /*!< Управление сбросом блока TMR 1 */
#define RCU_APBRst_TMR2 RCU_PRSTCFG_TMR2EN_Msk /*!< Управление сбросом блока TMR 2 */
#define RCU_APBRst_TMR3 RCU_PRSTCFG_TMR3EN_Msk /*!< Управление сбросом блока TMR 3 */
#define RCU_APBRst_PWM0 RCU_PRSTCFG_PWM0EN_Msk /*!< Управление сбросом блока PWM 0 */
#define RCU_APBRst_PWM1 RCU_PRSTCFG_PWM1EN_Msk /*!< Управление сбросом блока PWM 1 */
#define RCU_APBRst_PWM2 RCU_PRSTCFG_PWM2EN_Msk /*!< Управление сбросом блока PWM 2 */
#define RCU_APBRst_I2C RCU_PRSTCFG_I2CEN_Msk /*!< Управление сбросом блока I2C */
#define RCU_APBRst_QEP RCU_PRSTCFG_QEPEN_Msk /*!< Управление сбросом блока QEP */
#define RCU_APBRst_ECAP0 RCU_PRSTCFG_ECAP0EN_Msk /*!< Управление сбросом блока ECAP 0 */
#define RCU_APBRst_ECAP1 RCU_PRSTCFG_ECAP1EN_Msk /*!< Управление сбросом блока ECAP 1 */
#define RCU_APBRst_ECAP2 RCU_PRSTCFG_ECAP2EN_Msk /*!< Управление сбросом блока ECAP 2 */
#define IS_RCU_APB_RST(VALUE) (((VALUE) == RCU_APBRst_TMR0) || \
((VALUE) == RCU_APBRst_TMR1) || \
((VALUE) == RCU_APBRst_TMR2) || \
((VALUE) == RCU_APBRst_TMR3) || \
((VALUE) == RCU_APBRst_PWM0) || \
((VALUE) == RCU_APBRst_PWM1) || \
((VALUE) == RCU_APBRst_PWM2) || \
((VALUE) == RCU_APBRst_I2C) || \
((VALUE) == RCU_APBRst_QEP) || \
((VALUE) == RCU_APBRst_ECAP0) || \
((VALUE) == RCU_APBRst_ECAP1) || \
((VALUE) == RCU_APBRst_ECAP2))
/**
* @}
*/
/** @defgroup RCU_AHBRst_Define Управление сбросом периферийных блоков AHB
* @{
*/
#define RCU_AHBRst_GPIOA RCU_HRSTCFG_GPIOAEN_Msk /*!< Управление сбросом блока GPIOA */
#define RCU_AHBRst_GPIOB RCU_HRSTCFG_GPIOBEN_Msk /*!< Управление сбросом блока GPIOB */
#define RCU_AHBRst_CAN RCU_HRSTCFG_CANEN_Msk /*!< Управление сбросом блока CAN */
#define IS_RCU_AHB_RST(VALUE) (((VALUE) == RCU_AHBRst_GPIOA) || \
((VALUE) == RCU_AHBRst_GPIOB) || \
((VALUE) == RCU_AHBRst_CAN))
/**
* @}
*/
/**
* @}
*/
/** @defgroup RCU_Exported_Types Типы
* @{
*/
/**
* @brief Выбор источника опорного сигнала PLL.
*/
typedef enum {
RCU_PLL_Ref_OSEClk = RCU_PLLCFG_REFSRC_OSECLK, /*!< Сигнал внешнего осциллятора */
RCU_PLL_Ref_OSIClk = RCU_PLLCFG_REFSRC_OSICLK /*!< Сигнал внтуреннего осциллятора */
} RCU_PLL_Ref_TypeDef;
#define IS_RCU_PLL_REF(VALUE) (((VALUE) == RCU_PLL_Ref_OSEClk) || \
((VALUE) == RCU_PLL_Ref_OSIClk))
/**
* @brief Выходной делитель OD
*/
typedef enum {
RCU_PLL_OD_Disable = RCU_PLLCFG_OD_Disable, /*!< Делитель OD выключен */
RCU_PLL_OD_Div2 = RCU_PLLCFG_OD_Div2, /*!< Коэффициент деления OD равен 2 */
RCU_PLL_OD_Div4 = RCU_PLLCFG_OD_Div4, /*!< Коэффициент деления OD равен 4 */
RCU_PLL_OD_Div8 = RCU_PLLCFG_OD_Div8 /*!< Коэффициент деления OD равен 8 */
} RCU_PLL_OD_TypeDef;
#define IS_RCU_PLL_OD(VALUE) (((VALUE) == RCU_PLL_OD_Disable) || \
((VALUE) == RCU_PLL_OD_Div2) || \
((VALUE) == RCU_PLL_OD_Div4) || \
((VALUE) == RCU_PLL_OD_Div8))
/**
* @brief Выбор источника тактирования для периферийного блока c несколькими тактовыми доменами - ADC, UART, SPI
*/
typedef enum {
RCU_PeriphClk_OSEClk = RCU_SPICFG_CLKSEL_OSECLK, /*!< Сигнал внешнего осциллятора */
RCU_PeriphClk_PLLClk = RCU_SPICFG_CLKSEL_PLLCLK, /*!< Сигнал с PLL */
RCU_PeriphClk_PLLDivClk = RCU_SPICFG_CLKSEL_PLLDIVCLK, /*!< Сигнал с деленного выхода PLL */
RCU_PeriphClk_OSIClk = RCU_SPICFG_CLKSEL_OSICLK /*!< Сигнал внтуреннего осциллятора */
} RCU_PeriphClk_TypeDef;
#define IS_RCU_PERIPH_CLK(VALUE) (((VALUE) == RCU_PeriphClk_OSEClk) || \
((VALUE) == RCU_PeriphClk_PLLClk) || \
((VALUE) == RCU_PeriphClk_PLLDivClk) || \
((VALUE) == RCU_PeriphClk_OSIClk))
/**
* @brief Выбор источника тактирования для CLKOUT, TRACE, WDT.
*/
typedef enum {
RCU_SysPeriphClk_OSEClk = RCU_CLKOUTCFG_CLKSEL_OSECLK, /*!< Сигнал внешнего осциллятора */
RCU_SysPeriphClk_PLLClk = RCU_CLKOUTCFG_CLKSEL_PLLCLK, /*!< Сигнал с PLL */
RCU_SysPeriphClk_PLLDivClk = RCU_CLKOUTCFG_CLKSEL_PLLDIVCLK, /*!< Сигнал с деленного выхода PLL */
RCU_SysPeriphClk_OSIClk = RCU_CLKOUTCFG_CLKSEL_OSICLK /*!< Сигнал внтуреннего осциллятора */
} RCU_SysPeriphClk_TypeDef;
#define IS_RCU_SYS_PERIPH_CLK(VALUE) (((VALUE) == RCU_SysPeriphClk_OSEClk) || \
((VALUE) == RCU_SysPeriphClk_PLLClk) || \
((VALUE) == RCU_SysPeriphClk_PLLDivClk) || \
((VALUE) == RCU_SysPeriphClk_OSIClk))
/**
* @brief Выбор источника системной частоты.
*/
typedef enum {
RCU_SysClk_OSIClk = RCU_SYSCLKCFG_SYSSEL_OSICLK, /*!< Сигнал внтуреннего осциллятора */
RCU_SysClk_OSEClk = RCU_SYSCLKCFG_SYSSEL_OSECLK, /*!< Сигнал внешнего осциллятора */
RCU_SysClk_PLLClk = RCU_SYSCLKCFG_SYSSEL_PLLCLK, /*!< Сигнал с PLL */
RCU_SysClk_PLLDivClk = RCU_SYSCLKCFG_SYSSEL_PLLDIVCLK /*!< Сигнал с деленного выхода PLL */
} RCU_SysClk_TypeDef;
#define IS_RCU_SYS_CLK(VALUE) (((VALUE) == RCU_SysClk_OSIClk) || \
((VALUE) == RCU_SysClk_OSEClk) || \
((VALUE) == RCU_SysClk_PLLClk) || \
((VALUE) == RCU_SysClk_PLLDivClk))
/**
* @brief Структура инициализации PLL
*
*/
typedef struct
{
uint32_t DivVal; /*!< Значение делителя сигнала на выходе блока PLL (итоговое значение 2*(Div+1)).
Параметр может принимать любое значение из диапазона 0-63. */
FunctionalState DivEn; /*!< Активация делителя PLL*/
RCU_PLL_Ref_TypeDef Ref; /*!< Источник опорного сигнала PLL */
RCU_PLL_OD_TypeDef OD; /*!< Выходной делитель OD */
uint32_t M; /*!< Множитель M.
Параметр может принимать любое значение из диапазона 2-63. */
uint32_t N; /*!< Делитель N.
Параметр может принимать любое значение из диапазона 1-63. */
} RCU_PLL_Init_TypeDef;
#define IS_RCU_PLL_DIV(VALUE) (((VALUE)&0xFFFFFFC0) == 0)
#define IS_RCU_PLL_M(VALUE) (((VALUE) <= 63) && ((VALUE) >= 2))
#define IS_RCU_PLL_N(VALUE) (((VALUE) <= 63) && ((VALUE) >= 1))
#define IS_RCU_PLL_REF_FREQ(VALUE) (((VALUE) <= 64000000) && ((VALUE) >= 4000000))
#define IS_RCU_PLL_CMP_FREQ(VALUE) (((VALUE) <= 20000000) && ((VALUE) >= 4000000))
#define IS_RCU_PLL_VCO_FREQ(VALUE) (((VALUE) <= 200000000) && ((VALUE) >= 120000000))
#define IS_RCU_SYSCLK_FREQ(VALUE) (((VALUE) <= 100000000) && ((VALUE) >= 1000000))
#define IS_RCU_SECPRD(VALUE) (((VALUE)&0xFFFFFF00) == 0)
#define IS_RCU_OSI_CALIB(VALUE) (((VALUE)&0xFFFFFC00) == 0)
#define IS_RCU_PERIPH_DIV(VALUE) (((VALUE)&0xFFFFFFC0) == 0)
/**
* @}
*/
/** @defgroup RCU_Exported_Functions Функции
* @{
*/
/**
* @brief Включение тактирования выбранного APB блока периферии
* @param APBClk Выбор периферии. Любая совокупность значений значений RCU_APBClk_x (@ref RCU_APBClk_Define).
* @param State Выбор состояния
* @retval void
*/
__STATIC_INLINE void RCU_APBClkCmd(uint32_t APBClk, FunctionalState State)
{
assert_param(IS_RCU_APB_CLK(APBClk));
assert_param(IS_FUNCTIONAL_STATE(State));
MODIFY_REG(RCU->PCLKCFG, APBClk, State ? APBClk : 0);
}
/**
* @brief Включение тактирования выбранного AHB блока периферии
* @param AHBClk Выбор периферии. Любая совокупность значений значений RCU_AHBClk_x (@ref RCU_AHBClk_Define).
* @param State Выбор состояния
* @retval void
*/
__STATIC_INLINE void RCU_AHBClkCmd(uint32_t AHBClk, FunctionalState State)
{
assert_param(IS_RCU_AHB_CLK(AHBClk));
assert_param(IS_FUNCTIONAL_STATE(State));
MODIFY_REG(RCU->HCLKCFG, AHBClk, State ? AHBClk : 0);
}
/**
* @brief Вывод из состояния сброса периферийных блоков APB
* @param APBRst Выбор периферийного модуля. Любая совокупность значений значений RCU_APBRst_x (@ref RCU_APBRst_Define).
* @param State Выбор состояния
* @retval void
*/
__STATIC_INLINE void RCU_APBRstCmd(uint32_t APBRst, FunctionalState State)
{
assert_param(IS_RCU_APB_RST(APBRst));
assert_param(IS_FUNCTIONAL_STATE(State));
MODIFY_REG(RCU->PRSTCFG, APBRst, State ? APBRst : 0);
}
/**
* @brief Вывод из состояния сброса периферийных блоков APB
* @param AHBRst Выбор периферийного модуля. Любая совокупность значений значений RCU_AHBRst_x (@ref RCU_AHBRst_Define).
* @param State Выбор состояния
* @retval void
*/
__STATIC_INLINE void RCU_AHBRstCmd(uint32_t AHBRst, FunctionalState State)
{
assert_param(IS_RCU_AHB_RST(AHBRst));
assert_param(IS_FUNCTIONAL_STATE(State));
MODIFY_REG(RCU->HRSTCFG, AHBRst, State ? AHBRst : 0);
}
/**
* @brief Установка опорного тактового сигнала для системной частоты
* @param SysClk Выбор тактового сигнала
* @retval void
*/
__STATIC_INLINE void RCU_SysClkConfig(RCU_SysClk_TypeDef SysClk)
{
assert_param(IS_RCU_SYS_CLK(SysClk));
WRITE_REG(RCU->SYSCLKCFG_bit.SYSSEL, SysClk);
}
/**
* @brief Получение текущего опорного тактового сигнала для системной частоты
* @retval Val Выбранный сигнал
*/
__STATIC_INLINE RCU_SysClk_TypeDef RCU_SysClkStatus(void)
{
return (RCU_SysClk_TypeDef)READ_REG(RCU->SYSCLKSTAT_bit.SYSSTAT);
}
/**
* @brief Получение статуса занятости менеджера тактовых сигналов
* @retval Status Статус
*/
__STATIC_INLINE FlagStatus RCU_BusyStatus(void)
{
return (FlagStatus)READ_BIT(RCU->SYSCLKSTAT, RCU_SYSCLKSTAT_BUSY_Msk);
}
/**
* @brief Получение статуса выбранного тактового сигнала
* @param ClkStatus Выбор тактового сигнала. Любая совокупность значений значений RCU_ClkStatus_x (@ref RCU_ClkStatus_Define).
* @retval Status Статус
*/
__STATIC_INLINE FlagStatus RCU_ClkStatus(uint32_t ClkStatus)
{
return (FlagStatus)READ_BIT(RCU->SYSCLKSTAT, ClkStatus);
}
uint32_t RCU_GetOSIClkFreq(void);
uint32_t RCU_GetOSEClkFreq(void);
uint32_t RCU_GetPLLClkFreq(void);
uint32_t RCU_GetPLLDivClkFreq(void);
uint32_t RCU_GetSysClkFreq(void);
/**
* @brief Включение системы слежения за системным тактовым сигналом
* @param State Выбор состояния
* @retval void
*/
__STATIC_INLINE void RCU_SecurityCmd(FunctionalState State)
{
assert_param(IS_FUNCTIONAL_STATE(State));
WRITE_REG(RCU->SYSCLKCFG_bit.SECEN, State);
}
/**
* @brief Настройка периода срабатывания системы слежения
* @param OSEPrd Максимальное значение счетчика слежения за сигналом OSECLK
* @param PLLPrd Максимальное значение счетчика слежения за сигналом PLLCLK
* @param PLLDivPrd Максимальное значение счетчика слежения за сигналом PLLDIVCLK
* @retval void
*/
__STATIC_INLINE void RCU_SecurityConfig(uint32_t OSEPrd, uint32_t PLLPrd, uint32_t PLLDivPrd)
{
assert_param(IS_RCU_SECPRD(OSEPrd));
assert_param(IS_RCU_SECPRD(PLLPrd));
assert_param(IS_RCU_SECPRD(PLLDivPrd));
MODIFY_REG(RCU->SECPRD, (RCU_SECPRD_OSECLK_Msk | RCU_SECPRD_PLLCLK_Msk | RCU_SECPRD_PLLDIVCLK_Msk),
((OSEPrd << RCU_SECPRD_OSECLK_Pos) | (PLLPrd << RCU_SECPRD_PLLCLK_Pos) | (PLLDivPrd << RCU_SECPRD_PLLDIVCLK_Pos)));
}
/**
* @brief Получение статуса выбранного типа сброса
* @param RstStatus Выбранный тип сброса. Любая совокупность значений значений RCU_RstStatus_x (@ref RCU_RstStatus_Define).
* @retval Status Статус активности
*/
__STATIC_INLINE FlagStatus RCU_RstStatus(uint32_t RstStatus)
{
return (FlagStatus)READ_BIT(RCU->SYSRSTSTAT, RstStatus);
}
/**
* @brief Очистка статуса выбранного типа сброса
* @param RstStatus Выбранный тип сброса. Любая совокупность значений значений RCU_RstStatus_x (@ref RCU_RstStatus_Define).
* @retval void
*/
__STATIC_INLINE void RCU_RstStatusClear(uint32_t RstStatus)
{
assert_param(IS_RCU_RST_STATUS(RstStatus));
WRITE_REG(RCU->SYSRSTSTAT, RstStatus);
}
/**
* @brief Включение сброса ядра по переходу в состояние LockUp
* @param State Выбор состояния
* @retval void
*/
__STATIC_INLINE void RCU_LockUpRstCmd(FunctionalState State)
{
assert_param(IS_FUNCTIONAL_STATE(State));
WRITE_REG(RCU->SYSRSTCFG_bit.LOCKUPEN, State);
}
/**
* @brief Установка калибровочного значения для внутреннего осциллятора
* @param CalibVal Значение калибровки
* @retval void
*/
__STATIC_INLINE void RCU_OSIConfig(uint32_t CalibVal)
{
assert_param(IS_RCU_OSI_CALIB(CalibVal));
WRITE_REG(RCU->OSICFG_bit.CAL, CalibVal);
}
/**
* @brief Разрешение работы внешнего осциллятора
* @param State Выбор состояния
* @retval void
*/
__STATIC_INLINE void RCU_OSECmd(FunctionalState State)
{
assert_param(IS_FUNCTIONAL_STATE(State));
MODIFY_REG(RCU->OSECFG, (RCU_OSECFG_EN_Msk | RCU_OSECFG_XOEN_Msk),
((State << RCU_OSECFG_EN_Pos) | (State << RCU_OSECFG_XOEN_Pos)));
}
OperationStatus RCU_SysClkChangeCmd(RCU_SysClk_TypeDef SysClk);
/** @defgroup RCU_Init_Deinit Конфигурация PLL
* @{
*/
OperationStatus RCU_PLL_AutoConfig(uint32_t SysClkFreq, RCU_PLL_Ref_TypeDef Ref);
OperationStatus RCU_PLL_Init(RCU_PLL_Init_TypeDef* InitStruct);
void RCU_PLL_DeInit(void);
void RCU_PLL_StructInit(RCU_PLL_Init_TypeDef* InitStruct);
/**
* @brief Разрешение работы выхода PLL
* @param State Выбор состояния
* @retval void
*/
__STATIC_INLINE void RCU_PLL_OutCmd(FunctionalState State)
{
assert_param(IS_FUNCTIONAL_STATE(State));
WRITE_REG(RCU->PLLCFG_bit.OUTEN, State);
}
/**
* @brief Включение режима bypass PLL
* @param State Выбор состояния
* @retval void
*/
__STATIC_INLINE void RCU_PLL_BypassCmd(FunctionalState State)
{
assert_param(IS_FUNCTIONAL_STATE(State));
WRITE_REG(RCU->PLLCFG_bit.BYPASS, State);
}
/**
* @brief Настройка внешнего делителя PLL
* @param Val Выбор значения делителя. Тактовый сигнал делится на Val+1.
* @param State Выбор состояния
* @retval void
*/
__STATIC_INLINE void RCU_PLL_DivConfig(uint32_t Val, FunctionalState State)
{
assert_param(IS_FUNCTIONAL_STATE(State));
assert_param(IS_RCU_PLL_DIV(Val));
MODIFY_REG(RCU->PLLDIV, RCU_PLLDIV_DIV_Msk | RCU_PLLDIV_DIVEN_Msk,
(Val << RCU_PLLDIV_DIV_Pos |
State << RCU_PLLDIV_DIVEN_Pos));
}
/**
* @brief Получение статуса захвата частоты PLL
* @retval Status Статус захвата
*/
__STATIC_INLINE FlagStatus RCU_PLL_LockStatus(void)
{
return (FlagStatus)READ_BIT(RCU->PLLCFG, RCU_PLLCFG_LOCK_Msk);
}
/**
* @}
*/
/** @defgroup RCU_CLK_Config_ClkOut Настройка выдачи тактового сигнала CLKOUT
* @{
*/
uint32_t RCU_GetClkOutFreq(void);
/**
* @brief Настройка тактирования ClkOut
* @param ClkOut Источник тактового сигнала
* @param DivVal Значение делителя (деление на 2*(DivVal+1))
* @param DivState Разрешение работы делителя
* @retval void
*/
__STATIC_INLINE void RCU_ClkOutConfig(RCU_SysPeriphClk_TypeDef ClkOut, uint32_t DivVal, FunctionalState DivState)
{
assert_param(IS_RCU_SYS_PERIPH_CLK(ClkOut));
assert_param(IS_RCU_PERIPH_DIV(DivVal));
assert_param(IS_FUNCTIONAL_STATE(DivState));
MODIFY_REG(RCU->CLKOUTCFG, (RCU_CLKOUTCFG_CLKSEL_Msk | RCU_CLKOUTCFG_DIVN_Msk | RCU_CLKOUTCFG_DIVEN_Msk),
((ClkOut << RCU_CLKOUTCFG_CLKSEL_Pos) | (DivVal << RCU_CLKOUTCFG_DIVN_Pos) | (DivState << RCU_CLKOUTCFG_DIVEN_Pos)));
}
/**
* @brief Включение тактирования ClkOut
* @param State Выбор состояния
* @retval void
*/
__STATIC_INLINE void RCU_ClkOutCmd(FunctionalState State)
{
assert_param(IS_FUNCTIONAL_STATE(State));
WRITE_REG(RCU->CLKOUTCFG_bit.CLKEN, State);
WRITE_REG(SIU->CLKOUTCTL_bit.CLKOUTEN, State);
}
/**
* @}
*/
/** @defgroup RCU_CLK_Config_Trace Тактирование модуля трассировки
* @{
*/
uint32_t RCU_GetTraceClkFreq(void);
/**
* @brief Настройка тактирования блока трассировки
* @param TraceClk Источник тактового сигнала
* @param DivVal Значение делителя (деление на 2*(DivVal+1))
* @param DivState Разрешение работы делителя
* @retval void
*/
__STATIC_INLINE void RCU_TraceClkConfig(RCU_SysPeriphClk_TypeDef TraceClk, uint32_t DivVal, FunctionalState DivState)
{
assert_param(IS_RCU_SYS_PERIPH_CLK(TraceClk));
assert_param(IS_RCU_PERIPH_DIV(DivVal));
assert_param(IS_FUNCTIONAL_STATE(DivState));
MODIFY_REG(RCU->TRACECFG, (RCU_TRACECFG_CLKSEL_Msk | RCU_TRACECFG_DIVN_Msk | RCU_TRACECFG_DIVEN_Msk),
((TraceClk << RCU_TRACECFG_CLKSEL_Pos) | (DivVal << RCU_TRACECFG_DIVN_Pos) | (DivState << RCU_TRACECFG_DIVEN_Pos)));
}
/**
* @brief Включение тактирования трассировки
* @param State Выбор состояния
* @retval void
*/
__STATIC_INLINE void RCU_TraceClkCmd(FunctionalState State)
{
assert_param(IS_FUNCTIONAL_STATE(State));
WRITE_REG(RCU->TRACECFG_bit.CLKEN, State);
}
/**
* @}
*/
/** @defgroup RCU_CLK_RST_Config_UART Тактирование и сброс UART
* @{
*/
uint32_t RCU_GetUARTClkFreq(UART_Num_TypeDef UARTx_Num);
/**
* @brief Настройка тактирования UART
* @param UARTx_Num Порядковый номер блока UART
* @param UARTClk Источник тактового сигнала
* @param DivVal Значение делителя (деление на 2*(DivVal+1))
* @param DivState Разрешение работы делителя
* @retval void
*/
__STATIC_INLINE void RCU_UARTClkConfig(UART_Num_TypeDef UARTx_Num, RCU_PeriphClk_TypeDef UARTClk, uint32_t DivVal, FunctionalState DivState)
{
assert_param(IS_RCU_PERIPH_CLK(UARTClk));
assert_param(IS_RCU_PERIPH_DIV(DivVal));
assert_param(IS_FUNCTIONAL_STATE(DivState));
MODIFY_REG(RCU->UARTCFG[UARTx_Num].UARTCFG, (RCU_UARTCFG_UARTCFG_CLKSEL_Msk | RCU_UARTCFG_UARTCFG_DIVN_Msk | RCU_UARTCFG_UARTCFG_DIVEN_Msk),
((UARTClk << RCU_UARTCFG_UARTCFG_CLKSEL_Pos) | (DivVal << RCU_UARTCFG_UARTCFG_DIVN_Pos) | (DivState << RCU_UARTCFG_UARTCFG_DIVEN_Pos)));
}
/**
* @brief Включение тактирования UART
* @param State Выбор состояния
* @retval void
*/
__STATIC_INLINE void RCU_UARTClkCmd(UART_Num_TypeDef UARTx_Num, FunctionalState State)
{
assert_param(IS_FUNCTIONAL_STATE(State));
WRITE_REG(RCU->UARTCFG[UARTx_Num].UARTCFG_bit.CLKEN, State);
}
/**
* @brief Cнятие сброса UART
* @param UARTx_Num Порядковый номер блока UART
* @param State Выбор состояния
* @retval void
*/
__STATIC_INLINE void RCU_UARTRstCmd(UART_Num_TypeDef UARTx_Num, FunctionalState State)
{
assert_param(IS_FUNCTIONAL_STATE(State));
WRITE_REG(RCU->UARTCFG[UARTx_Num].UARTCFG_bit.RSTDIS, State);
}
/**
* @}
*/
/** @defgroup RCU_CLK_RST_Config_SPI Тактирование и сброс SPI
* @{
*/
uint32_t RCU_GetSPIClkFreq(void);
/**
* @brief Настройка тактирования SPI
* @param SPIClk Источник тактового сигнала
* @param DivVal Значение делителя (деление на 2*(DivVal+1))
* @param DivState Разрешение работы делителя
* @retval void
*/
__STATIC_INLINE void RCU_SPIClkConfig(RCU_PeriphClk_TypeDef SPIClk, uint32_t DivVal, FunctionalState DivState)
{
assert_param(IS_RCU_PERIPH_CLK(SPIClk));
assert_param(IS_RCU_PERIPH_DIV(DivVal));
assert_param(IS_FUNCTIONAL_STATE(DivState));
MODIFY_REG(RCU->SPICFG, (RCU_SPICFG_CLKSEL_Msk | RCU_SPICFG_DIVN_Msk | RCU_SPICFG_DIVEN_Msk),
((SPIClk << RCU_SPICFG_CLKSEL_Pos) | (DivVal << RCU_SPICFG_DIVN_Pos) | (DivState << RCU_SPICFG_DIVEN_Pos)));
}
/**
* @brief Включение тактирования SPI
* @param State Выбор состояния
* @retval void
*/
__STATIC_INLINE void RCU_SPIClkCmd(FunctionalState State)
{
assert_param(IS_FUNCTIONAL_STATE(State));
WRITE_REG(RCU->SPICFG_bit.CLKEN, State);
}
/**
* @brief Cнятие сброса SPI
* @param State Выбор состояния
* @retval void
*/
__STATIC_INLINE void RCU_SPIRstCmd(FunctionalState State)
{
assert_param(IS_FUNCTIONAL_STATE(State));
WRITE_REG(RCU->SPICFG_bit.RSTDIS, State);
}
/**
* @}
*/
/** @defgroup RCU_CLK_RST_Config_WDT Тактирование и сброс WDT
* @{
*/
uint32_t RCU_GetWDTClkFreq(void);
/**
* @brief Настройка тактирования сторожевого таймера
* @param WDTClk Источник тактового сигнала
* @param DivVal Значение делителя (деление на 2*(DivVal+1))
* @param DivState Разрешение работы делителя
* @retval void
*/
__STATIC_INLINE void RCU_WDTClkConfig(RCU_SysPeriphClk_TypeDef WDTClk, uint32_t DivVal, FunctionalState DivState)
{
assert_param(IS_RCU_SYS_PERIPH_CLK(WDTClk));
assert_param(IS_RCU_PERIPH_DIV(DivVal));
assert_param(IS_FUNCTIONAL_STATE(DivState));
MODIFY_REG(RCU->WDTCFG, (RCU_WDTCFG_CLKSEL_Msk | RCU_WDTCFG_DIVN_Msk | RCU_WDTCFG_DIVEN_Msk),
((WDTClk << RCU_WDTCFG_CLKSEL_Pos) | (DivVal << RCU_WDTCFG_DIVN_Pos) | (DivState << RCU_WDTCFG_DIVEN_Pos)));
}
/**
* @brief Включение тактирования сторожевого таймера
* @param State Выбор состояния
* @retval void
*/
__STATIC_INLINE void RCU_WDTClkCmd(FunctionalState State)
{
assert_param(IS_FUNCTIONAL_STATE(State));
WRITE_REG(RCU->WDTCFG_bit.CLKEN, State);
}
/**
* @brief Cнятие сброса сторожевого таймера
* @param State Выбор состояния
* @retval void
*/
__STATIC_INLINE void RCU_WDTRstCmd(FunctionalState State)
{
assert_param(IS_FUNCTIONAL_STATE(State));
WRITE_REG(RCU->WDTCFG_bit.RSTDIS, State);
}
/**
* @}
*/
/** @defgroup RCU_CLK_RST_Config_ADC Тактирование и сброс ADC
* @{
*/
uint32_t RCU_GetADCClkFreq(void);
/**
* @brief Настройка тактирования АЦП
* @param ADCClk Источник тактового сигнала
* @param DivVal Значение делителя (деление на 2*(DivVal+1))
* @param DivState Разрешение работы делителя
* @retval void
*/
__STATIC_INLINE void RCU_ADCClkConfig(RCU_PeriphClk_TypeDef ADCClk, uint32_t DivVal, FunctionalState DivState)
{
assert_param(IS_RCU_PERIPH_CLK(ADCClk));
assert_param(IS_RCU_PERIPH_DIV(DivVal));
assert_param(IS_FUNCTIONAL_STATE(DivState));
MODIFY_REG(RCU->ADCCFG, (RCU_ADCCFG_CLKSEL_Msk | RCU_ADCCFG_DIVN_Msk | RCU_ADCCFG_DIVEN_Msk),
((ADCClk << RCU_ADCCFG_CLKSEL_Pos) | (DivVal << RCU_ADCCFG_DIVN_Pos) | (DivState << RCU_ADCCFG_DIVEN_Pos)));
}
/**
* @brief Включение тактирования АЦП
* @param State Выбор состояния
* @retval void
*/
__STATIC_INLINE void RCU_ADCClkCmd(FunctionalState State)
{
assert_param(IS_FUNCTIONAL_STATE(State));
WRITE_REG(RCU->ADCCFG_bit.CLKEN, State);
}
/**
* @brief Cнятие сброса АЦП
* @param State Выбор состояния
* @retval void
*/
__STATIC_INLINE void RCU_ADCRstCmd(FunctionalState State)
{
assert_param(IS_FUNCTIONAL_STATE(State));
WRITE_REG(RCU->ADCCFG_bit.RSTDIS, State);
}
/**
* @}
*/
/** @defgroup RCU_IT Прерывания
* @{
*/
/**
* @brief Разрешение работы прерывания RCU
* @param ITSource Выбор источника прерывания. Любая совокупность значений значений RCU_ITSource_x (@ref RCU_ITSource_Define).
* @param State Выбор состояния
* @retval void
*/
__STATIC_INLINE void RCU_ITCmd(uint32_t ITSource, FunctionalState State)
{
assert_param(IS_RCU_IT_SOURCE(ITSource));
assert_param(IS_FUNCTIONAL_STATE(State));
MODIFY_REG(RCU->INTEN, ITSource, State ? (uint32_t)ITSource : 0);
}
/**
* @brief Получение статуса выбранного флага прерывания
* @param ITStatus Выбранный флаг. Любая совокупность значений значений RCU_ITStatus_x (@ref RCU_ITStatus_Define).
* @retval Status Статус
*/
__STATIC_INLINE FlagStatus RCU_ITStatus(uint32_t ITStatus)
{
assert_param(IS_RCU_IT_STATUS(ITStatus));
return (FlagStatus)READ_BIT(RCU->INTSTAT, ITStatus);
}
/**
* @brief Сброс статуса выбранного флага прерывания
* @param ITStatus Выбранный флаг. Любая совокупность значений значений RCU_ITStatus_x (@ref RCU_ITStatus_Define).
* @retval void
*/
__STATIC_INLINE void RCU_ITStatusClear(uint32_t ITStatus)
{
assert_param(IS_RCU_IT_STATUS(ITStatus));
WRITE_REG(RCU->INTSTAT, ITStatus);
}
/**
* @}
*/
/**
* @}
*/
#ifdef __cplusplus
}
#endif
#endif /* __PLIB035_RCU_H */
/**
* @}
*/
/**
* @}
*/
/******************* (C) COPYRIGHT 2018 NIIET *****END OF FILE****/