#include "lks32mc09x_dsp.h"
#include "lks32mc09x_sys.h"

/**
 * @brief 初始化DSP模块
 *
 * 该函数用于初始化DSP模块，使其处于可用状态。
 */
void DSP_Init(void)
{
    SYS_ModuleClockCmd(SYS_MODULE_DSP0, ENABLE);
    SYS_SoftResetModule(SYS_MODULE_DSP0);
}

/**
 * @brief 使能DSP模块
 *
 * 该函数用于使能DSP模块，开始处理数据。
 */
void DSP_Enable(void)
{
    SYS_ModuleClockCmd(SYS_MODULE_DSP0, ENABLE);
}

/**
 * @brief 禁用DSP模块
 *
 * 该函数用于禁用DSP模块，停止处理数据。
 */
void DSP_Disable(void)
{
    SYS_ModuleClockCmd(SYS_MODULE_DSP0, DISABLE);
}

/**
 * @brief 复位DSP模块
 *
 * 该函数用于复位DSP模块，使其恢复到初始状态。
 */
void DSP_Reset(void)
{
    SYS_SoftResetModule(SYS_MODULE_DSP0);
}

/**
 * @brief 执行整数除法
 *
 * @param a 被除数
 * @param b 除数
 * @return 商
 */
s32 DSP_Div(s32 a, s32 b)
{
    DSP0_DID = a;
    DSP0_DIS = b;
    // 执行整数除法，这里直接返回除法结果
    return DSP0_QUO;
}

/**
 * @brief 计算均方根值
 *
 * @param a 输入值1
 * @param b 输入值2
 * @return 均方根值
 */
uint16_t DSP_Rms(s16 a, s16 b)
{
    int32_t a32, b32;
    a32      = a;
    b32      = b;
    DSP0_RAD = a32 * a32 + b32 * b32;
    return DSP0_SQRT;
}

/**
 * @brief 执行取模运算
 *
 * @param a 被除数
 * @param b 除数
 * @return 余数
 */
s32 DSP_Mod(s32 a, s32 b)
{
    DSP0_DID = a;
    DSP0_DIS = b;
    return DSP0_REM;
}

/**
 * @brief 计算平方根
 *
 * @param val 输入值
 * @return 平方根值
 */
uint16_t DSP_Sqrt(uint32_t val)
{
    DSP0_RAD = val;
    return DSP0_SQRT;
}
