This commit is contained in:
2026-03-20 21:16:58 +08:00
parent 286ff98b8e
commit 90c3d919df
248 changed files with 94554 additions and 0 deletions

187
user/MCU/lhl_adc.c Executable file
View File

@@ -0,0 +1,187 @@
#include "../main/SystemInclude.h"
////ʹ<><CAB9><EFBFBD>ڲ<EFBFBD><DAB2>¶ȴ<C2B6><C8B4><EFBFBD><EFBFBD><EFBFBD>
//pAFE->REF_CTRL |=AFE_REF_CTRL_TEMP_SENSER_EN_Msk;
/**------------------------------------------------------------------------
* @brief <20><>ʼ<EFBFBD><CABC> ADC <20>ڲ<EFBFBD><DAB2><EFBFBD>׼Դ<D7BC><D4B4><EFBFBD><EFBFBD>
* @note ʹ<><CAB9><EFBFBD>ڲ<EFBFBD><DAB2>ο<EFBFBD><CEBF><EFBFBD>ѹ VREF<45><46><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> VREF <20><> VDRIVE <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>
* @param vref: <20>ڲ<EFBFBD><DAB2><EFBFBD>׼<EFBFBD><D7BC>ѹѡ<D1B9><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> REF_INTERNAL_2P5V
* @param vdrive: VDrive <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹѡ<D1B9><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> REF_INTERNAL_1P25V <20><> REF_INTERNAL_OFF
* @example ADC_REF_Init(REF_INTERNAL_2P5V, REF_INTERNAL_1P25V);
**/
void ADC_REF_Init(u8 vref,u8 vdrive)
{
REF_InitTypeDef REF_InitStructure;
REF_InitStructure.VREF = vref; // <20>ڲ<EFBFBD><DAB2><EFBFBD>׼<EFBFBD><D7BC>ѹ
REF_InitStructure.VDRIVE = vdrive;// VDrive<76><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ
REF_InitStructure.VREF_Boost = DISABLE;
LHL_REF_Init(&REF_InitStructure);
}
/**------------------------------------------------------------------------
* @brief <20><>ʼ<EFBFBD><CABC> ADC Ϊ<><CEAA><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @note <20><>׼Դʹ<D4B4><CAB9><EFBFBD>ڲ<EFBFBD> VREF<45><46><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ˫<CEAA><CBAB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD>ݾ<EFBFBD><DDBE><EFBFBD><EFBFBD>жϡ<D0B6>
* @param ADCx: ADC ʵ<><CAB5> (ADC_0 / ADC_1)
* @param SPS: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD> SPS_977
* @param Gain: <20>ڲ<EFBFBD> PGA <20><><EFBFBD><EFBFBD><E6A3AC> GAIN32
* @param PChan: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ADC0_AIN0
* @param NChan: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ADC0_AIN1
* @example ADC_Init(ADC_0, SPS_977, GAIN32, ADC0_AIN0, ADC0_AIN1);
**/
void ADC_Init(ADC_ID_t ADCx ,u8 SPS ,u8 Gain, u8 PChan, u8 NChan )
{
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.AINP = PChan; // ADC0<43><30><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>
ADC_InitStructure.AINM = NChan;
ADC_InitStructure.PGA = Gain; // <20>ڲ<EFBFBD>PGA<47><41><EFBFBD><EFBFBD>x1
ADC_InitStructure.FS = SPS; // ADC<44><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ADC_InitStructure.Code = ADC_CODE_BIPOLAR; // ˫<><CBAB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ADC_InitStructure.Mode = ADC_MODE_CONTINUOUS_CONVERSION; // <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>ģʽ
ADC_InitStructure.Trigger = ADC_TRIGGER_SOFTWARE; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ADC_InitStructure.ReferenceSelect = ADC_REF_REFP_to_REFN; // <20>ڲ<EFBFBD><DAB2><EFBFBD>׼
ADC_InitStructure.REF_BUFP = ENABLE; // ʹ<>ܻ<EFBFBD>׼<EFBFBD><D7BC><EFBFBD><EFBFBD>
ADC_InitStructure.REF_BUFM = ENABLE;
ADC_InitStructure.REF_Precharge= DISABLE;
// ADC_InitStructure.Reference = 1250.0f; //<2F><>׼ֵ initû<74>õ<EFBFBD>
LHL_ADC_Init(ADCx, &ADC_InitStructure);
LHL_ADC_ITConfig(ADCx, ADC_IT_RDY, ENABLE);
}
/**------------------------------------------------------------------------
* @brief ʹ<>ܻ<EFBFBD><DCBB><EFBFBD>ֹ ADC0 <20><> ADC1 ͬ<><CDAC>ת<EFBFBD><D7AA>ģʽ
* @note ͬ<><CDAC>ת<EFBFBD><D7AA>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ADC <20><><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD>SPS<50><53>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB>ͬ<EFBFBD><CDAC>
* ADC0 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>Զ<EFBFBD>Ӧ<EFBFBD>õ<EFBFBD> ADC1<43><31>
* @param NewState: ENABLE <20><> DISABLE
* @example ADC_SyncCmd(ENABLE);
**/
void ADC_SyncCmd(FunctionalState NewState)
{
LHL_ADC_SetSync(NewState);
}
/**------------------------------------------------------------------------
* @brief <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8> ADC <20><>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param ADCx: ADC ʵ<><CAB5> (ADC_0 / ADC_1)
* @example StartADC(ADC_0);
**/
void StartADC(ADC_ID_t ADCx)
{
(ADCx == ADC_0) ? LHL_ADC_Start(ADC_0): LHL_ADC_Start(ADC_1);
}
/**------------------------------------------------------------------------
* @brief ָֹͣ<D6B9><D6B8> ADC <20><>ת<EFBFBD><D7AA>
* @param ADCx: ADC ʵ<><CAB5> (ADC_0 / ADC_1)
* @example StopADC(ADC_0);
**/
void StopADC(ADC_ID_t ADCx)
{
(ADCx == ADC_0) ? LHL_ADC_Stop(ADC_0): LHL_ADC_Stop(ADC_1);
}
/**------------------------------------------------------------------------
* @brief <20><>ȡ ADC ת<><D7AA><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>24 λԭʼ<D4AD><CABC><EFBFBD><EFBFBD>ת 16 λ<><CEBB>ƫ<EFBFBD><C6AB> 32768<36><38>
* @note ת<><D7AA><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD>((ԭʼ<D4AD><CABC><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD><EFBFBD><EFBFBD>չ >> 8) + 32768) & 0xFFFF
* @param ADCx: ADC ʵ<><CAB5> (ADC_0 / ADC_1)
* @return 16 λ ADC ֵ<><D6B5>0~65535<33><35>
* @example u32 val = ADC_ReadData(ADC_0);
**/
u32 ADC_ReadData(ADC_ID_t ADCx)
{
volatile u32 reg_data = 0;
reg_data = (ADCx == ADC_0) ? LHL_ADC_GetData(ADC_0) : LHL_ADC_GetData(ADC_1);
reg_data = ((((reg_data & 0xFFFFFF) | ((reg_data & 0x800000) ? 0xFF000000 : 0)) >> 8) + 32768) & 0xFFFF;
return reg_data ;
}
/*===========================================================================*/
/* С˯ģʽ<C4A3>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>
ѡ<><D1A1><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ʼǰ<CABC><C7B0><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҽ<EFBFBD><D2BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>ΪӲ<CEAA><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<20>ڽ<EFBFBD><DABD><EFBFBD><EBB5BD><EFBFBD><EFBFBD>ģʽ(С˯ģʽ)<29><><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>
ת<><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD>ֹͣת<D6B9><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˯<EFBFBD><CBAF>ģʽ<C4A3><CABD><EFBFBD>ߺ<EFBFBD><DFBA>ı<EFBFBD><C4B1><EFBFBD><EFBFBD>ѽ<EFBFBD><D1BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD>
<20><>Ҫ<EFBFBD><D2AA>SNOOZE<5A><45><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>(ADC)Ӳ<><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4>
*/
/**------------------------------------------------------------------------
* @brief <20><>ʼ<EFBFBD><CABC> ADC Ϊ<>͹<EFBFBD><CDB9><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA> + Ӳ<><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @note <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SNOOZE ģʽ<C4A3>µ<EFBFBD><C2B5>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD>ѻ<EFBFBD><D1BB><EFBFBD><EFBFBD><EFBFBD>˯<EFBFBD>ߡ<EFBFBD>
* @param ADCx: ADC ʵ<><CAB5> (ADC_0 / ADC_1)
* @param SPS: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD> SPS_10
* @param Gain: <20>ڲ<EFBFBD> PGA <20><><EFBFBD><EFBFBD><E6A3AC> GAIN32
* @param PChan: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ADC0_AIN2
* @param NChan: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ADC0_AVSS
* @example ADC_Init_For_LowerPower(ADC_0, SPS_10, GAIN32, ADC0_AIN2, ADC0_AVSS);
**/
void ADC_Init_For_LowerPower(ADC_ID_t ADCx, u8 SPS, u8 Gain, u8 PChan, u8 NChan)
{
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.AINP = PChan; // ADC<44><43><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>
ADC_InitStructure.AINM = NChan;
ADC_InitStructure.PGA = Gain; // <20>ڲ<EFBFBD>PGA<47><41><EFBFBD><EFBFBD>
ADC_InitStructure.FS = SPS; // ADC<44><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ADC_InitStructure.Code = ADC_CODE_BIPOLAR; // ˫<><CBAB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ADC_InitStructure.Mode = ADC_MODE_SINGLE_CONVERSION; // <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>ģʽ
ADC_InitStructure.Trigger = ADC_TRIGGER_HARDWARE; // Ӳ<><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ADC_TRIGGER_HARDWARE ADC_TRIGGER_SOFTWARE
ADC_InitStructure.ReferenceSelect = ADC_REF_REFP_to_REFN; // <20>ڲ<EFBFBD><DAB2><EFBFBD>׼
ADC_InitStructure.REF_BUFP = ENABLE; // ʹ<>ܻ<EFBFBD>׼<EFBFBD><D7BC><EFBFBD><EFBFBD>
ADC_InitStructure.REF_BUFM = ENABLE;
ADC_InitStructure.REF_Precharge = DISABLE;
LHL_ADC_Init(ADCx, &ADC_InitStructure);
LHL_ADC_ITConfig(ADCx, ADC_IT_RDY, ENABLE); //RDY_INT = 1
NVIC_EnableIRQ(ADC0_IRQn);
NVIC_SetPriority(ADC0_IRQn, 0);
NVIC_EnableIRQ(ADC1_IRQn);
NVIC_SetPriority(ADC1_IRQn, 0);
}
/*===========================================================================*/
//ADC<44>жϻص<CFBB>==============================================================================================================
static adc_irq_callback_t adc0_irq_callback ,adc1_irq_callback;
/**------------------------------------------------------------------------
* @brief ע<><D7A2> ADC ת<><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϻص<CFBB><D8B5><EFBFBD><EFBFBD><EFBFBD>
* @param ADCx: ADC ʵ<><CAB5> (ADC_0 / ADC_1)
* @param tim_irq_callback: <20>û<EFBFBD><C3BB>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>޲<EFBFBD><DEB2><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD>ֵ<EFBFBD><D6B5>
* @note ע<><D7A2><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD>ʹ<EFBFBD>ܶ<EFBFBD>Ӧ ADC <20><> NVIC <20>ж<EFBFBD> <20><>
* @example ADC_register_irq_callback(ADC_0, my_adc_callback);
**/
void ADC_register_irq_callback(ADC_ID_t ADCx, adc_irq_callback_t tim_irq_callback)
{
if(ADCx == ADC_0) {adc0_irq_callback = tim_irq_callback; NVIC_EnableIRQ(ADC0_IRQn);NVIC_SetPriority(ADC0_IRQn, 0);}
else if(ADCx == ADC_1) {adc1_irq_callback = tim_irq_callback; NVIC_EnableIRQ(ADC1_IRQn);NVIC_SetPriority(ADC1_IRQn, 0);}
}
/**------------------------------------------------------------------------
* @brief ADC0 <20>жϷ<D0B6><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @note <20><> ADC0 <20><><EFBFBD>ݾ<EFBFBD><DDBE><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD>
**/
void ADC0_IRQHandler(void)
{
if(LHL_ADC_GetPending(ADC_0, ADC_FLAG_RDY) == SET)
{
if(adc0_irq_callback != NULL) adc0_irq_callback();
}
}
/**------------------------------------------------------------------------
* @brief ADC1 <20>жϷ<D0B6><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @note <20><> ADC1 <20><><EFBFBD>ݾ<EFBFBD><DDBE><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD>
**/
void ADC1_IRQHandler(void)
{
if(LHL_ADC_GetPending(ADC_1, ADC_FLAG_RDY) == SET)
{
if(adc1_irq_callback != NULL) adc1_irq_callback();
}
}