/********************************** (C) COPYRIGHT *******************************
 * File Name          : CH59x_pwm.h
 * Author             : WCH
 * Version            : V1.2
 * Date               : 2021/11/17
 * Description
 *********************************************************************************
 * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
 * Attention: This software (modified or not) and binary are used for 
 * microcontroller manufactured by Nanjing Qinheng Microelectronics.
 *******************************************************************************/

#ifndef __CH59x_PWM_H__
#define __CH59x_PWM_H__

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @brief  channel of PWM define
 */
#define CH_PWM4     0x01  // PWM4 通道
#define CH_PWM5     0x02  // PWM5 通道
#define CH_PWM6     0x04  // PWM6 通道
#define CH_PWM7     0x08  // PWM7 通道
#define CH_PWM8     0x10  // PWM8 通道
#define CH_PWM9     0x20  // PWM9 通道
#define CH_PWM10    0x40  // PWM10 通道
#define CH_PWM11    0x80  // PWM11 通道

/**
 * @brief  channel of PWM define
 */
typedef enum
{
    High_Level = 0, // 默认低电平，高电平有效
    Low_Level,      // 默认高电平，低电平有效
} PWMX_PolarTypeDef;

/**
 * @brief  Configuration PWM4_11 Cycle size
 */
typedef enum
{
    PWMX_Cycle_256 = 0, // 256 个PWMX周期
    PWMX_Cycle_255,     // 255 个PWMX周期
    PWMX_Cycle_128,     // 128 个PWMX周期
    PWMX_Cycle_127,     // 127 个PWMX周期
    PWMX_Cycle_64,      // 64 个PWMX周期
    PWMX_Cycle_63,      // 63 个PWMX周期
} PWMX_CycleTypeDef;

/**
 * @brief   PWM4-PWM11 通道基准时钟配置
 *
 * @param   d   - 通道基准时钟 = d*Tsys
 */
#define PWMX_CLKCfg(d)    (R8_PWM_CLOCK_DIV = d)

/**
 * @brief   PWM4-PWM11周期配置
 *
 * @param   cyc - refer to PWMX_CycleTypeDef
 */
void PWMX_CycleCfg(PWMX_CycleTypeDef cyc);

/**
 * @brief   PWM4-PWM9 16位周期配置
 *
 * @param   cyc - 16位周期
 */
void PWMX_16bit_CycleCfg(uint16_t cyc);

/**
 * @brief   设置 PWM4 有效数据脉宽
 *
 * @param   d   - 有效数据脉宽
 */
#define PWM4_ActDataWidth(d)     (R8_PWM4_DATA = d)

/**
 * @brief   设置 PWM5 有效数据脉宽
 *
 * @param   d   - 有效数据脉宽
 */
#define PWM5_ActDataWidth(d)     (R8_PWM5_DATA = d)

/**
 * @brief   设置 PWM6 有效数据脉宽
 *
 * @param   d   - 有效数据脉宽
 */
#define PWM6_ActDataWidth(d)     (R8_PWM6_DATA = d)

/**
 * @brief   设置 PWM7 有效数据脉宽
 *
 * @param   d   - 有效数据脉宽
 */
#define PWM7_ActDataWidth(d)     (R8_PWM7_DATA = d)

/**
 * @brief   设置 PWM8 有效数据脉宽
 *
 * @param   d   - 有效数据脉宽
 */
#define PWM8_ActDataWidth(d)     (R8_PWM8_DATA = d)

/**
 * @brief   设置 PWM9 有效数据脉宽
 *
 * @param   d   - 有效数据脉宽
 */
#define PWM9_ActDataWidth(d)     (R8_PWM9_DATA = d)

/**
 * @brief   设置 PWM10 有效数据脉宽
 *
 * @param   d   - 有效数据脉宽
 */
#define PWM10_ActDataWidth(d)    (R8_PWM10_DATA = d)

/**
 * @brief   设置 PWM11 有效数据脉宽
 *
 * @param   d   - 有效数据脉宽
 */
#define PWM11_ActDataWidth(d)    (R8_PWM11_DATA = d)

/**
 * @brief   PWM4-PWM11通道输出波形配置
 *
 * @param   ch      - select channel of pwm, refer to channel of PWM define
 * @param   da      - effective pulse width
 * @param   pr      - select wave polar, refer to PWMX_PolarTypeDef
 * @param   s       - control pwmx function, ENABLE or DISABLE
 */
void PWMX_ACTOUT(uint8_t ch, uint8_t da, PWMX_PolarTypeDef pr, FunctionalState s);

/**
 * @brief   PWM4-PWM9 通道16位输出波形配置
 *
 * @param   ch      - select channel of pwm, refer to channel of PWM define
 * @param   da      - effective pulse width
 * @param   pr      - select wave polar, refer to PWMX_PolarTypeDef
 * @param   s       - control pwmx function, ENABLE or DISABLE
 */
void PWMX_16bit_ACTOUT(uint8_t ch, uint16_t da, PWMX_PolarTypeDef pr, FunctionalState s);

/**
 * @brief   PWM 交替输出模式配置
 *
 * @param   ch      - select group of PWM alternate output
 *                    RB_PWM4_5_STAG_EN     -  PWM4 和 PWM5 通道交替输出
 *                    RB_PWM6_7_STAG_EN     -  PWM6 和 PWM7 通道交替输出
 *                    RB_PWM8_9_STAG_EN     -  PWM8 和 PWM9 通道交替输出
 *                    RB_PWM10_11_STAG_EN   -  PWM10 和 PWM11 通道交替输出
 * @param   s       - control pwmx function, ENABLE or DISABLE
 */
void PWMX_AlterOutCfg(uint8_t ch, FunctionalState s);

#ifdef __cplusplus
}
#endif

#endif // __CH59x_PWM_H__
