问答

汇集网友智慧,解决技术难题

21ic问答首页 - ADC初始化不正常,使能ADC之后程序无法往下执行

配置问题 定时器 定时 ADC 单片机 嵌入式

ADC初始化不正常,使能ADC之后程序无法往下执行

moonsea2025-08-06
芯片是CIU32F003x5系列,就是我断点调试执行到这std_adc_enable(),程序无法执行下去,其他使能的外设都不能正常工作,就是卡在ADC使能这一步,然后导致后面定时器等开启无法执行到使能定时器这步。(不知道是配置问题还是先后初始化的问题)
回答 +关注 0
242人浏览 4人回答问题 分享 举报
4 个回答
  • 本帖最后由 dffzh 于 2025-8-7 09:44 编辑

    1、你可以参考一下固件库里这个类似的例程:

    2、std_adc_enable()函数就是配置寄存器来使能ADC功能,本身不会造成影响;
    3、把ADC采集方式由定时器触发改成软件触发后,运行程序是什么效果?
  • 硬件的问题吧。
  • 软件看不懂,没法回答
  • 主要的初始化流程就是这些/*这是我初始化流程*/int main(void)
    {               
                    unsigned char DZCount=0;       
           
                    //PowerOnDelay();
                    system_clock_config();
                    //LEDConfiguration();
                    gpio_init();
                    tim1_init();
                    tim3_init();
                      SysTick_Config((SystemCoreClock) / 100);

                    adc_init();
                    bsp_adc_software_calibrate();
                    nvic_init();
                    Peripheral_cmd();
                      I2C_Slave_Init();
                      event_init();

    /*这是我定时器的配置*/
    void tim1_init(void)
    {
                    std_tim_basic_init_t basic_init = {0};   
                    std_tim_output_compare_init_t output_init = {0};
                    std_tim_break_init_t break_config = {0};

                    /* TIM1时钟使能 */
                    std_rcc_apb2_clk_enable(RCC_PERIPH_CLK_TIM1);
                   
                    PWM_AL_ON;
                    PWM_BL_ON;
                    PWM_CL_ON;

                    /* 初始化基本定时器参数(对应ATIM_InitStruct配置) */
                   basic_init.prescaler = 0;                          // 预分频=0
                   basic_init.counter_mode = TIM_COUNTER_MODE_UP;      // 向上计数
                   basic_init.period = PWM_PERIOD - 1;                 // 自动重装载值
                   basic_init.clock_div = TIM_CLOCK_DTS_DIV1;          // 时钟不分频
                   basic_init.repeat_counter = 0;                      // 重复计数器=0
                   std_tim_init(TIM1, &basic_init);
                   
           
                   
                   /* 配置输出比较模式(对应ATIM_OCInitStruct配置) */
                   output_init.output_compare_mode = TIM_OUTPUT_MODE_PWM1;  // PWM模式1
                   output_init.output_state = TIM_OUTPUT_ENABLE;            // 主输出使能
                   output_init.output_negtive_state = TIM_OUTPUT_NEGTIVE_DISABLE;  // 禁用互补输出
                   output_init.pulse = 0;                                   // 初始占空比=0(后续通过SetCompare更新)
                   output_init.output_pol = TIM_OUTPUT_POL_HIGH;             // 非反相输出
                   output_init.output_negtive_pol = TIM_OUTPUT_NEGTIVE_POL_HIGH;  // 互补输出极性(未使用,默认高)
                   output_init.output_idle_state = TIM_OUTPUT_IDLE_RESET;    // 空闲状态复位
                   output_init.output_negtive_idle_state = TIM_OUTPUT_NEGTIVE_IDLE_RESET;  

                  /* 初始化通道1~4(对应原代码ATIM_OC1~4Init) */
                  std_tim_output_compare_init(TIM1, &output_init, TIM_CHANNEL_1);  // 通道1(上桥臂A相)
                  std_tim_output_compare_init(TIM1, &output_init, TIM_CHANNEL_2);  // 通道2(上桥臂B相)
                  std_tim_output_compare_init(TIM1, &output_init, TIM_CHANNEL_3);  // 通道3(上桥臂C相)
                  std_tim_output_compare_init(TIM1, &output_init, TIM_CHANNEL_4);  // 通道4(用于触发ADC)

                /* 设置初始比较值(对应原代码ATIM_SetCompare1~4) */
                std_tim_set_ccx_value(TIM1, TIM_CHANNEL_1, 0);               // 通道1初始占空比0
                std_tim_set_ccx_value(TIM1, TIM_CHANNEL_2, 0);               // 通道2初始占空比0
                std_tim_set_ccx_value(TIM1, TIM_CHANNEL_3, 0);               // 通道3初始占空比0
                std_tim_set_ccx_value(TIM1, TIM_CHANNEL_4, PWM_PERIOD / 2);   // 通道4比较值=周期的1/2(触发ADC)

                /* 配置断路功能(对应原代码未显式配置的安全功能,保持最小配置) */
               break_config.off_state_run_mode = TIM_OSSR_DISABLE;    // 运行模式关闭状态禁用
               break_config.off_state_idle_mode = TIM_OSSI_DISABLE;   // 空闲模式关闭状态禁用
               break_config.dead_time = 0;                            // 死区时间=0
               break_config.break_state = TIM_BREAK_DISABLE;          // 禁用断路功能
               break_config.lock_level = TIM_LOCK_LEVEL_OFF;          // 无锁定级别
               std_tim_bdt_init(TIM1, &break_config);
                   
               std_tim_trigout_mode_config(TIM1, TIM_TRIG_OUT_OC4REF);
               std_tim_moen_enable(TIM1);
               std_tim_master_mode_enable(TIM1);
    }
    /*这是ADC的初始化*/
    void adc_init(void)
    {

               /* 使能ADC时钟 */
               std_rcc_apb2_clk_enable(RCC_PERIPH_CLK_ADC);

              /* ADC_CK时钟为PLCK的三分频 */
              std_adc_clock_config(ADC_CK_DIV3);

              //这里更改为定时器触发
               //std_adc_trig_sw();
              std_adc_trig_config(ADC_TRIG_HW_EDGE_RISING,ADC_EXTRIG_TIM1_OC4_ADC);

              /* 单次采样模式 */
              std_adc_conversion_mode_config(ADC_SINGLE_CONVER_MODE);

             /* 采样时间配置,119周期*/
             std_adc_sampt_time_config(ADC_SAMPTIME_3CYCLES);

            /* 选择通道 */
            std_adc_fix_sequence_channel_enable(ADC_CHANNEL_1);  // 使能AIN1(PA3)- 相电压
            std_adc_fix_sequence_channel_enable(ADC_CHANNEL_3);  // 使能AIN3(PA6)- 相电压
            std_adc_fix_sequence_channel_enable(ADC_CHANNEL_4);  // 使能AIN4(PA7)- 相电压
            std_adc_fix_sequence_channel_enable(ADC_CHANNEL_5);  // 使能AIN5(PB3)- 母线电压
            std_adc_fix_sequence_channel_enable(ADC_CHANNEL_7);  // 使能AIN7(PB0)- 电池电压

             /* 配置Wait模式,避免数据未及时读取,转换溢出 */
            std_adc_wait_mode_enable();
            /* 使能ADC */
            std_adc_enable();
            /* 等待ADC使能状态稳定 */
            std_delayus(ADC_EN_DELAY);       

            std_adc_interrupt_enable(ADC_INTERRUPT_EOC);
            std_adc_interrupt_enable(ADC_INTERRUPT_EOS);  // 序列完成中断
    }

    /*NVIC配置 */
    void nvic_init(void)
    {
             /* 配置SysTick中断优先级*/
             NVIC_SetPriority(SysTick_IRQn, NVIC_PRIO_0);
             NVIC_EnableIRQ(SysTick_IRQn);
           
             /* 配置TIM1中断使能*/
             NVIC_SetPriority(TIM1_CC_IRQn, NVIC_PRIO_1);
             NVIC_EnableIRQ(TIM1_CC_IRQn);
           
            /* ADC的NVIC初始化*/
            NVIC_SetPriority(ADC_COMP_IRQn, NVIC_PRIO_2);
            NVIC_EnableIRQ(ADC_COMP_IRQn);
                   
            /* 配置TIM3中断 */
           NVIC_SetPriority(TIM3_IRQn, NVIC_PRIO_2);  
           NVIC_EnableIRQ(TIM3_IRQn);                                
    }

    /*然后是定时器TIM1使能*/
    void Peripheral_cmd(void)
    {
           
                    /* TIM1使能PWM输出和定时器计数 */
                    //std_tim_trigout_mode_config(TIM1, TIM_TRIG_OUT_OC4REF);
                    //std_tim_moen_enable(TIM1);
                    //std_tim_master_mode_enable(TIM1);
                    std_tim_interrupt_enable(TIM1, TIM_FLAG_CC4);
                    std_tim_enable(TIM1);               
    }


您需要登录后才可以回复 登录 | 注册