/**
 * @brief ADC-软件触发
 * @details
 * 1. 初始化ADC0以采样指定的通道（通道9）。
 * 2. 在主循环中，进行100次ADC采样，并计算采样结果的平均值。
 * 3. 将平均值转换为实际电压值
 */

#include "lks32mc09x_adc.h"
#include "lks32mc09x_gpio.h"

#define ADC_SAMPLE_COUNT 1024
volatile float average = 0;
volatile s16 ADCSample[ADC_SAMPLE_COUNT];
volatile int flg;
volatile int adcval;
/**
 * @brief 初始化ADC0
 */
void ADC0_Init(void)
{
    ADC_InitTypeDef ADC_InitStruct;

    // 复位ADC0模块
    // Adc_Reset(ADC0);

    // 初始化ADC结构体
    ADC_StructInit(&ADC_InitStruct);

    // 配置ADC参数
    ADC_InitStruct.IE = 0;               // 禁用中断
    ADC_InitStruct.RE = 0;               // 禁用DMA请求
    ADC_InitStruct.NSMP = 0;             // 禁用两段采样
    ADC_InitStruct.DATA_ALIGN = 0;       // 右对齐
    ADC_InitStruct.CSMP = 0;             // 禁用连续采样
    ADC_InitStruct.TCNT = 0;             // 触发一次采样
    ADC_InitStruct.TROVS = 0;            // 禁用过采样
    ADC_InitStruct.OVSR = 0;             // 过采样率
    ADC_InitStruct.TRIG = ADC_TRIG_SOFT; // 软件触发
    ADC_InitStruct.S1 = 1;               // 触发1次采样1次
    ADC_InitStruct.S2 = 0;               // 第二段常规采样次数
    ADC_InitStruct.IS1 = 0;              // 空闲采样次数
    ADC_InitStruct.GAIN = ADC_GAIN_3V6;  // 3.6V量程
    ADC_InitStruct.LTH = 0;              // 禁用模拟看门狗
    ADC_InitStruct.HTH = 0xFFFF;         // 禁用模拟看门狗
    ADC_InitStruct.GEN = 0;              // 禁用模拟看门狗

    // 初始化ADC0
    ADC_Init(ADC0, &ADC_InitStruct);
    // 设置ADC0通道9
    ADC_SetChn(ADC0, ADC_DAT_0, ADC_CHN_11);
}
/**
 * @brief 主函数
 */
int main(void)
{
    uint32_t i;
    int32_t sum = 0;

    GPIO_Config(GPIO0, 0, GPIO_Mode_OUT, GPIO_AF_GPIO);
    // 初始化ADC0
    ADC0_Init();
    flg = 0;

    SYS_WR_PROTECT = 0x7a83;
    SYS_AFE_REG0 &= ~BIT15;
    while (1)
    {
        if (flg)
        {
            GPIO_SetBits(GPIO0, GPIO_Pin_0);
            // 进行100次采样
            for (i = 0; i < ADC_SAMPLE_COUNT; i++)
            {
                ADC_ClearIRQFlag(ADC0, ADC_IF_SF1);
                // 软件触发ADC采样
                ADC_SoftTrig(ADC0);
                while (ADC_GetIRQFlag(ADC0, ADC_IF_SF1) == 0)
                    ;
                // 获取采样结果
                ADCSample[i] = ADC_GetConversionValue(ADC0, ADC_DAT_0);
            }
            // 重置总和，为下一次采样做准备
            sum = 0;
            // 计算采样结果的总和
            for (i = 0; i < ADC_SAMPLE_COUNT; i++)
            {
                sum += (int32_t)ADCSample[i];
            }

            adcval = sum / ADC_SAMPLE_COUNT;
            // 计算平均值
            average = (float)sum * ((3.6f / 32752.0f) / ADC_SAMPLE_COUNT);
            GPIO_ResetBits(GPIO0, GPIO_Pin_0);
            flg = 0;
        }
    }
}
