#ifndef __LKS32MC09X_HALL_H__
#define __LKS32MC09X_HALL_H__

#include "lks32mc09x_reg.h"
#include "lks32mc09x_user_manual.h"

/**
 * @brief HALL初始化结构体句柄，初始化时请定义该句柄，并用其它地址来传参
 */
typedef struct
{
    uint32_t CountTH;         ///< HALL计数器门限值，有效位为24位
    uint16_t FilterLen;       ///< 滤波长度,0对应长度1,1023对应长度1024滤波长度
    uint8_t ClockDivision;    ///< 分频 0~3:/1 /2 /4 /8
    uint8_t Filter75_Ena;     ///< 使能第一级7/5滤波,高电平有效,ENABLE：使能 DISABLE：失能
    uint8_t HALL_Ena;         ///< 使能HALL,高电平有效,ENABLE：使能 DISABLE：失能
    uint8_t Capture_IRQ_Ena;  ///< HALL信号变化中断使能,高电平有效,ENABLE：使能 DISABLE：失能
    uint8_t OverFlow_IRQ_Ena; ///< HALL计数器溢出中断使能,高电平有效,ENABLE：使能 DISABLE：失能
    uint8_t softIE;           ///< 软件中断使能 ,ENABLE：使能 DISABLE：失能
} HALL_InitTypeDef;

#define HALL_CLK_DIV1       ((uint32_t)0x00) ///< HALL时钟为系统主时钟1分频
#define HALL_CLK_DIV2       ((uint32_t)0x01) ///< HALL时钟为系统主时钟2分频
#define HALL_CLK_DIV4       ((uint32_t)0x02) ///< HALL时钟为系统主时钟4分频
#define HALL_CLK_DIV8       ((uint32_t)0x03) ///< HALL时钟为系统主时钟8分频

#define HALL_CAPTURE_EVENT  ((uint32_t)HALL0_CFG_CHG_IE_BIT) ///< HALL中断使能和标志定义，HALL信号变化中断
#define HALL_OVERFLOW_EVENT ((uint32_t)HALL0_CFG_OV_IE_BIT)  ///< HALL中断使能和标志定义，HALL计数溢出中断

/**
 * @brief 初始化HALL结构体
 * @param HALL_InitStruct: 指向HALL_InitTypeDef结构体的指针
 */
void HALL_StructInit(HALL_InitTypeDef *HALL_InitStruct);

/**
 * @brief 初始化HALL模块
 * @param HALL_InitStruct: 指向HALL_InitTypeDef结构体的指针
 */
void HALL_Init(HALL_InitTypeDef *HALL_InitStruct);

/**
 * @brief 使能或失能HALL模块
 * @param state: 功能状态，ENABLE或DISABLE
 */
void HALL_Cmd(uint8_t state);

/**
 * @brief 读取滤波后的HALL值
 * @return 滤波后的HALL值
 */
uint32_t HALL_GetFilterValue(void);

/**
 * @brief 读取未滤波的HALL值
 * @return 未滤波的HALL值
 */
uint32_t HALL_GetCaptureValue(void);

/**
 * @brief 读取HALL计数值
 * @return HALL计数值
 */
uint32_t HALL_GetCount(void);

/**
 * @brief 判断是否发生捕获事件
 * @return 发生捕获事件返回非零值（True），否则返回0（False）
 */
uint32_t HALL_IsCaptureEvent(void);

/**
 * @brief 判断是否发生溢出事件
 * @return 发生溢出事件返回非零值（True），否则返回0（False）
 */
uint32_t HALL_IsOverFlowEvent(void);

/**
 * @brief 获取HALL事件标志
 * @param tempFlag: 要获取的标志位
 * @return 对应标志位的状态
 */
uint32_t HALL_GetFlag(uint32_t tempFlag);

/**
 * @brief 清除HALL中断标志位
 * @param tempFlag: 要清除的标志位
 */
void HALL_Clear_IRQ(uint32_t tempFlag);

/**
 * @brief 读取HALL中断标志位
 * @param tempFlag: 要读取的标志位
 * @return 对应标志位的状态
 */
uint32_t HALL_GetIRQFlag(uint32_t tempFlag);

/**
 * @brief 软件触发HALL信号变化中断
 */
void HALL_SoftTrigger(void);

#endif
