2039 lines
93 KiB
C
2039 lines
93 KiB
C
/**
|
||
******************************************************************************
|
||
* @file plib035_pwm.h
|
||
*
|
||
* @brief Файл содержит прототипы и компактные inline реализации функций для
|
||
* PWM, а также сопутствующие макроопределения и перечисления
|
||
*
|
||
* @author НИИЭТ, Богдан Колбов <kolbov@niiet.ru>
|
||
*
|
||
******************************************************************************
|
||
* @attention
|
||
*
|
||
* ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО
|
||
* ГАРАНТИЙ, ЯВНО ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ ГАРАНТИИ ТОВАРНОЙ
|
||
* ПРИГОДНОСТИ, СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ И ОТСУТСТВИЯ
|
||
* НАРУШЕНИЙ, НО НЕ ОГРАНИЧИВАЯСЬ ИМИ. ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ
|
||
* ПРЕДНАЗНАЧЕНО ДЛЯ ОЗНАКОМИТЕЛЬНЫХ ЦЕЛЕЙ И НАПРАВЛЕНО ТОЛЬКО НА
|
||
* ПРЕДОСТАВЛЕНИЕ ДОПОЛНИТЕЛЬНОЙ ИНФОРМАЦИИ О ПРОДУКТЕ, С ЦЕЛЬЮ СОХРАНИТЬ ВРЕМЯ
|
||
* ПОТРЕБИТЕЛЮ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ
|
||
* ОТВЕТСТВЕННОСТИ ПО КАКИМ-ЛИБО ИСКАМ, ЗА ПРЯМОЙ ИЛИ КОСВЕННЫЙ УЩЕРБ, ИЛИ
|
||
* ПО ИНЫМ ТРЕБОВАНИЯМ, ВОЗНИКШИМ ИЗ-ЗА ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
|
||
* ИЛИ ИНЫХ ДЕЙСТВИЙ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ.
|
||
*
|
||
* <h2><center>© 2018 ОАО "НИИЭТ"</center></h2>
|
||
******************************************************************************
|
||
*/
|
||
|
||
/* Define to prevent recursive inclusion -------------------------------------*/
|
||
#ifndef __PLIB035_PWM_H
|
||
#define __PLIB035_PWM_H
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
/* Includes ------------------------------------------------------------------*/
|
||
#include "plib035.h"
|
||
|
||
/** @addtogroup Peripheral
|
||
* @{
|
||
*/
|
||
|
||
/** @defgroup PWM
|
||
* @brief Драйвер для работы с PWM
|
||
* @{
|
||
*/
|
||
|
||
/** @defgroup PWM_Exported_Defines Константы
|
||
* @{
|
||
*/
|
||
|
||
/** @defgroup PWM_TB_Status_Define Статусы счетчика
|
||
* @{
|
||
*/
|
||
|
||
#define PWM_TB_Status_CountDir PWM_TBSTS_CTRDIR_Msk /*!< Направление счета */
|
||
#define PWM_TB_Status_SyncIn PWM_TBSTS_SYNCI_Msk /*!< Произошло событие синхронизации */
|
||
#define PWM_TB_Status_CountMax PWM_TBSTS_CTRMAX_Msk /*!< Таймер достиг максимального значения 0xFFFF */
|
||
#define PWM_TB_Status_All (PWM_TB_Status_CountDir | \
|
||
PWM_TB_Status_SyncIn | \
|
||
PWM_TB_Status_CountMax) /*!< Все статусы выбраны */
|
||
|
||
#define IS_PWM_TB_STATUS(VALUE) (((VALUE) & ~PWM_TB_Status_All) == 0)
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
/** @defgroup PWM_CMP_Status_Define Статусы компаратора
|
||
* @{
|
||
*/
|
||
|
||
#define PWM_CMP_Status_ShadowLoadedA PWM_CMPCTL_SHDWAFULL_Msk /*!< Произошла теневая загрузка в CMPA */
|
||
#define PWM_CMP_Status_ShadowLoadedB PWM_CMPCTL_SHDWBFULL_Msk /*!< Произошла теневая загрузка в CMPB */
|
||
#define PWM_CMP_Status_All (PWM_CMP_Status_ShadowLoadedA | \
|
||
PWM_CMP_Status_ShadowLoadedB) /*!< Все статусы выбраны */
|
||
|
||
#define IS_PWM_CMP_STATUS(VALUE) (((VALUE) & ~PWM_CMP_Status_All) == 0)
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
/** @defgroup PWM_Presc_Define Управление предделителями таймеров блоков ШИМ
|
||
* @{
|
||
*/
|
||
|
||
#define PWM_TB_Presc_0 (0x1UL << SIU_PWMSYNC_PRESCRST_Pos) /*!< Предделитель блока ШИМ0 */
|
||
#define PWM_TB_Presc_1 (0x2UL << SIU_PWMSYNC_PRESCRST_Pos) /*!< Предделитель блока ШИМ1 */
|
||
#define PWM_TB_Presc_2 (0x4UL << SIU_PWMSYNC_PRESCRST_Pos) /*!< Предделитель блока ШИМ2 */
|
||
#define PWM_TB_Presc_All (PWM_TB_Presc_0 | \
|
||
PWM_TB_Presc_1 | \
|
||
PWM_TB_Presc_2) /*!< Все блоки выбраны */
|
||
|
||
#define IS_PWM_TB_PRESC(VALUE) (((VALUE) & ~PWM_TB_Presc_All) == 0)
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
/** @defgroup PWM_TZ_ITSource_Define Источники прерываний блока сигналов аварий ШИМ
|
||
* @{
|
||
*/
|
||
|
||
#define PWM_TZ_ITSource_Cycle PWM_TZEINT_CBC_Msk /*!< Циклический обработчик сигнала аварии */
|
||
#define PWM_TZ_ITSource_OneShot PWM_TZEINT_OST_Msk /*!< Однократный обработчик сигнала аварии */
|
||
#define PWM_TZ_ITSource_All (PWM_TZ_ITSource_Cycle | \
|
||
PWM_TZ_ITSource_OneShot) /*!< Все источники выбраны */
|
||
|
||
#define IS_PWM_TZ_IT_SOURCE(IT_SOURCE) (((IT_SOURCE) & ~PWM_TZ_ITSource_All) == 0)
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
/** @defgroup PWM_TZ_ITStatus_Define Флаги прерываний блока сигналов аварий ШИМ
|
||
* @{
|
||
*/
|
||
|
||
#define PWM_TZ_ITStatus_Int PWM_TZFLG_INT_Msk /*!< Флаг прерывания NVIC */
|
||
#define PWM_TZ_ITStatus_Cycle PWM_TZFLG_CBC_Msk /*!< Циклический обработчик сигнала аварии */
|
||
#define PWM_TZ_ITStatus_OneShot PWM_TZFLG_OST_Msk /*!< Однократный обработчик сигнала аварии */
|
||
#define PWM_TZ_ITStatus_All (PWM_TZ_ITStatus_Int | \
|
||
PWM_TZ_ITStatus_Cycle | \
|
||
PWM_TZ_ITStatus_OneShot) /*!< Все флаги выбраны */
|
||
|
||
#define IS_PWM_TZ_IT_STATUS(VALUE) (((VALUE) & ~PWM_TZ_ITStatus_All) == 0)
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
/** @defgroup PWM_ET_Status_Define Флаги генерации событий запуска АЦП и DMA обработчиком событий
|
||
* @{
|
||
*/
|
||
|
||
#define PWM_ET_Status_SOCA PWM_ETFLG_SOCA_Msk /*!< Флаг генерации запуска АЦП от канала А */
|
||
#define PWM_ET_Status_SOCB PWM_ETFLG_SOCB_Msk /*!< Флаг генерации запуска АЦП от канала B */
|
||
#define PWM_ET_Status_DRQA PWM_ETFLG_DRQA_Msk /*!< Флаг генерации запроса DMA от канала А */
|
||
#define PWM_ET_Status_DRQB PWM_ETFLG_DRQB_Msk /*!< Флаг генерации запроса DMA от канала B */
|
||
#define PWM_ET_Status_All (PWM_ET_Status_SOCA | \
|
||
PWM_ET_Status_SOCB | \
|
||
PWM_ET_Status_DRQA | \
|
||
PWM_ET_Status_DRQB) /*!< Все флаги выбраны */
|
||
|
||
#define IS_PWM_ET_STATUS(VALUE) (((VALUE) & ~PWM_ET_Status_All) == 0)
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
/** @defgroup PWM_HD_Source_Define Выбор источника события удержания
|
||
* @{
|
||
*/
|
||
|
||
#define PWM_HD_Source_ADCDC0 PWM_HDSEL_ADCDC0_Msk /*!< Сигнал от цифрового компаратора 0 АЦП */
|
||
#define PWM_HD_Source_ADCDC1 PWM_HDSEL_ADCDC1_Msk /*!< Сигнал от цифрового компаратора 1 АЦП */
|
||
#define PWM_HD_Source_ADCDC2 PWM_HDSEL_ADCDC2_Msk /*!< Сигнал от цифрового компаратора 2 АЦП */
|
||
#define PWM_HD_Source_ADCDC3 PWM_HDSEL_ADCDC3_Msk /*!< Сигнал от цифрового компаратора 3 АЦП */
|
||
#define PWM_HD_Source_All (PWM_HD_Source_ADCDC0 | \
|
||
PWM_HD_Source_ADCDC1 | \
|
||
PWM_HD_Source_ADCDC2 | \
|
||
PWM_HD_Source_ADCDC3) /*!< Все источники выбраны */
|
||
|
||
#define IS_PWM_HD_SOURCE(VALUE) (((VALUE) & ~PWM_HD_Source_All) == 0)
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
/** @defgroup PWM_HD_ITSource_Define Источники прерываний блока cобытий удержания
|
||
* @{
|
||
*/
|
||
|
||
#define PWM_HD_ITSource_Cycle PWM_HDEINT_CBC_Msk /*!< Циклический обработчик cобытия удержания */
|
||
#define PWM_HD_ITSource_OneShot PWM_HDEINT_OST_Msk /*!< Однократный обработчик cобытия удержания */
|
||
#define PWM_HD_ITSource_All (PWM_HD_ITSource_Cycle | \
|
||
PWM_HD_ITSource_OneShot) /*!< Все источники выбраны */
|
||
|
||
#define IS_PWM_HD_IT_SOURCE(VALUE) (((VALUE) & ~PWM_HD_ITSource_All) == 0)
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
/** @defgroup PWM_HD_ITStatus_Define Флаги прерываний блока cобытий удержания
|
||
* @{
|
||
*/
|
||
|
||
#define PWM_HD_ITStatus_Int PWM_HDFLG_INT_Msk /*!< Флаг прерывания NVIC */
|
||
#define PWM_HD_ITStatus_Cycle PWM_HDFLG_CBC_Msk /*!< Циклический обработчик cобытия удержания */
|
||
#define PWM_HD_ITStatus_OneShot PWM_HDFLG_OST_Msk /*!< Однократный обработчик cобытия удержания */
|
||
#define PWM_HD_ITStatus_All (PWM_HD_ITStatus_Int | \
|
||
PWM_HD_ITStatus_Cycle | \
|
||
PWM_HD_ITStatus_OneShot) /*!< Все флаги выбраны */
|
||
|
||
#define IS_PWM_HD_IT_STATUS(VALUE) (((VALUE) & ~PWM_HD_ITStatus_All) == 0)
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
#define IS_PWM_IT_PERIOD(VALUE) ((VALUE) < 0x4)
|
||
#define IS_PWM_FILTER(VALUE) ((VALUE) < 0x100)
|
||
#define IS_PWM_PC_DUTY(VALUE) ((VALUE) < 0x7)
|
||
#define IS_PWM_PC_FREQ_DIV(VALUE) ((VALUE) < 0x8)
|
||
#define IS_PWM_PC_FIRST_WIDTH(VALUE) ((VALUE) < 0x10)
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
/** @defgroup PWM_Exported_Types Типы
|
||
* @{
|
||
*/
|
||
|
||
/**
|
||
* @brief Выбор режима остановки таймера при отладке
|
||
*/
|
||
typedef enum {
|
||
PWM_TB_Halt_StopOnTBCLK = PWM_TBCTL_FREESOFT_StopAtTBCLK, /*!< Остановка таймера при отладке со следующего такта TBCLK */
|
||
PWM_TB_Halt_StopOnPeriod = PWM_TBCTL_FREESOFT_StopAtPeriod, /*!< Остановка таймера при отладке в конце периода */
|
||
PWM_TB_Halt_Free = PWM_TBCTL_FREESOFT_FreeRun /*!< Без остановки */
|
||
} PWM_TB_Halt_TypeDef;
|
||
#define IS_PWM_TB_HALT(VALUE) (((VALUE) == PWM_TB_Halt_StopOnTBCLK) || \
|
||
((VALUE) == PWM_TB_Halt_StopOnPeriod))
|
||
|
||
/**
|
||
* @brief Коэффициент базового деления частоты
|
||
*/
|
||
typedef enum {
|
||
PWM_TB_ClkDiv_1 = PWM_TBCTL_CLKDIV_Div1, /*!< Без деления тактовой частоты */
|
||
PWM_TB_ClkDiv_2 = PWM_TBCTL_CLKDIV_Div2, /*!< Деление тактовой частоты на 2 */
|
||
PWM_TB_ClkDiv_4 = PWM_TBCTL_CLKDIV_Div4, /*!< Деление тактовой частоты на 4 */
|
||
PWM_TB_ClkDiv_8 = PWM_TBCTL_CLKDIV_Div8, /*!< Деление тактовой частоты на 8 */
|
||
PWM_TB_ClkDiv_16 = PWM_TBCTL_CLKDIV_Div16, /*!< Деление тактовой частоты на 16 */
|
||
PWM_TB_ClkDiv_32 = PWM_TBCTL_CLKDIV_Div32, /*!< Деление тактовой частоты на 32 */
|
||
PWM_TB_ClkDiv_64 = PWM_TBCTL_CLKDIV_Div64, /*!< Деление тактовой частоты на 64 */
|
||
PWM_TB_ClkDiv_128 = PWM_TBCTL_CLKDIV_Div128 /*!< Деление тактовой частоты на 128 */
|
||
} PWM_TB_ClkDiv_TypeDef;
|
||
#define IS_PWM_TB_CLK_DIV(VALUE) (((VALUE) == PWM_TB_ClkDiv_1) || \
|
||
((VALUE) == PWM_TB_ClkDiv_2) || \
|
||
((VALUE) == PWM_TB_ClkDiv_4) || \
|
||
((VALUE) == PWM_TB_ClkDiv_8) || \
|
||
((VALUE) == PWM_TB_ClkDiv_16) || \
|
||
((VALUE) == PWM_TB_ClkDiv_32) || \
|
||
((VALUE) == PWM_TB_ClkDiv_64) || \
|
||
((VALUE) == PWM_TB_ClkDiv_128))
|
||
|
||
/**
|
||
* @brief Коэффициент дополнительного деления частоты
|
||
*/
|
||
typedef enum {
|
||
PWM_TB_ClkDivExtra_1 = PWM_TBCTL_HSPCLKDIV_Div1, /*!< Без дополнительного деления тактовой частоты */
|
||
PWM_TB_ClkDivExtra_2 = PWM_TBCTL_HSPCLKDIV_Div2, /*!< Дополнительное деление тактовой частоты на 2 */
|
||
PWM_TB_ClkDivExtra_4 = PWM_TBCTL_HSPCLKDIV_Div4, /*!< Дополнительное деление тактовой частоты на 4 */
|
||
PWM_TB_ClkDivExtra_6 = PWM_TBCTL_HSPCLKDIV_Div6, /*!< Дополнительное деление тактовой частоты на 6 */
|
||
PWM_TB_ClkDivExtra_8 = PWM_TBCTL_HSPCLKDIV_Div8, /*!< Дополнительное деление тактовой частоты на 8 */
|
||
PWM_TB_ClkDivExtra_10 = PWM_TBCTL_HSPCLKDIV_Div10, /*!< Дополнительное деление тактовой частоты на 10 */
|
||
PWM_TB_ClkDivExtra_12 = PWM_TBCTL_HSPCLKDIV_Div12, /*!< Дополнительное деление тактовой частоты на 12 */
|
||
PWM_TB_ClkDivExtra_14 = PWM_TBCTL_HSPCLKDIV_Div14, /*!< Дополнительное деление тактовой частоты на 14 */
|
||
} PWM_TB_ClkDivExtra_TypeDef;
|
||
#define IS_PWM_TB_CLK_DIV_EXTRA(VALUE) (((VALUE) == PWM_TB_ClkDivExtra_1) || \
|
||
((VALUE) == PWM_TB_ClkDivExtra_2) || \
|
||
((VALUE) == PWM_TB_ClkDivExtra_4) || \
|
||
((VALUE) == PWM_TB_ClkDivExtra_6) || \
|
||
((VALUE) == PWM_TB_ClkDivExtra_8) || \
|
||
((VALUE) == PWM_TB_ClkDivExtra_10) || \
|
||
((VALUE) == PWM_TB_ClkDivExtra_12) || \
|
||
((VALUE) == PWM_TB_ClkDivExtra_14))
|
||
|
||
/**
|
||
* @brief Направление счета
|
||
*/
|
||
typedef enum {
|
||
PWM_TB_Dir_Down, /*!< Счет вниз */
|
||
PWM_TB_Dir_Up /*!< Счет вверх */
|
||
} PWM_TB_Dir_TypeDef;
|
||
#define IS_PWM_TB_DIR(VALUE) (((VALUE) == PWM_TB_Dir_Down) || \
|
||
((VALUE) == PWM_TB_Dir_Up))
|
||
|
||
/**
|
||
* @brief Источник для выходного сигнала синхронизации SYNCO
|
||
*/
|
||
typedef enum {
|
||
PWM_TB_SyncOut_SyncIn = PWM_TBCTL_SYNCOSEL_SYNCI, /*!< Входной сигнал SYNCI */
|
||
PWM_TB_SyncOut_CTREqZero = PWM_TBCTL_SYNCOSEL_CTREqZero, /*!< Значение таймера равно нулю */
|
||
PWM_TB_SyncOut_CTREqCMPB = PWM_TBCTL_SYNCOSEL_CTREqCMPB, /*!< Значение таймера равно регистру CMPB */
|
||
PWM_TB_SyncOut_Disable = PWM_TBCTL_SYNCOSEL_Disable /*!< Выдача синхроимпульса запрещена */
|
||
} PWM_TB_SyncOut_TypeDef;
|
||
#define IS_PWM_TB_SYNC_OUT(VALUE) (((VALUE) == PWM_TB_SyncOut_SyncIn) || \
|
||
((VALUE) == PWM_TB_SyncOut_CTREqZero) || \
|
||
((VALUE) == PWM_TB_SyncOut_CTREqCMPB) || \
|
||
((VALUE) == PWM_TB_SyncOut_Disable))
|
||
|
||
/**
|
||
* @brief Направление счета
|
||
*/
|
||
typedef enum {
|
||
PWM_TB_Mode_Up = PWM_TBCTL_CTRMODE_Up, /*!< Счет вверх */
|
||
PWM_TB_Mode_Down = PWM_TBCTL_CTRMODE_Down, /*!< Счет вниз */
|
||
PWM_TB_Mode_UpDown = PWM_TBCTL_CTRMODE_UpDown, /*!< Счет вверх-вниз */
|
||
PWM_TB_Mode_Disable = PWM_TBCTL_CTRMODE_Stop /*!< Счетчик остановлен */
|
||
} PWM_TB_Mode_TypeDef;
|
||
#define IS_PWM_TB_MODE(VALUE) (((VALUE) == PWM_TB_Mode_Up) || \
|
||
((VALUE) == PWM_TB_Mode_Down) || \
|
||
((VALUE) == PWM_TB_Mode_UpDown) || \
|
||
((VALUE) == PWM_TB_Mode_Disable))
|
||
|
||
/**
|
||
* @brief Событие для загрузки значения сравнения в теневом режиме
|
||
*/
|
||
typedef enum {
|
||
PWM_CMP_LoadEvent_CTREqZero = PWM_CMPCTL_LOADAMODE_CTREqZero, /*!< Загрузка отложенного значения при условии, что значение таймера равно нулю */
|
||
PWM_CMP_LoadEvent_CTREqPeriod = PWM_CMPCTL_LOADAMODE_CTREqPRD, /*!< Загрузка отложенного значения при условии, что значение таймера равно периоду */
|
||
PWM_CMP_LoadEvent_CTREqZeroOrPeriod = PWM_CMPCTL_LOADAMODE_CTREqZeroPRD, /*!< Загрузка отложенного значения при условии, что значение таймера равно нулю или периоду */
|
||
PWM_CMP_LoadEvent_Disable = PWM_CMPCTL_LOADAMODE_Disable /*!< Загрузка отложенного значения запрещена */
|
||
} PWM_CMP_LoadEvent_TypeDef;
|
||
#define IS_PWM_CMP_LOAD_EVENT(VALUE) (((VALUE) == PWM_CMP_LoadEvent_CTREqZero) || \
|
||
((VALUE) == PWM_CMP_LoadEvent_CTREqPeriod) || \
|
||
((VALUE) == PWM_CMP_LoadEvent_CTREqZeroOrPeriod) || \
|
||
((VALUE) == PWM_CMP_LoadEvent_Disable))
|
||
|
||
/**
|
||
* @brief Выбор действия на выводе ШИМ
|
||
*/
|
||
typedef enum {
|
||
PWM_AQ_Action_None = PWM_AQCTLA_ZRO_NoAction, /*!< Нет реакции */
|
||
PWM_AQ_Action_ToZero = PWM_AQCTLA_PRD_Clear, /*!< Переключение в ноль */
|
||
PWM_AQ_Action_ToOne = PWM_AQCTLA_CAU_Set, /*!< Переключение в единицу */
|
||
PWM_AQ_Action_Inv = PWM_AQCTLA_CAD_Toggle /*!< Инверсия текущего состояния */
|
||
} PWM_AQ_Action_TypeDef;
|
||
#define IS_PWM_AQ_ACTION(VALUE) (((VALUE) == PWM_AQ_Action_None) || \
|
||
((VALUE) == PWM_AQ_Action_ToZero) || \
|
||
((VALUE) == PWM_AQ_Action_ToOne) || \
|
||
((VALUE) == PWM_AQ_Action_Inv))
|
||
|
||
/**
|
||
* @brief Возможные события для генерации внешних сигналов/запросов
|
||
*/
|
||
typedef enum {
|
||
PWM_AQ_Event_CTREqZero = PWM_AQCTLA_ZRO_Pos, /*!< Значение таймера равно нулю */
|
||
PWM_AQ_Event_CTREqPeriod = PWM_AQCTLA_PRD_Pos, /*!< Значение таймера равно периоду */
|
||
PWM_AQ_Event_CTREqCMPAUp = PWM_AQCTLA_CAU_Pos, /*!< Значение таймера равно регистру CMPA при счете вверх */
|
||
PWM_AQ_Event_CTREqCMPADown = PWM_AQCTLA_CAD_Pos, /*!< Значение таймера равно регистру CMPA при счете вниз */
|
||
PWM_AQ_Event_CTREqCMPBUp = PWM_AQCTLA_CBU_Pos, /*!< Значение таймера равно регистру CMPB при счете вверх */
|
||
PWM_AQ_Event_CTREqCMPBDown = PWM_AQCTLA_CBD_Pos /*!< Значение таймера равно регистру CMPB при счете вниз */
|
||
} PWM_AQ_Event_TypeDef;
|
||
#define IS_PWM_AQ_EVENT(VALUE) (((VALUE) == PWM_AQ_Event_CTREqZero) || \
|
||
((VALUE) == PWM_AQ_Event_CTREqPeriod) || \
|
||
((VALUE) == PWM_AQ_Event_CTREqCMPAUp) || \
|
||
((VALUE) == PWM_AQ_Event_CTREqCMPADown) || \
|
||
((VALUE) == PWM_AQ_Event_CTREqCMPBUp) || \
|
||
((VALUE) == PWM_AQ_Event_CTREqCMPBDown))
|
||
|
||
/**
|
||
* @brief Cобытия для применения настроек однократного или цилического программного воздействия на вывода
|
||
*/
|
||
typedef enum {
|
||
PWM_AQ_ForceShadowEvent_CTREqZero = PWM_AQSFRC_RLDCSF_CTREqZero, /*!< Значение таймера равно нулю */
|
||
PWM_AQ_ForceShadowEvent_CTREqPeriod = PWM_AQSFRC_RLDCSF_CTREqPRD, /*!< Значение таймера равно периоду */
|
||
PWM_AQ_ForceShadowEvent_CTREqPeriodZero = PWM_AQSFRC_RLDCSF_CTREqZeroPRD, /*!< Значение таймера равно периоду или нулю */
|
||
PWM_AQ_ForceShadowEvent_None = PWM_AQSFRC_RLDCSF_NoShadow, /*!< Прямая запись */
|
||
} PWM_AQ_ForceShadowEvent_TypeDef;
|
||
#define IS_PWM_AQ_FORCE_SHADOW_EVENT(VALUE) (((VALUE) == PWM_AQ_ForceShadowEvent_CTREqZero) || \
|
||
((VALUE) == PWM_AQ_ForceShadowEvent_CTREqPeriod) || \
|
||
((VALUE) == PWM_AQ_ForceShadowEvent_CTREqPeriodZero) || \
|
||
((VALUE) == PWM_AQ_ForceShadowEvent_None))
|
||
|
||
/**
|
||
* @brief Выбор источников для формирования задержки
|
||
*/
|
||
typedef enum {
|
||
PWM_DB_In_A = PWM_DBCTL_INMODE_APosNeg, /*!< Входной сигнал А задержан по обоим фронтам */
|
||
PWM_DB_In_AFallBRise = PWM_DBCTL_INMODE_ANeg_BPos, /*!< Входной сигнал A задержан заднему фронту, B - по переднему */
|
||
PWM_DB_In_ARiseBFall = PWM_DBCTL_INMODE_APos_BNeg, /*!< Входной сигнал A задержан переднему фронту, B - по заднему */
|
||
PWM_DB_In_B = PWM_DBCTL_INMODE_BPosNeg /*!< Входной сигнал B задержан по обоим фронтам */
|
||
} PWM_DB_In_TypeDef;
|
||
#define IS_PWM_DB_IN(VALUE) (((VALUE) == PWM_DB_In_A) || \
|
||
((VALUE) == PWM_DB_In_ARiseBFall) || \
|
||
((VALUE) == PWM_DB_In_AFallBRise) || \
|
||
((VALUE) == PWM_DB_In_B))
|
||
|
||
/**
|
||
* @brief Выбор полярности задержанных сигналов
|
||
*/
|
||
typedef enum {
|
||
PWM_DB_Polarity_ActiveHigh = PWM_DBCTL_POLSEL_InvDisable, /*!< Нет инверсии */
|
||
PWM_DB_Polarity_ActiveLowCompl = PWM_DBCTL_POLSEL_InvA, /*!< Инвертируется сигнал, задержанный по переднему фронту */
|
||
PWM_DB_Polarity_ActiveHighCompl = PWM_DBCTL_POLSEL_InvB, /*!< Инвертируется сигнал, задержанный по заднему фронту */
|
||
PWM_DB_Polarity_ActiveLow = PWM_DBCTL_POLSEL_InvAB /*!< Инвертируются оба сигнала */
|
||
} PWM_DB_Polarity_TypeDef;
|
||
#define IS_PWM_DB_POLARITY(VALUE) (((VALUE) == PWM_DB_Polarity_ActiveHigh) || \
|
||
((VALUE) == PWM_DB_Polarity_ActiveLowCompl) || \
|
||
((VALUE) == PWM_DB_Polarity_ActiveHighCompl) || \
|
||
((VALUE) == PWM_DB_Polarity_ActiveLow))
|
||
|
||
/**
|
||
* @brief Выбор выходных сигналов блока задержки
|
||
*/
|
||
typedef enum {
|
||
PWM_DB_Out_BypassAB = PWM_DBCTL_OUTMODE_NoSpec, /*!< Нет задержки. Входные сигналы A и B подключены напрямую к выходу модуля задержки. */
|
||
PWM_DB_Out_BypassA = PWM_DBCTL_OUTMODE_BNeg, /*!< Входной сигнал A подключен напрямую к выходу A модуля задержки. Задержанный по заднему фронту сигнал подключен к выходу B. */
|
||
PWM_DB_Out_BypassB = PWM_DBCTL_OUTMODE_APos, /*!< Входной сигнал B подключен напрямую к выходу B модуля задержки. Задержанный по переднему фронту сигнал подключен к выходу A. */
|
||
PWM_DB_Out_DelayAB = PWM_DBCTL_OUTMODE_Apos_BNeg /*!< Задержанный по переднему фронту сигнал подключен к выходу A, по заднему - к выходу B. */
|
||
} PWM_DB_Out_TypeDef;
|
||
#define IS_PWM_DB_OUT(VALUE) (((VALUE) == PWM_DB_Out_BypassAB) || \
|
||
((VALUE) == PWM_DB_Out_BypassA) || \
|
||
((VALUE) == PWM_DB_Out_BypassB) || \
|
||
((VALUE) == PWM_DB_Out_DelayAB))
|
||
|
||
/**
|
||
* @brief Возможные события для генерации внешних сигналов/запросов
|
||
*/
|
||
typedef enum {
|
||
PWM_ET_Event_CTREqZero = PWM_ETSEL_SOCASEL_CTREqZero, /*!< Значение таймера равно нулю */
|
||
PWM_ET_Event_CTREqPeriod = PWM_ETSEL_SOCASEL_CTREqPRD, /*!< Значение таймера равно периоду */
|
||
PWM_ET_Event_CTREqCMPA_Up = PWM_ETSEL_SOCASEL_CTREqCMPA_OnUp, /*!< Значение таймера равно регистру CMPA при счете вверх */
|
||
PWM_ET_Event_CTREqCMPA_Down = PWM_ETSEL_SOCASEL_CTREqCMPA_OnDown, /*!< Значение таймера равно регистру CMPA при счете вниз */
|
||
PWM_ET_Event_CTREqCMPB_Up = PWM_ETSEL_SOCASEL_CTREqCMPB_OnUp, /*!< Значение таймера равно регистру CMPB при счете вверх */
|
||
PWM_ET_Event_CTREqCMPB_Down = PWM_ETSEL_SOCASEL_CTREqCMPB_OnDown /*!< Значение таймера равно регистру CMPB при счете вниз */
|
||
} PWM_ET_Event_TypeDef;
|
||
#define IS_PWM_ET_EVENT(VALUE) (((VALUE) == PWM_ET_Event_CTREqZero) || \
|
||
((VALUE) == PWM_ET_Event_CTREqPeriod) || \
|
||
((VALUE) == PWM_ET_Event_CTREqCMPA_Up) || \
|
||
((VALUE) == PWM_ET_Event_CTREqCMPA_Down) || \
|
||
((VALUE) == PWM_ET_Event_CTREqCMPB_Up) || \
|
||
((VALUE) == PWM_ET_Event_CTREqCMPB_Down))
|
||
|
||
/**
|
||
* @brief Выбор поведения вывода в случае наступления сигнала аварии
|
||
*/
|
||
typedef enum {
|
||
PWM_TZ_Action_ToZ = PWM_TZCTL_TZA_Z, /*!< Переключение вывода в третье состояние */
|
||
PWM_TZ_Action_ToOne = PWM_TZCTL_TZA_Set, /*!< Переключение в единицу */
|
||
PWM_TZ_Action_ToZero = PWM_TZCTL_TZA_Clear, /*!< Переключение в ноль */
|
||
PWM_TZ_Action_None = PWM_TZCTL_TZA_NoAction /*!< Нет действий */
|
||
} PWM_TZ_Action_TypeDef;
|
||
#define IS_PWM_TZ_ACTION(VALUE) (((VALUE) == PWM_TZ_Action_ToZ) || \
|
||
((VALUE) == PWM_TZ_Action_ToOne) || \
|
||
((VALUE) == PWM_TZ_Action_ToZero) || \
|
||
((VALUE) == PWM_TZ_Action_None))
|
||
|
||
/**
|
||
* @brief Выбор поведения вывода в случае наступления события удержания.
|
||
*/
|
||
|
||
typedef enum {
|
||
PWM_HD_Action_ToOne = PWM_HDCTL_HDA_Set, /*!< Переключение в единицу*/
|
||
PWM_HD_Action_ToZero = PWM_HDCTL_HDA_Clear, /*!< Переключение в ноль */
|
||
PWM_HD_Action_None = PWM_HDCTL_HDA_NoAction /*!< Нет действий */
|
||
} PWM_HD_Action_TypeDef;
|
||
#define IS_PWM_HD_ACTION(VALUE) (((VALUE) == PWM_HD_Action_ToOne) || \
|
||
((VALUE) == PWM_HD_Action_ToZero) || \
|
||
((VALUE) == PWM_HD_Action_None))
|
||
|
||
/**
|
||
* @brief Структура инициализации таймера-счетчика блока ШИМ
|
||
*/
|
||
typedef struct
|
||
{
|
||
PWM_TB_Halt_TypeDef Halt; /*!< Выбор режима остановки таймера при отладке */
|
||
PWM_TB_ClkDiv_TypeDef ClkDiv; /*!< Коэффициент базового деления частоты */
|
||
PWM_TB_ClkDivExtra_TypeDef ClkDivExtra; /*!< Коэффициент дополнительного деления частоты.
|
||
Результирующий коэффциент = ClkDiv * ClkDivExtra */
|
||
PWM_TB_SyncOut_TypeDef SyncOut; /*!< Источник для выходного сигнала синхронизации SYNCO */
|
||
FunctionalState PhaseSync; /*!< Разрешает загрузку счетчика значением регистра фазы при получении события синхронизации */
|
||
PWM_TB_Dir_TypeDef PhaseSyncDir; /*!< Задание направления счета после синхронизации фазы */
|
||
uint32_t Phase; /*!< Значение фазы ШИМ при получении события синхронизации.
|
||
Параметр может принимать любое значение из диапазона: 0x0000-0xFFFF. */
|
||
PWM_TB_Mode_TypeDef Mode; /*!< Задание направления счета */
|
||
FunctionalState PeriodDirectLoad; /*!< Разрешает только прямую загрузку в регистр периода (теневая отключена) */
|
||
uint32_t Period; /*!< Значение периода таймера ШИМ.
|
||
Параметр может принимать любое значение из диапазона: 0x0000-0xFFFF. */
|
||
} PWM_TB_Init_TypeDef;
|
||
#define IS_PWM_TB_PHASE_VAL(VALUE) ((VALUE) < 0x10000)
|
||
#define IS_PWM_TB_PERIOD_VAL(VALUE) ((VALUE) < 0x10000)
|
||
#define IS_PWM_TB_COUNTER_VAL(VALUE) ((VALUE) < 0x10000)
|
||
|
||
typedef struct
|
||
{
|
||
PWM_AQ_Action_TypeDef ActionA_CTREqZero; /*!< Действие в канале А, при наступлении события равенства счетчика таймера нулю */
|
||
PWM_AQ_Action_TypeDef ActionA_CTREqPeriod; /*!< Действие в канале А, при наступлении события равенства счетчика значению периода */
|
||
PWM_AQ_Action_TypeDef ActionA_CTREqCMPAUp; /*!< Действие в канале А, при наступлении события равенства счетчика таймера значению сравнения A при счете вверх */
|
||
PWM_AQ_Action_TypeDef ActionA_CTREqCMPADown; /*!< Действие в канале A, при наступлении события равенства счетчика таймера значению сравнения A при счете вниз */
|
||
PWM_AQ_Action_TypeDef ActionA_CTREqCMPBUp; /*!< Действие в канале А, при наступлении события равенства счетчика таймера значению сравнения B при счете вверх */
|
||
PWM_AQ_Action_TypeDef ActionA_CTREqCMPBDown; /*!< Действие в канале A, при наступлении события равенства счетчика таймера значению сравнения B при счете вниз */
|
||
PWM_AQ_Action_TypeDef ActionB_CTREqZero; /*!< Действие в канале B, при наступлении события равенства счетчика таймера нулю */
|
||
PWM_AQ_Action_TypeDef ActionB_CTREqPeriod; /*!< Действие в канале B, при наступлении события равенства счетчика значению периода */
|
||
PWM_AQ_Action_TypeDef ActionB_CTREqCMPAUp; /*!< Действие в канале B, при наступлении события равенства счетчика таймера значению сравнения A при счете вверх */
|
||
PWM_AQ_Action_TypeDef ActionB_CTREqCMPADown; /*!< Действие в канале B, при наступлении события равенства счетчика таймера значению сравнения A при счете вниз */
|
||
PWM_AQ_Action_TypeDef ActionB_CTREqCMPBUp; /*!< Действие в канале B, при наступлении события равенства счетчика таймера значению сравнения B при счете вверх */
|
||
PWM_AQ_Action_TypeDef ActionB_CTREqCMPBDown; /*!< Действие в канале B, при наступлении события равенства счетчика таймера значению сравнения B при счете вниз */
|
||
} PWM_AQ_Init_TypeDef;
|
||
|
||
/**
|
||
* @brief Структура инициализации компараторов блока ШИМ
|
||
*/
|
||
typedef struct
|
||
{
|
||
FunctionalState CmpADirectLoad; /*!< Разрешает только прямую загрузку в регистр CMPA (теневая отключена) */
|
||
PWM_CMP_LoadEvent_TypeDef LoadEventCmpA; /*!< Событие для теневой загрузки в регистр сравнения CMPA */
|
||
uint32_t CmpA; /*!< Значение порога срабатывания канала А, которое сравнивается со значением счетчика таймера.
|
||
Параметр может принимать любое значение из диапазона: 0x0000-0xFFFF. */
|
||
FunctionalState CmpBDirectLoad; /*!< Разрешает только прямую загрузку в регистр CMPB (теневая отключена) */
|
||
PWM_CMP_LoadEvent_TypeDef LoadEventCmpB; /*!< Событие для теневой загрузки в регистр сравнения CMPB */
|
||
uint32_t CmpB; /*!< Значение порога срабатывания канала B, которое сравнивается со значением счетчика таймера.
|
||
Параметр может принимать любое значение из диапазона: 0x0000-0xFFFF. */
|
||
} PWM_CMP_Init_TypeDef;
|
||
#define IS_PWM_CMP_VAL(VALUE) ((VALUE) < 0x10000)
|
||
|
||
/**
|
||
* @brief Структура инициализации порогового выключателя блока ШИМ
|
||
*/
|
||
typedef struct
|
||
{
|
||
PWM_HD_Action_TypeDef ActionA; /*!< Настройка поведения канала A при поступлении события удержания */
|
||
PWM_HD_Action_TypeDef ActionB; /*!< Настройка поведения канала B при поступлении события удержания */
|
||
uint32_t Source; /*!< Выбор источников для генерации события удержания.
|
||
Параметр принимает любую совокупность значений из @ref PWM_HD_Source_Define */
|
||
FunctionalState Cycle; /*!< Включение циклической обработки сигнала удержания */
|
||
FunctionalState OneShot; /*!< Включение однократной обработки сигнала удержания */
|
||
} PWM_HD_Init_TypeDef;
|
||
|
||
/**
|
||
* @brief Структура инициализации задержки сигналов ШИМ ("мертвое время").
|
||
*/
|
||
typedef struct
|
||
{
|
||
PWM_DB_In_TypeDef In; /*!< Выбор источников для формирования задержки */
|
||
PWM_DB_Polarity_TypeDef Polarity; /*!< Выбор полярности задержанных сигналов */
|
||
PWM_DB_Out_TypeDef Out; /*!< Выбор выходных сигналов блока задержки */
|
||
uint32_t RiseDelay; /*!< Величина задержки переднего фронта.
|
||
Параметр может принимать любое значение из диапазона: 0x000-0x3FF. */
|
||
uint32_t FallDelay; /*!< Величина задержки заднего фронта.
|
||
Параметр может принимать любое значение из диапазона: 0x000-0x3FF. */
|
||
} PWM_DB_Init_TypeDef;
|
||
#define IS_PWM_DB_DELAY_VAL(VALUE) ((VALUE) < 0x400)
|
||
|
||
/**
|
||
* @brief Структура инициализации обработчика сигнала аварии блока ШИМ
|
||
*/
|
||
typedef struct
|
||
{
|
||
PWM_TZ_Action_TypeDef ActionA; /*!< Настройка поведения канала A при поступлении сигнала аварии */
|
||
PWM_TZ_Action_TypeDef ActionB; /*!< Настройка поведения канала B при поступлении сигнала аварии */
|
||
FunctionalState Cycle; /*!< Включение циклической обработки сигнала аварии */
|
||
FunctionalState OneShot; /*!< Включение однократной обработки сигнала аварии */
|
||
} PWM_TZ_Init_TypeDef;
|
||
|
||
/**
|
||
* @brief Структура инициализации блока "триггера событий" для генерации внешних сигналов/запросов
|
||
*/
|
||
typedef struct
|
||
{
|
||
FunctionalState SOCA; /*!< Канал А: разрешает формирование строба запуска АЦП */
|
||
PWM_ET_Event_TypeDef EventSOCA; /*!< Канал А: выбор события для формирования строба запуска АЦП */
|
||
uint32_t PeriodSOCA; /*!< Канал А: выбор количества событий для возникновения строба АЦП.
|
||
Параметр принимает любое значение из диапазона 0-3,
|
||
где 0 - соответсвует каждому событию, 1 - каждому второму и т.д. */
|
||
FunctionalState SOCB; /*!< Канал B: разрешает формирование строба запуска АЦП */
|
||
PWM_ET_Event_TypeDef EventSOCB; /*!< Канал B: выбор события для формирования строба запуска АЦП */
|
||
uint32_t PeriodSOCB; /*!< Канал B: выбор количества событий для возникновения строба запуска АЦП.
|
||
Параметр принимает любое значение из диапазона 0-3,
|
||
где 0 - соответсвует каждому событию, 1 - каждому второму и т.д. */
|
||
FunctionalState DRQA; /*!< Канал А: разрешает формирование запроса DMA */
|
||
PWM_ET_Event_TypeDef EventDRQA; /*!< Канал А: выбор события для формирования запроса DMA */
|
||
uint32_t PeriodDRQA; /*!< Канал А: выбор количества событий для возникновения запроса DMA.
|
||
Параметр принимает любое значение из диапазона 0-3,
|
||
где 0 - соответсвует каждому событию, 1 - каждому второму и т.д. */
|
||
FunctionalState DRQB; /*!< Канал B: разрешает формирование запроса DMA */
|
||
PWM_ET_Event_TypeDef EventDRQB; /*!< Канал B: выбор события для формирования запроса DMA */
|
||
uint32_t PeriodDRQB; /*!< Канал B: выбор количества событий для возникновения запроса DMA.
|
||
Параметр принимает любое значение из диапазона 0-3,
|
||
где 0 - соответсвует каждому событию, 1 - каждому второму и т.д. */
|
||
} PWM_ET_Init_TypeDef;
|
||
#define IS_PWM_ET_PERIOD(VALUE) ((VALUE) < 0x4)
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
/** @defgroup PWM_Exported_Functions Функции
|
||
* @{
|
||
*/
|
||
|
||
void PWM_DeInit(PWM_TypeDef* PWMx);
|
||
|
||
/**
|
||
* @brief Установка ширины фильтрации коротких импульсов
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param FilterVal Значение.
|
||
* Параметр принимает любое значение из диапазона 0x00-0xFF,
|
||
* где 0 - фильтр выключен, а 0xFF - 25.6 мкс (шаг установки 0.1 мкс).
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_FilterConfig(PWM_TypeDef* PWMx, uint32_t FilterVal)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_FILTER(FilterVal));
|
||
|
||
WRITE_REG(PWMx->FWDTH, FilterVal);
|
||
}
|
||
|
||
/**
|
||
* @brief Разрешение всех теневых загрузок регистров PWM
|
||
* @param PWMx Выбор блока PWM, где x лежит в диапазоне 0-2.
|
||
* @param State Выбор состояния
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_TB_GlobalShadowLoadCmd(PWM_TypeDef* PWMx, FunctionalState State)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_FUNCTIONAL_STATE(State));
|
||
|
||
WRITE_REG(PWMx->TBCTL_bit.SHDWGLOB, State);
|
||
}
|
||
|
||
/** @defgroup PWM_Exported_Functions_TimeBase Счетчик
|
||
* @{
|
||
*/
|
||
|
||
void PWM_TB_Init(PWM_TypeDef* PWMx, PWM_TB_Init_TypeDef* InitStruct);
|
||
void PWM_TB_StructInit(PWM_TB_Init_TypeDef* InitStruct);
|
||
|
||
/**
|
||
* @brief Управление предделителями тактирования таймеров блоков PWM
|
||
* @param Presc Выбор предделителей блоков.
|
||
* Параметр принимает любою совокупность значений из @ref PWM_Presc_Define.
|
||
* @param State Выбор состояния
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_TB_PrescCmd(uint32_t Presc, FunctionalState State)
|
||
{
|
||
assert_param(IS_PWM_TB_PRESC(Presc));
|
||
assert_param(IS_FUNCTIONAL_STATE(State));
|
||
|
||
MODIFY_REG(SIU->PWMSYNC, Presc, State ? Presc : 0);
|
||
}
|
||
|
||
/**
|
||
* @brief Настройка коэффициента деления частоты для получения счетного тактового сигнала TBCLK.
|
||
* Результирующий коэффциент = ClkDiv * ClkDivExtra
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param ClkDiv Выбор делителя
|
||
* @param ClkDivExtra Выбор делителя
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_TB_ClkDivConfig(PWM_TypeDef* PWMx, PWM_TB_ClkDiv_TypeDef ClkDiv, PWM_TB_ClkDivExtra_TypeDef ClkDivExtra)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_TB_CLK_DIV(ClkDiv));
|
||
assert_param(IS_PWM_TB_CLK_DIV_EXTRA(ClkDivExtra));
|
||
|
||
MODIFY_REG(PWMx->TBCTL, PWM_TBCTL_CLKDIV_Msk | PWM_TBCTL_HSPCLKDIV_Msk,
|
||
((ClkDiv << PWM_TBCTL_CLKDIV_Pos) |
|
||
(ClkDivExtra << PWM_TBCTL_HSPCLKDIV_Pos)));
|
||
}
|
||
|
||
/**
|
||
* @brief Чтение статуса флага состояния таймера PWM
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param Status Выбор флагов.
|
||
* Параметр принимает любою совокупность значений из @ref PWM_TB_Status_Define.
|
||
* @retval Status Статус прерывания. Если выбрано несколько флагов,
|
||
* то результат соответсвует логическому ИЛИ их состояний.
|
||
*/
|
||
__STATIC_INLINE FlagStatus PWM_TB_Status(PWM_TypeDef* PWMx, uint32_t Status)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_TB_STATUS(Status));
|
||
|
||
return (FlagStatus)READ_BIT(PWMx->TBSTS, Status);
|
||
}
|
||
|
||
/**
|
||
* @brief Сброс флагов статусов таймера PWM
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param Status Выбор флагов.
|
||
* Параметр принимает любою совокупность значений из @ref PWM_TB_Status_Define.
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_TB_StatusClear(PWM_TypeDef* PWMx, uint32_t Status)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_TB_STATUS(Status));
|
||
|
||
WRITE_REG(PWMx->TBSTS, Status);
|
||
}
|
||
|
||
/**
|
||
* @brief Установка значения счетчика PWM
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param CounterVal Значение счетчика
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_TB_SetCounter(PWM_TypeDef* PWMx, uint32_t CounterVal)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_TB_COUNTER_VAL(CounterVal));
|
||
|
||
WRITE_REG(PWMx->TBCTR, CounterVal);
|
||
}
|
||
|
||
/**
|
||
* @brief Установка значения периода PWM
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param PeriodVal Значение периода
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_TB_SetPeriod(PWM_TypeDef* PWMx, uint32_t PeriodVal)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_TB_PERIOD_VAL(PeriodVal));
|
||
|
||
WRITE_REG(PWMx->TBPRD, PeriodVal);
|
||
}
|
||
|
||
/**
|
||
* @brief Установка значения фазы PWM
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param PhaseVal Значение фазы
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_TB_SetPhase(PWM_TypeDef* PWMx, uint32_t PhaseVal)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_TB_PHASE_VAL(PhaseVal));
|
||
|
||
WRITE_REG(PWMx->TBPHS, PhaseVal);
|
||
}
|
||
|
||
/**
|
||
* @brief Получение текущего значения счетчика PWM
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @retval Val Значение счетчика
|
||
*/
|
||
__STATIC_INLINE uint32_t PWM_TB_GetCounter(PWM_TypeDef* PWMx)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
|
||
return READ_REG(PWMx->TBCTR);
|
||
}
|
||
|
||
/**
|
||
* @brief Получение текущего значения периода PWM
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @retval Val Значение периода
|
||
*/
|
||
__STATIC_INLINE uint32_t PWM_TB_GetPeriod(PWM_TypeDef* PWMx)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
|
||
return READ_REG(PWMx->TBPRD);
|
||
}
|
||
|
||
/**
|
||
* @brief Получение текущего значения фазы PWM
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @retval Val Значение фазы
|
||
*/
|
||
__STATIC_INLINE uint32_t PWM_TB_GetPhase(PWM_TypeDef* PWMx)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
|
||
return READ_REG(PWMx->TBPHS);
|
||
}
|
||
|
||
/**
|
||
* @brief Программный запуск входного синхроимпульса SYNCI
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_TB_SwSyncInCmd(PWM_TypeDef* PWMx)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
|
||
WRITE_REG(PWMx->TBCTL_bit.SWFSYNC, 1);
|
||
}
|
||
|
||
/**
|
||
* @brief Настройка режима остановки таймера PWM при отладке
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param Halt Выбор режима
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_TB_HaltConfig(PWM_TypeDef* PWMx, PWM_TB_Halt_TypeDef Halt)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_TB_HALT(Halt));
|
||
|
||
WRITE_REG(PWMx->TBCTL_bit.FREESOFT, Halt);
|
||
}
|
||
|
||
/**
|
||
* @brief Настройка источника выходного сигнала синхронизации SYNCO
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param SyncOut Выбор режима
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_TB_SyncOutConfig(PWM_TypeDef* PWMx, PWM_TB_SyncOut_TypeDef SyncOut)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_TB_SYNC_OUT(SyncOut));
|
||
|
||
WRITE_REG(PWMx->TBCTL_bit.SYNCOSEL, SyncOut);
|
||
}
|
||
|
||
/**
|
||
* @brief Разрешает загрузку счетчика значением регистра фазы при получении события синхронизации
|
||
* @param State Выбор состояния
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_TB_PhaseSyncCmd(PWM_TypeDef* PWMx, FunctionalState State)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_FUNCTIONAL_STATE(State));
|
||
|
||
WRITE_REG(PWMx->TBCTL_bit.PHSEN, State);
|
||
}
|
||
|
||
/**
|
||
* @brief Задание направления счета после синхронизации фазы
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param PhaseSyncDir Выбор режима
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_TB_PhaseSyncDirConfig(PWM_TypeDef* PWMx, PWM_TB_Dir_TypeDef PhaseSyncDir)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_TB_DIR(PhaseSyncDir));
|
||
|
||
WRITE_REG(PWMx->TBCTL_bit.PHSDIR, PhaseSyncDir);
|
||
}
|
||
|
||
/**
|
||
* @brief Задание направления счета PWM
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param Mode Выбор режима
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_TB_ModeConfig(PWM_TypeDef* PWMx, PWM_TB_Mode_TypeDef Mode)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_TB_MODE(Mode));
|
||
|
||
WRITE_REG(PWMx->TBCTL_bit.CTRMODE, Mode);
|
||
}
|
||
|
||
/**
|
||
* @brief Разрешает прямую загрузку в регистр периода (теневая отключена)
|
||
* @param State Выбор состояния
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_TB_PeriodDirectLoadCmd(PWM_TypeDef* PWMx, FunctionalState State)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_FUNCTIONAL_STATE(State));
|
||
|
||
WRITE_REG(PWMx->TBCTL_bit.PRDLD, State);
|
||
}
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
/** @defgroup PWM_Exported_Functions_ActionQualifier Управление поведением выводов
|
||
* @{
|
||
*/
|
||
|
||
void PWM_AQ_Init(PWM_TypeDef* PWMx, PWM_AQ_Init_TypeDef* InitStruct);
|
||
void PWM_AQ_StructInit(PWM_AQ_Init_TypeDef* InitStruct);
|
||
|
||
/**
|
||
* @brief Задание действия на выходе PWM A по выбранному событию
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param Event Выбор события
|
||
* @param Action Выбор действия
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_AQ_ActionAConfig(PWM_TypeDef* PWMx, PWM_AQ_Event_TypeDef Event, PWM_AQ_Action_TypeDef Action)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_AQ_EVENT(Event));
|
||
assert_param(IS_PWM_AQ_ACTION(Action));
|
||
|
||
MODIFY_REG(PWMx->AQCTLA, 3 << (uint32_t)Event, Action << (uint32_t)Event);
|
||
}
|
||
|
||
/**
|
||
* @brief Программное задание продолжительного воздействия на канал PWM A
|
||
* @param PWMx Выбор ШИМ, где x лежит в диапазоне 0-2
|
||
* @param Action Выбор действия
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_AQ_ForceContACmd(PWM_TypeDef* PWMx, PWM_AQ_Action_TypeDef Action)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_AQ_ACTION(Action));
|
||
|
||
WRITE_REG(PWMx->AQCSFRC_bit.CSFA, Action);
|
||
}
|
||
|
||
/**
|
||
* @brief Настройка типа однократного программного воздействия на канал PWM A
|
||
* @param PWMx Выбор ШИМ, где x лежит в диапазоне 0-2
|
||
* @param Action Выбор действия
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_AQ_ForceAConfig(PWM_TypeDef* PWMx, PWM_AQ_Action_TypeDef Action)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_AQ_ACTION(Action));
|
||
|
||
WRITE_REG(PWMx->AQSFRC_bit.ACTSFA, Action);
|
||
}
|
||
|
||
/**
|
||
* @brief Применение выбранного однократного программного воздействия на канал PWM A
|
||
* @param PWMx Выбор ШИМ, где x лежит в диапазоне 0-2
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_AQ_ForceACmd(PWM_TypeDef* PWMx)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
|
||
WRITE_REG(PWMx->AQSFRC_bit.OTSFA, 1);
|
||
}
|
||
|
||
/**
|
||
* @brief Задание действия на выходе PWM B по выбранному событию
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param Event Выбор события
|
||
* @param Action Выбор действия
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_AQ_ActionBConfig(PWM_TypeDef* PWMx, PWM_AQ_Event_TypeDef Event, PWM_AQ_Action_TypeDef Action)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_AQ_EVENT(Event));
|
||
assert_param(IS_PWM_AQ_ACTION(Action));
|
||
|
||
MODIFY_REG(PWMx->AQCTLB, 3 << (uint32_t)Event, Action << (uint32_t)Event);
|
||
}
|
||
|
||
/**
|
||
* @brief Программное задание продолжительного воздействия на канал PWM B
|
||
* @param PWMx Выбор ШИМ, где x лежит в диапазоне 0-2
|
||
* @param Action Выбор действия
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_AQ_ForceContBCmd(PWM_TypeDef* PWMx, PWM_AQ_Action_TypeDef Action)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_AQ_ACTION(Action));
|
||
|
||
WRITE_REG(PWMx->AQCSFRC_bit.CSFB, Action);
|
||
}
|
||
|
||
/**
|
||
* @brief Настройка типа однократного программного воздействия на канал PWM B
|
||
* @param PWMx Выбор ШИМ, где x лежит в диапазоне 0-2
|
||
* @param Action Выбор действия
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_AQ_ForceBConfig(PWM_TypeDef* PWMx, PWM_AQ_Action_TypeDef Action)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_AQ_ACTION(Action));
|
||
|
||
WRITE_REG(PWMx->AQSFRC_bit.ACTSFB, Action);
|
||
}
|
||
|
||
/**
|
||
* @brief Применение выбранного однократного программного воздействия на канал PWM B
|
||
* @param PWMx Выбор ШИМ, где x лежит в диапазоне 0-2
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_AQ_ForceBCmd(PWM_TypeDef* PWMx)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
|
||
WRITE_REG(PWMx->AQSFRC_bit.OTSFB, 1);
|
||
}
|
||
|
||
/**
|
||
* @brief Задание события для применения настроек однократного или цилического программного воздействия на вывода
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param Event Выбор события
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_AQ_ForceShadowConfig(PWM_TypeDef* PWMx, PWM_AQ_ForceShadowEvent_TypeDef ForceShadowEvent)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_AQ_FORCE_SHADOW_EVENT(ForceShadowEvent));
|
||
|
||
WRITE_REG(PWMx->AQSFRC_bit.RLDCSF, (uint32_t)ForceShadowEvent);
|
||
}
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
/** @defgroup PWM_Exported_Functions_Compare Компараторы
|
||
* @{
|
||
*/
|
||
|
||
void PWM_CMP_Init(PWM_TypeDef* PWMx, PWM_CMP_Init_TypeDef* InitStruct);
|
||
void PWM_CMP_StructInit(PWM_CMP_Init_TypeDef* InitStruct);
|
||
|
||
/**
|
||
* @brief Настройка cобытия для теневой загрузки в регистр сравнения CMPA
|
||
* @param PWMx Выбор ШИМ, где x лежит в диапазоне 0-2
|
||
* @param LoadEvent Выбор события
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_CMP_CmpALoadEventConfig(PWM_TypeDef* PWMx, PWM_CMP_LoadEvent_TypeDef LoadEvent)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_CMP_LOAD_EVENT(LoadEvent));
|
||
|
||
WRITE_REG(PWMx->CMPCTL_bit.LOADAMODE, LoadEvent);
|
||
}
|
||
|
||
/**
|
||
* @brief Разрешает прямую загрузку в регистр CMPA (теневая отключена)
|
||
* @param State Выбор состояния
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_CMP_CmpADirectLoadCmd(PWM_TypeDef* PWMx, FunctionalState State)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_FUNCTIONAL_STATE(State));
|
||
|
||
WRITE_REG(PWMx->CMPCTL_bit.SHDWAMODE, State);
|
||
}
|
||
|
||
/**
|
||
* @brief Установка значения сравнения A PWM
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param CMPAVal Значение сравнения
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_CMP_SetCmpA(PWM_TypeDef* PWMx, uint32_t CMPAVal)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_CMP_VAL(CMPAVal));
|
||
|
||
WRITE_REG(PWMx->CMPA_bit.CMPA, CMPAVal);
|
||
}
|
||
|
||
/**
|
||
* @brief Получение текущего значения сравнения A PWM
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @retval Val Значение сравнения
|
||
*/
|
||
__STATIC_INLINE uint32_t PWM_CMP_GetCmpA(PWM_TypeDef* PWMx)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
|
||
return READ_REG(PWMx->CMPA_bit.CMPA);
|
||
}
|
||
|
||
/**
|
||
* @brief Настройка cобытия для теневой загрузки в регистр сравнения CMPB
|
||
* @param PWMx Выбор ШИМ, где x лежит в диапазоне 0-2
|
||
* @param LoadEvent Выбор события
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_CMP_CmpBLoadEventConfig(PWM_TypeDef* PWMx, PWM_CMP_LoadEvent_TypeDef LoadEvent)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_CMP_LOAD_EVENT(LoadEvent));
|
||
|
||
WRITE_REG(PWMx->CMPCTL_bit.LOADBMODE, LoadEvent);
|
||
}
|
||
|
||
/**
|
||
* @brief Разрешает прямую загрузку в регистр CMPB (теневая отключена)
|
||
* @param State Выбор состояния
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_CMP_CmpBDirectLoadCmd(PWM_TypeDef* PWMx, FunctionalState State)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_FUNCTIONAL_STATE(State));
|
||
|
||
WRITE_REG(PWMx->CMPCTL_bit.SHDWBMODE, State);
|
||
}
|
||
|
||
/**
|
||
* @brief Установка значения сравнения B PWM
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param CMPBVal Значение сравнения
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_CMP_SetCmpB(PWM_TypeDef* PWMx, uint32_t CMPBVal)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_CMP_VAL(CMPBVal));
|
||
|
||
WRITE_REG(PWMx->CMPB_bit.CMPB, CMPBVal);
|
||
}
|
||
|
||
/**
|
||
* @brief Получение текущего значения сравнения B PWM
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @retval Val Значение сравнения
|
||
*/
|
||
__STATIC_INLINE uint32_t PWM_CMP_GetCmpB(PWM_TypeDef* PWMx)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
|
||
return READ_REG(PWMx->CMPB_bit.CMPB);
|
||
}
|
||
|
||
/**
|
||
* @brief Чтение статуса флага состояния компараторов PWM.
|
||
* Флаги установлены, если произошла запись в активный регистр значения сравнения из теневого.
|
||
* Сбрасываются флаги автоматически при каждой записи в теневой регистр.
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param Status Выбор флагов.
|
||
* Параметр принимает любою совокупность значений из @ref PWM_CMP_Status_Define.
|
||
* @retval Status Статус флагов. Если выбрано несколько флагов,
|
||
* то результат соответсвует логическому ИЛИ их состояний.
|
||
*/
|
||
__STATIC_INLINE FlagStatus PWM_CMP_Status(PWM_TypeDef* PWMx, uint32_t Status)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_CMP_STATUS(Status));
|
||
|
||
return (FlagStatus)READ_BIT(PWMx->CMPCTL, Status);
|
||
}
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
/** @defgroup PWM_Exported_Functions_HoldDetector Блок порогового выключателя
|
||
* @{
|
||
*/
|
||
|
||
void PWM_HD_Init(PWM_TypeDef* PWMx, PWM_HD_Init_TypeDef* InitStruct);
|
||
void PWM_HD_StructInit(PWM_HD_Init_TypeDef* InitStruct);
|
||
|
||
/**
|
||
* @brief Настройка поведения канала A при поступлении события удержания
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param Action Выбор действия
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_HD_ActionAConfig(PWM_TypeDef* PWMx, PWM_HD_Action_TypeDef Action)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_HD_ACTION(Action));
|
||
|
||
WRITE_REG(PWMx->HDCTL_bit.HDA, Action);
|
||
}
|
||
|
||
/**
|
||
* @brief Настройка поведения канала B при поступлении события удержания
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param Action Выбор действия
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_HD_ActionBConfig(PWM_TypeDef* PWMx, PWM_HD_Action_TypeDef Action)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_HD_ACTION(Action));
|
||
|
||
WRITE_REG(PWMx->HDCTL_bit.HDB, Action);
|
||
}
|
||
|
||
/**
|
||
* @brief Выбор источников для генерации события удержания
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param Source Выбор источника
|
||
* Параметр принимает любую совокупность значений из @ref PWM_HD_Source_Define
|
||
* @param State Выбор состояния
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_HD_SourceCmd(PWM_TypeDef* PWMx, uint32_t Source, FunctionalState State)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_HD_SOURCE(Source));
|
||
|
||
MODIFY_REG(PWMx->HDSEL, Source, State ? Source : 0);
|
||
}
|
||
|
||
/**
|
||
* @brief Включение циклической обработки сигнала удержания
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param State Выбор состояния
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_HD_CycleCmd(PWM_TypeDef* PWMx, FunctionalState State)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_FUNCTIONAL_STATE(State));
|
||
|
||
WRITE_REG(PWMx->HDSEL_bit.CBC, State);
|
||
}
|
||
|
||
/**
|
||
* @brief Включение однократной обработки сигнала удержания
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param State Выбор состояния
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_HD_OneShotCmd(PWM_TypeDef* PWMx, FunctionalState State)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_FUNCTIONAL_STATE(State));
|
||
|
||
WRITE_REG(PWMx->HDSEL_bit.OST, State);
|
||
}
|
||
|
||
/**
|
||
* @brief Включение прерывания по событию удержания
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param ITSource Выбор источника прерывания
|
||
* Параметр принимает любую совокупность значений из @ref PWM_HD_ITSource_Define.
|
||
* @param State Выбор состояния
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_HD_ITCmd(PWM_TypeDef* PWMx, uint32_t ITSource, FunctionalState State)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_HD_IT_SOURCE(ITSource));
|
||
|
||
MODIFY_REG(PWMx->HDEINT, ITSource, State ? ITSource : 0);
|
||
}
|
||
|
||
/**
|
||
* @brief Программный вызов прерывания от обработчика событий удержания выбранного блока ШИМ
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param ITSource Выбор источника прерывания
|
||
* Параметр принимает любую совокупность значений из @ref PWM_HD_ITSource_Define
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_HD_ITForceCmd(PWM_TypeDef* PWMx, uint32_t ITSource)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_HD_IT_SOURCE(ITSource));
|
||
|
||
WRITE_REG(PWMx->HDFRC, ITSource);
|
||
}
|
||
|
||
/**
|
||
* @brief Чтение статуса флага прерывания от обработчика событий удержания выбранного блока ШИМ
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param ITStatus Выбор флагов.
|
||
* Параметр принимает любую совокупность значений из @ref PWM_HD_ITSource_Define.
|
||
* @retval Status Статус прерывания. Если выбрано несколько флагов,
|
||
* то результат соответсвует логическому ИЛИ их состояний.
|
||
*/
|
||
__STATIC_INLINE FlagStatus PWM_HD_ITStatus(PWM_TypeDef* PWMx, uint32_t ITStatus)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_HD_IT_STATUS(ITStatus));
|
||
|
||
return (FlagStatus)READ_BIT(PWMx->HDFLG, ITStatus);
|
||
}
|
||
|
||
/**
|
||
* @brief Сброс флага прерывания от обработчика событий удержания выбранного блока ШИМ
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param ITStatus Выбор флагов.
|
||
* Параметр принимает любую совокупность значений из @ref PWM_HD_ITSource_Define.
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_HD_ITStatusClear(PWM_TypeDef* PWMx, uint32_t ITStatus)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_HD_IT_STATUS(ITStatus));
|
||
|
||
WRITE_REG(PWMx->HDCLR, ITStatus);
|
||
}
|
||
|
||
/**
|
||
* @brief Чтение статуса активного запроса прерывания от обработчика событий удержания выбранного блока ШИМ
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @retval Status Статус запроса прерывания
|
||
*/
|
||
__STATIC_INLINE FlagStatus PWM_HD_ITPendStatus(PWM_TypeDef* PWMx)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
|
||
return (FlagStatus)READ_BIT(PWMx->HDINTCLR, PWM_HDINTCLR_INT_Msk);
|
||
}
|
||
|
||
/**
|
||
* @brief Сброс активного запроса прерывания от обработчика событий удержания выбранного блока ШИМ
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @retval Нет
|
||
*/
|
||
__STATIC_INLINE void PWM_HD_ITPendStatusClear(PWM_TypeDef* PWMx)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
|
||
WRITE_REG(PWMx->HDINTCLR_bit.INT, 1);
|
||
}
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
/** @defgroup PWM_Exported_Functions_DeadBand Блок "мертвого времени"
|
||
* @{
|
||
*/
|
||
|
||
void PWM_DB_Init(PWM_TypeDef* PWMx, PWM_DB_Init_TypeDef* InitStruct);
|
||
void PWM_DB_StructInit(PWM_DB_Init_TypeDef* InitStruct);
|
||
|
||
/**
|
||
* @brief Выбор источников для формирования задержки
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param In Выбор источника
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_DB_InConfig(PWM_TypeDef* PWMx, PWM_DB_In_TypeDef In)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_DB_IN(In));
|
||
|
||
WRITE_REG(PWMx->DBCTL_bit.INMODE, In);
|
||
}
|
||
|
||
/**
|
||
* @brief Выбор выходных сигналов блока задержки
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param Out Выбор сигнала
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_DB_OutConfig(PWM_TypeDef* PWMx, PWM_DB_Out_TypeDef Out)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_DB_OUT(Out));
|
||
|
||
WRITE_REG(PWMx->DBCTL_bit.OUTMODE, Out);
|
||
}
|
||
|
||
/**
|
||
* @brief Выбор полярности задержанных сигналов
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param Polarity Выбор полярности
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_DB_PolarityConfig(PWM_TypeDef* PWMx, PWM_DB_Polarity_TypeDef Polarity)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_DB_POLARITY(Polarity));
|
||
|
||
WRITE_REG(PWMx->DBCTL_bit.POLSEL, Polarity);
|
||
}
|
||
|
||
/**
|
||
* @brief Установка значения величины задержки по переднему фронту
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param RiseDelayVal Значение
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_DB_SetRiseDelay(PWM_TypeDef* PWMx, uint32_t RiseDelayVal)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_DB_DELAY_VAL(RiseDelayVal));
|
||
|
||
WRITE_REG(PWMx->DBRED, RiseDelayVal);
|
||
}
|
||
|
||
/**
|
||
* @brief Установка значения величины задержки по заднему фронту
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param FallDelayVal Значение
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_DB_SetFallDelay(PWM_TypeDef* PWMx, uint32_t FallDelayVal)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_DB_DELAY_VAL(FallDelayVal));
|
||
|
||
WRITE_REG(PWMx->DBFED, FallDelayVal);
|
||
}
|
||
|
||
/**
|
||
* @brief Получение текущего значения величины задержки по переднему фронту
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @retval Val Значение
|
||
*/
|
||
__STATIC_INLINE uint32_t PWM_DB_GetRiseDelay(PWM_TypeDef* PWMx)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
|
||
return READ_REG(PWMx->DBRED);
|
||
}
|
||
|
||
/**
|
||
* @brief Получение текущего значения величины задержки по заднему фронту
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @retval Val Значение
|
||
*/
|
||
__STATIC_INLINE uint32_t PWM_DB_GetFallDelay(PWM_TypeDef* PWMx)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
|
||
return READ_REG(PWMx->DBFED);
|
||
}
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
/** @defgroup PWM_Exported_Functions_PWM_Chopper Блок модуляции
|
||
* @{
|
||
*/
|
||
|
||
/**
|
||
* @brief Настройка модулятора сигналов ШИМ
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param DutyVal Значение скважности второго и последующего импульсов.
|
||
* Параметр принимает любое значение из диапазона 0x0-0x6,
|
||
* где 0x0 - скважность 1/8, а 0x6 - 7/8.
|
||
* @param FreqDivVal Значение делителя частоты второго и последующего импульсов.
|
||
* Параметр принимает любое значение из диапазона 0x0-0x7,
|
||
* где 0x0 - без деления, 0x1 - с коэф. 1/2, а 0x7 - 1/8.
|
||
* @param FirstWidthVal Значение ширины первого импульса в тактах SysClk/8.
|
||
* Параметр принимает любое значение из диапазона 0x0-0xF,
|
||
* где 0x0 - 1 такт, а 0xF - 16 тактов.
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_PC_Config(PWM_TypeDef* PWMx, uint32_t DutyVal, uint32_t FreqDivVal, uint32_t FirstWidthVal)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_PC_DUTY(DutyVal));
|
||
assert_param(IS_PWM_PC_FREQ_DIV(FreqDivVal));
|
||
assert_param(IS_PWM_PC_FIRST_WIDTH(FirstWidthVal));
|
||
|
||
MODIFY_REG(PWMx->PCCTL, PWM_PCCTL_CHPDUTY_Msk | PWM_PCCTL_CHPFREQ_Msk | PWM_PCCTL_OSTWTH_Msk,
|
||
((DutyVal << PWM_PCCTL_CHPDUTY_Pos) |
|
||
(FreqDivVal << PWM_PCCTL_CHPFREQ_Pos) |
|
||
(FirstWidthVal << PWM_PCCTL_OSTWTH_Pos)));
|
||
}
|
||
|
||
/**
|
||
* @brief Включение модулятора блока ШИМ
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param State Выбор состояния
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_PC_Cmd(PWM_TypeDef* PWMx, FunctionalState State)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_FUNCTIONAL_STATE(State));
|
||
|
||
WRITE_REG(PWMx->PCCTL_bit.CHPEN, State);
|
||
}
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
/** @defgroup PWM_Exported_Functions_TripZone Блок обработки сигналов аварии
|
||
* @{
|
||
*/
|
||
|
||
void PWM_TZ_Init(PWM_TypeDef* PWMx, PWM_TZ_Init_TypeDef* InitStruct);
|
||
void PWM_TZ_StructInit(PWM_TZ_Init_TypeDef* InitStruct);
|
||
|
||
/**
|
||
* @brief Настройка поведения канала A при поступлении сигнала аварии
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param Action Выбор действия
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_TZ_ActionAConfig(PWM_TypeDef* PWMx, PWM_TZ_Action_TypeDef Action)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_TZ_ACTION(Action));
|
||
|
||
WRITE_REG(PWMx->TZCTL_bit.TZA, Action);
|
||
}
|
||
|
||
/**
|
||
* @brief Настройка поведения канала B при поступлении сигнала аварии
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param Action Выбор действия
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_TZ_ActionBConfig(PWM_TypeDef* PWMx, PWM_TZ_Action_TypeDef Action)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_TZ_ACTION(Action));
|
||
|
||
WRITE_REG(PWMx->TZCTL_bit.TZB, Action);
|
||
}
|
||
|
||
/**
|
||
* @brief Включение циклической обработки сигнала аварии
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param State Выбор состояния
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_TZ_CycleCmd(PWM_TypeDef* PWMx, FunctionalState State)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_FUNCTIONAL_STATE(State));
|
||
|
||
WRITE_REG(PWMx->TZSEL_bit.CBC, State);
|
||
}
|
||
|
||
/**
|
||
* @brief Включение однократной обработки сигнала аварии
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param State Выбор состояния
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_TZ_OneShotCmd(PWM_TypeDef* PWMx, FunctionalState State)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_FUNCTIONAL_STATE(State));
|
||
|
||
WRITE_REG(PWMx->TZSEL_bit.OST, State);
|
||
}
|
||
|
||
/**
|
||
* @brief Включение прерывания по сигналу аварии
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param ITSource Выбор источника прерывания
|
||
* Параметр принимает любую совокупность значений из @ref PWM_TZ_ITSource_Define.
|
||
* @param State Выбор состояния
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_TZ_ITCmd(PWM_TypeDef* PWMx, uint32_t ITSource, FunctionalState State)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_TZ_IT_SOURCE(ITSource));
|
||
assert_param(IS_FUNCTIONAL_STATE(State));
|
||
|
||
MODIFY_REG(PWMx->TZEINT, ITSource, State ? ITSource : 0);
|
||
}
|
||
|
||
/**
|
||
* @brief Чтение статуса флага прерывания от обработчика сигналов аварии выбранного блока ШИМ
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param ITStatus Выбор флагов.
|
||
* Параметр принимает любую совокупность значений из @ref PWM_TZ_ITSource_Define.
|
||
* @retval Status Статус прерывания. Если выбрано несколько флагов,
|
||
* то результат соответсвует логическому ИЛИ их состояний.
|
||
*/
|
||
__STATIC_INLINE FlagStatus PWM_TZ_ITStatus(PWM_TypeDef* PWMx, uint32_t ITStatus)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_TZ_IT_STATUS(ITStatus));
|
||
|
||
return (FlagStatus)READ_BIT(PWMx->TZFLG, ITStatus);
|
||
}
|
||
|
||
/**
|
||
* @brief Сброс флага прерывания от обработчика сигналов аварии выбранного блока ШИМ
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param ITStatus Выбор флагов.
|
||
* Параметр принимает любую совокупность значений из @ref PWM_TZ_ITSource_Define.
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_TZ_ITStatusClear(PWM_TypeDef* PWMx, uint32_t ITStatus)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_TZ_IT_STATUS(ITStatus));
|
||
|
||
WRITE_REG(PWMx->TZCLR, ITStatus);
|
||
}
|
||
|
||
/**
|
||
* @brief Чтение статуса активного запроса прерывания от обработчика сигналов аварии выбранного блока ШИМ
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @retval Status Статус запроса прерывания
|
||
*/
|
||
__STATIC_INLINE FlagStatus PWM_TZ_ITPendStatus(PWM_TypeDef* PWMx)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
|
||
return (FlagStatus)READ_BIT(PWMx->TZINTCLR, PWM_TZINTCLR_INT_Msk);
|
||
}
|
||
|
||
/**
|
||
* @brief Сброс активного запроса прерывания от обработчика сигналов аварии выбранного блока ШИМ
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @retval Нет
|
||
*/
|
||
__STATIC_INLINE void PWM_TZ_ITPendStatusClear(PWM_TypeDef* PWMx)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
|
||
WRITE_REG(PWMx->TZINTCLR_bit.INT, 1);
|
||
}
|
||
|
||
/**
|
||
* @brief Программный вызов прерывания от обработчика сигналов аварии выбранного блока ШИМ
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param ITSource Выбор источника прерывания
|
||
* Параметр принимает любую совокупность значений из @ref PWM_TZ_ITSource_Define
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_TZ_ITForceCmd(PWM_TypeDef* PWMx, uint32_t ITSource)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_TZ_IT_SOURCE(ITSource));
|
||
|
||
WRITE_REG(PWMx->TZFRC, ITSource);
|
||
}
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
/** @defgroup PWM_Exported_Functions_EventTrigger Генерация внешних сигналов
|
||
* @{
|
||
*/
|
||
|
||
void PWM_ET_Init(PWM_TypeDef* PWMx, PWM_ET_Init_TypeDef* InitStruct);
|
||
void PWM_ET_StructInit(PWM_ET_Init_TypeDef* InitStruct);
|
||
|
||
/**
|
||
* @brief Включение генерации строба запуска АЦП по событию канала A
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param State Выбор состояния
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_ET_SOCACmd(PWM_TypeDef* PWMx, FunctionalState State)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_FUNCTIONAL_STATE(State));
|
||
|
||
WRITE_REG(PWMx->ETSEL_bit.SOCAEN, State);
|
||
}
|
||
|
||
/**
|
||
* @brief Настройка события канала A для генерации строба запуска АЦП
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param Event Выбор события
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_ET_SOCAEventConfig(PWM_TypeDef* PWMx, PWM_ET_Event_TypeDef Event)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_ET_EVENT(Event));
|
||
|
||
WRITE_REG(PWMx->ETSEL_bit.SOCASEL, Event);
|
||
}
|
||
|
||
/**
|
||
* @brief Настройка количества событий канала A для генерации строба запуска АЦП
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param PeriodVal Выбор количества событий для возникновения строба АЦП.
|
||
Параметр принимает любое значение из диапазона 0-3,
|
||
где 0 - соответсвует каждому событию, 1 - каждому второму и т.д.
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_ET_SOCAPeriodConfig(PWM_TypeDef* PWMx, uint32_t PeriodVal)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_ET_PERIOD(PeriodVal));
|
||
|
||
WRITE_REG(PWMx->ETPS_bit.SOCAPRD, PeriodVal);
|
||
}
|
||
|
||
/**
|
||
* @brief Получение текущего значения счетчика событий, приводящих к генерации события запуска АЦП
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @retval Val Значение
|
||
*/
|
||
__STATIC_INLINE uint32_t PWM_ET_GetEventCountSOCA(PWM_TypeDef* PWMx)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
|
||
return READ_REG(PWMx->ETPS_bit.SOCACNT);
|
||
}
|
||
|
||
/**
|
||
* @brief Включение генерации строба запуска АЦП по событию канала B
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param State Выбор состояния
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_ET_SOCBCmd(PWM_TypeDef* PWMx, FunctionalState State)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_FUNCTIONAL_STATE(State));
|
||
|
||
WRITE_REG(PWMx->ETSEL_bit.SOCBEN, State);
|
||
}
|
||
|
||
/**
|
||
* @brief Настройка события канала B для генерации строба запуска АЦП
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param Event Выбор события
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_ET_SOCBEventConfig(PWM_TypeDef* PWMx, PWM_ET_Event_TypeDef Event)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_ET_EVENT(Event));
|
||
|
||
WRITE_REG(PWMx->ETSEL_bit.SOCBSEL, Event);
|
||
}
|
||
|
||
/**
|
||
* @brief Настройка количества событий канала B для генерации строба запуска АЦП
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param PeriodVal Выбор количества событий для возникновения строба АЦП.
|
||
Параметр принимает любое значение из диапазона 0-3,
|
||
где 0 - соответсвует каждому событию, 1 - каждому второму и т.д.
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_ET_SOCBPeriodConfig(PWM_TypeDef* PWMx, uint32_t PeriodVal)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_ET_PERIOD(PeriodVal));
|
||
|
||
WRITE_REG(PWMx->ETPS_bit.SOCBPRD, PeriodVal);
|
||
}
|
||
|
||
/**
|
||
* @brief Получение текущего значения счетчика событий, приводящих к генерации события запуска АЦП
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @retval Val Значение
|
||
*/
|
||
__STATIC_INLINE uint32_t PWM_ET_GetEventCountSOCB(PWM_TypeDef* PWMx)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
|
||
return READ_REG(PWMx->ETPS_bit.SOCBCNT);
|
||
}
|
||
|
||
/**
|
||
* @brief Включение генерации запроса DMA по событию канала A
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param State Выбор состояния
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_ET_DRQACmd(PWM_TypeDef* PWMx, FunctionalState State)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_FUNCTIONAL_STATE(State));
|
||
|
||
WRITE_REG(PWMx->ETSEL_bit.DRQAEN, State);
|
||
}
|
||
|
||
/**
|
||
* @brief Настройка события канала A для генерации запроса DMA
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param Event Выбор события
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_ET_DRQAEventConfig(PWM_TypeDef* PWMx, PWM_ET_Event_TypeDef Event)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_ET_EVENT(Event));
|
||
|
||
WRITE_REG(PWMx->ETSEL_bit.DRQASEL, Event);
|
||
}
|
||
|
||
/**
|
||
* @brief Настройка количества событий канала A для генерации запроса DMA
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param PeriodVal Выбор количества событий для возникновения запроса DMA.
|
||
Параметр принимает любое значение из диапазона 0-3,
|
||
где 0 - соответсвует каждому событию, 1 - каждому второму и т.д.
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_ET_DRQAPeriodConfig(PWM_TypeDef* PWMx, uint32_t PeriodVal)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_ET_PERIOD(PeriodVal));
|
||
|
||
WRITE_REG(PWMx->ETPS_bit.DRQAPRD, PeriodVal);
|
||
}
|
||
|
||
/**
|
||
* @brief Получение текущего значения счетчика событий, приводящих к генерации запроса DMA
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @retval Val Значение
|
||
*/
|
||
__STATIC_INLINE uint32_t PWM_ET_GetEventCountDRQA(PWM_TypeDef* PWMx)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
|
||
return READ_REG(PWMx->ETPS_bit.DRQACNT);
|
||
}
|
||
|
||
/**
|
||
* @brief Включение генерации запроса DMA по событию канала B
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param State Выбор состояния
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_ET_DRQBCmd(PWM_TypeDef* PWMx, FunctionalState State)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_FUNCTIONAL_STATE(State));
|
||
|
||
WRITE_REG(PWMx->ETSEL_bit.DRQBEN, State);
|
||
}
|
||
|
||
/**
|
||
* @brief Настройка события канала B для генерации запроса DMA
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param Event Выбор события
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_ET_DRQBEventConfig(PWM_TypeDef* PWMx, PWM_ET_Event_TypeDef Event)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_ET_EVENT(Event));
|
||
|
||
WRITE_REG(PWMx->ETSEL_bit.DRQBSEL, Event);
|
||
}
|
||
|
||
/**
|
||
* @brief Настройка количества событий канала B для генерации запроса DMA
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param PeriodVal Выбор количества событий для возникновения запроса DMA.
|
||
Параметр принимает любое значение из диапазона 0-3,
|
||
где 0 - соответсвует каждому событию, 1 - каждому второму и т.д.
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_ET_DRQBPeriodConfig(PWM_TypeDef* PWMx, uint32_t PeriodVal)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_ET_PERIOD(PeriodVal));
|
||
|
||
WRITE_REG(PWMx->ETPS_bit.DRQBPRD, PeriodVal);
|
||
}
|
||
|
||
/**
|
||
* @brief Получение текущего значения счетчика событий, приводящих к генерации запроса DMA
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @retval Val Значение
|
||
*/
|
||
__STATIC_INLINE uint32_t PWM_ET_GetEventCountDRQB(PWM_TypeDef* PWMx)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
|
||
return READ_REG(PWMx->ETPS_bit.DRQBCNT);
|
||
}
|
||
|
||
/**
|
||
* @brief Чтение статусов флагов генерации внешних сигналов/запросов выбранным блоком ШИМ
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param Status Выбор флагов.
|
||
* Параметр принимает любую совокупность значений из @ref PWM_ET_Status_Define.
|
||
* @retval Status Статус. Если выбрано несколько флагов,
|
||
* то результат соответсвует логическому ИЛИ их состояний.
|
||
*/
|
||
__STATIC_INLINE FlagStatus PWM_ET_Status(PWM_TypeDef* PWMx, uint32_t Status)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_ET_STATUS(Status));
|
||
|
||
return (FlagStatus)READ_BIT(PWMx->ETFLG, Status);
|
||
}
|
||
|
||
/**
|
||
* @brief Сброс флагов генерации внешних сигналов/запросов выбранным блоком ШИМ
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param Status Выбор флагов.
|
||
* Параметр принимает любую совокупность значений из @ref PWM_ET_Status_Define.
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_ET_StatusClear(PWM_TypeDef* PWMx, uint32_t Status)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_ET_STATUS(Status));
|
||
|
||
WRITE_REG(PWMx->ETCLR, Status);
|
||
}
|
||
|
||
/**
|
||
* @brief Программный вызов генерации внешних сигналов/запросов выбранным блоком ШИМ
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param Status Выбор источника.
|
||
* Параметр принимает любую совокупность значений из @ref PWM_ET_Status_Define
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_ET_ForceCmd(PWM_TypeDef* PWMx, uint32_t Status)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_ET_STATUS(Status));
|
||
|
||
WRITE_REG(PWMx->ETFRC, Status);
|
||
}
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
/** @defgroup PWM_Exported_Functions_IT Прерывание счетчика ШИМ
|
||
* @{
|
||
*/
|
||
|
||
/**
|
||
* @brief Настройка события канала для генерации прерывания
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param Event Выбор события
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_ITEventConfig(PWM_TypeDef* PWMx, PWM_ET_Event_TypeDef Event)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_ET_EVENT(Event));
|
||
|
||
WRITE_REG(PWMx->ETSEL_bit.INTSEL, Event);
|
||
}
|
||
|
||
/**
|
||
* @brief Настройка количества событий для генерации прерывания
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param PeriodVal Выбор количества событий для возникновения прерывания
|
||
Параметр принимает любое значение из диапазона 0-3,
|
||
где 0 - соответсвует каждому событию, 1 - каждому второму и т.д.
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_ITPeriodConfig(PWM_TypeDef* PWMx, uint32_t PeriodVal)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_PWM_ET_PERIOD(PeriodVal));
|
||
|
||
WRITE_REG(PWMx->ETPS_bit.INTPRD, PeriodVal);
|
||
}
|
||
|
||
/**
|
||
* @brief Включение генерации прерывания ШИМ
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @param State Выбор состояния
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_ITCmd(PWM_TypeDef* PWMx, FunctionalState State)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
assert_param(IS_FUNCTIONAL_STATE(State));
|
||
|
||
WRITE_REG(PWMx->ETSEL_bit.INTEN, State);
|
||
}
|
||
|
||
/**
|
||
* @brief Получение текущего значения счетчика событий, приводящих к генерации прерывания
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @retval Val Значение
|
||
*/
|
||
__STATIC_INLINE uint32_t PWM_GetITEventCount(PWM_TypeDef* PWMx)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
|
||
return READ_REG(PWMx->ETPS_bit.INTCNT);
|
||
}
|
||
|
||
/**
|
||
* @brief Чтение статуса флага прерывания выбранного блока ШИМ
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @retval Status Статус
|
||
*/
|
||
__STATIC_INLINE FlagStatus PWM_ITStatus(PWM_TypeDef* PWMx)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
|
||
return (FlagStatus)READ_BIT(PWMx->ETFLG, PWM_ETFRC_INT_Msk);
|
||
}
|
||
|
||
/**
|
||
* @brief Сброс флагов прерывания выбранного блока ШИМ
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_ITStatusClear(PWM_TypeDef* PWMx)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
|
||
WRITE_REG(PWMx->ETCLR, PWM_ETCLR_INT_Msk);
|
||
}
|
||
|
||
/**
|
||
* @brief Чтение статуса флага активного прерывания выбранного блока ШИМ
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @retval Status Статус
|
||
*/
|
||
__STATIC_INLINE FlagStatus PWM_ITPendStatus(PWM_TypeDef* PWMx)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
|
||
return (FlagStatus)READ_BIT(PWMx->INTCLR, PWM_INTCLR_INT_Msk);
|
||
}
|
||
|
||
/**
|
||
* @brief Сброс флагов активного прерывания выбранного блока ШИМ
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @retval void
|
||
*/
|
||
__STATIC_INLINE void PWM_ITPendStatusClear(PWM_TypeDef* PWMx)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
|
||
WRITE_REG(PWMx->INTCLR, PWM_INTCLR_INT_Msk);
|
||
}
|
||
|
||
/**
|
||
* @brief Программный вызов прерывания выбранного блока ШИМ
|
||
* @param PWMx Выбор PWM, где x лежит в диапазоне 0-2
|
||
* @retval Нет
|
||
*/
|
||
__STATIC_INLINE void PWM_ITForceCmd(PWM_TypeDef* PWMx)
|
||
{
|
||
assert_param(IS_PWM_PERIPH(PWMx));
|
||
|
||
WRITE_REG(PWMx->ETFRC, PWM_ETFRC_INT_Msk);
|
||
}
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
|
||
#endif /* __PLIB035_PWM_H */
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
/******************* (C) COPYRIGHT 2018 NIIET *****END OF FILE****/
|