Files
vd_960/vd960Loop/libraries/drivers/src/at32f421_cmp.c
T
wangfq 95808f9f25 refactor(vd960Loop): 算法回退到 DLD154V4B,四通道适配
- 用 DLD154V4B vd1_task/per_channel 替换 vds_task 复杂算法
- 移除 FUNCTION_B/二次判断/快速变化/多重确认等增强特性
- 保留平坦性离开算法 (CN200910309382),每通道独立状态
- 灵敏度表改为 DLD154V4B 4级: {216,108,36,10} / {108,72,18,9}
- 清理废弃类型: FltHistoryManager, Loop_ACS_Info, StageRangeConfig 等
- 首次添加 vd960DBN 完整源码
2026-06-25 16:21:57 +08:00

232 lines
6.8 KiB
C

/**
**************************************************************************
* @file at32f421_cmp.c
* @brief contains all the functions for the gpio firmware library
**************************************************************************
* Copyright notice & Disclaimer
*
* The software Board Support Package (BSP) that is made available to
* download from Artery official website is the copyrighted work of Artery.
* Artery authorizes customers to use, copy, and distribute the BSP
* software and its related documentation for the purpose of design and
* development in conjunction with Artery microcontrollers. Use of the
* software is governed by this copyright notice and the following disclaimer.
*
* THIS SOFTWARE IS PROVIDED ON "AS IS" BASIS WITHOUT WARRANTIES,
* GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,
* TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR
* STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,
* INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.
*
**************************************************************************
*/
#include "at32f421_conf.h"
/** @addtogroup AT32F421_periph_driver
* @{
*/
/** @defgroup CMP
* @brief CMP driver modules
* @{
*/
#ifdef CMP_MODULE_ENABLED
/** @defgroup CMP_private_functions
* @{
*/
#define CMP_CTRLSTS1_CLEAR_MASK ((uint32_t)0x00039C7C)
#define CMP_INPINPUT_CLEAR_MASK ((uint32_t)0x00000180)
#define CMP_HIGH_PULSE_CLEAR_MASK ((uint16_t)0x003F)
#define CMP_LOW_PULSE_CLEAR_MASK ((uint16_t)0x003F)
/**
* @brief reset the cmp register
* @param none
* @retval none
*/
void cmp_reset(void)
{
crm_periph_reset(CRM_CMP_PERIPH_RESET, TRUE);
crm_periph_reset(CRM_CMP_PERIPH_RESET, FALSE);
}
/**
* @brief initialize the cmp peripheral
* @param cmp_sel: to select the cmp peripheral
* this parameter only can be CMP1_SELECTION
* @param cmp_init_struct: pointer to cmp init structure
* @retval none
*/
void cmp_init(cmp_sel_type cmp_sel, cmp_init_type* cmp_init_struct)
{
if(cmp_sel == CMP1_SELECTION)
{
CMP->ctrlsts_bit.cmpninvsel = cmp_init_struct->cmp_non_inverting;
CMP->ctrlsts_bit.cmpinvsel = cmp_init_struct->cmp_inverting;
CMP->ctrlsts_bit.cmpssel = cmp_init_struct->cmp_speed;
CMP->ctrlsts_bit.cmptag = cmp_init_struct->cmp_output;
CMP->ctrlsts_bit.cmpp = cmp_init_struct->cmp_polarity;
CMP->ctrlsts_bit.cmphyst = cmp_init_struct->cmp_hysteresis;
}
}
/**
* @brief fill each cmp_init_type member with its default value.
* @param cmp_init_type : pointer to a cmp_init_type structure
* which will be initialized.
* @retval none
*/
void cmp_default_para_init(cmp_init_type *cmp_init_struct)
{
/* reset cmp init structure parameters values */
cmp_init_struct->cmp_non_inverting = CMP_NON_INVERTING_PA1;
cmp_init_struct->cmp_inverting = CMP_INVERTING_1_4VREFINT;
cmp_init_struct->cmp_speed = CMP_SPEED_FAST;
cmp_init_struct->cmp_output = CMP_OUTPUT_NONE;
cmp_init_struct->cmp_polarity = CMP_POL_NON_INVERTING;
cmp_init_struct->cmp_hysteresis = CMP_HYSTERESIS_NONE;
}
/**
* @brief enable or disable cmp
* @param cmp_sel: to select the cmp peripheral
* this parameter only can be CMP1_SELECTION.
* @param new_state (TRUE or FALSE)
* @retval none
*/
void cmp_enable(cmp_sel_type cmp_sel, confirm_state new_state)
{
/* cmp enable */
if(cmp_sel == CMP1_SELECTION)
{
CMP->ctrlsts_bit.cmpen = new_state;
}
}
/**
* @brief enable or disable cmp input shift
* @param new_state (TRUE or FALSE)
* @retval none
*/
void cmp_input_shift_enable(confirm_state new_state)
{
CMP->ctrlsts_bit.cmpis = new_state;
}
/**
* @brief get cmp output value
* @param cmp_sel: to select the cmp peripheral
* this parameter only can be CMP1_SELECTION.
* @retval cmp output value
*/
uint32_t cmp_output_value_get(cmp_sel_type cmp_sel)
{
uint32_t cmpout = 0x0;
if(cmp_sel == CMP1_SELECTION)
{
cmpout = CMP->ctrlsts_bit.cmpvalue;
}
/* return the comparator output level */
return (uint32_t)(cmpout);
}
/**
* @brief enable cmp write protect
* @param cmp_sel: to select the cmp peripheral
* this parameter only can be CMP1_SELECTION.
* @retval none
*/
void cmp_write_protect_enable(cmp_sel_type cmp_sel)
{
if(cmp_sel == CMP1_SELECTION)
{
CMP->ctrlsts_bit.cmpwp = TRUE;
}
}
/**
* @brief configure cmp glitch filter
* @param high_pulse_cnt: cmp high pulse count.
* this parameter must be a value between 0x00 and 0x3f
* @param low_pulse_cnt: cmp low pulse count.
* this parameter must be a value between 0x00 and 0x3f
* @param new_state (TRUE or FALSE)
* @retval none
*/
void cmp_filter_config(uint16_t high_pulse_cnt, uint16_t low_pulse_cnt, confirm_state new_state)
{
if (new_state != FALSE)
{
/* enable the glitch filter */
CMP->g_filter_en_bit.gfe = TRUE;
/* write to cmp high_pulse and low_pulse */
CMP->low_pulse_bit.l_pulse_cnt = low_pulse_cnt;
CMP->high_pulse_bit.h_pulse_cnt = high_pulse_cnt;
}
else
{
/* disable the glitch filter */
CMP->g_filter_en_bit.gfe = FALSE;
/* reset the h_pulse_cnt and l_pulse_cnt bits */
CMP->low_pulse_bit.l_pulse_cnt = low_pulse_cnt;
CMP->high_pulse_bit.h_pulse_cnt = high_pulse_cnt;
}
}
/**
* @brief configure cmp blanking source.
* @param blank_sel: cmp blanking source
* this parameter can be one of the following values:
* - CMP_BLANKING_NONE
* - CMP_BLANKING_TMR1_CH4
* - CMP_BLANKING_TMR3_CH3
* - CMP_BLANKING_TMR15_CH2
* - CMP_BLANKING_TMR15_CH1
* @retval none
*/
void cmp_blanking_config(cmp_blanking_type blank_sel)
{
CMP->ctrlsts_bit.cmpblanking = blank_sel;
}
/**
* @brief configure cmp scale voltage and voltage bridge
* @param scal_brg: cmp scal&brg configure
* this parameter can be one of the following values:
* - CMP_SCAL_BRG_00: vrefint = 3/4 vrefint = 1/2 vrefint = 1/4 vrefint = 0v
* - CMP_SCAL_BRG_10: vrefint = 3/4 vrefint = 1/2 vrefint = 1/4 vrefint = 1.2v
* - CMP_SCAL_BRG_11: vrefint = 1.2v, 3/4 vrefint = 0.9v, 1/2 vrefint = 0.6v, 1/4 vrefint = 0.3v
* @retval none
*/
void cmp_scal_brg_config(cmp_scal_brg_type scal_brg)
{
uint32_t tmp_scal = 0, tmp_brg = 0;
tmp_scal = scal_brg >> 1;
tmp_brg = scal_brg & 0x01;
CMP->ctrlsts_bit.scalen = tmp_scal;
CMP->ctrlsts_bit.brgen = tmp_brg;
}
/**
* @}
*/
#endif
/**
* @}
*/
/**
* @}
*/