- volatile float vbat = 0.0f; // 获取当前电池电量
- static void TIM1_TRGO_Init(void);
- static void ADC0_Init(void);
- //
- // @简介:对电池电压检测模块进行初始化
- //
- void App_Bat_init(void)
- {
- TIM1_TRGO_Init();
- ADC0_Init();
- }
- static void TIM1_TRGO_Init(void)
- {
- // #1. 初始化TIM1_TRGO,每10ms产生一个脉冲
- rcu_periph_clock_enable(RCU_TIMER1);
-
- timer_deinit(TIMER1);
-
- timer_parameter_struct timer_initpara;
-
- timer_initpara.prescaler = 71;
- timer_initpara.period = 9999;
- timer_initpara.counterdirection = TIMER_COUNTER_UP;
- timer_initpara.repetitioncounter = 0;
- timer_init(TIMER1, &timer_initpara);
-
- timer_auto_reload_shadow_enable(TIMER1);
- timer_master_slave_mode_config(TIMER1, TIMER_MASTER_SLAVE_MODE_ENABLE);
-
- // 选择主机模式为update模式
- timer_master_output_trigger_source_select(TIMER1, TIMER_TRI_OUT_SRC_UPDATE);
-
- // 闭合时基单元的开关
- timer_enable(TIMER1);
- }
- static void ADC0_Init(void)
- {
- // #1. 初始化PB0引脚,模拟模式
- rcu_periph_clock_enable(RCU_GPIOB);
- gpio_init(GPIOB, GPIO_MODE_AIN, GPIO_OSPEED_2MHZ, GPIO_PIN_0);
-
- // #2. 配置ADC模块的时钟
- rcu_periph_clock_enable(RCU_ADC0); // 使能ADC0的时钟
- rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV6); // 设置分频器的分频系数(6分频) 72 / 6 = 12
-
- // #3. 初始化ADC的基本参数
- adc_mode_config(ADC_MODE_FREE); // 只使用一个ADC,属于独立模式
- adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT); // 结果转换右对齐
- adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, DISABLE); // 关闭连续转换模式
- adc_special_function_config(ADC0, ADC_SCAN_MODE, DISABLE); // 关闭扫描模式
-
- adc_channel_length_config(ADC0, ADC_INSERTED_CHANNEL, 1);
- adc_external_trigger_source_config(ADC0, ADC_INSERTED_CHANNEL, ADC0_1_EXTTRIG_INSERTED_T1_TRGO);
- adc_external_trigger_config(ADC0, ADC_INSERTED_CHANNEL, ENABLE);
-
- adc_inserted_channel_config(ADC0, 0, ADC_CHANNEL_8, ADC_SAMPLETIME_1POINT5);
-
- adc_enable(ADC0);
- adc_calibration_enable(ADC0);
-
- adc_interrupt_enable(ADC0, ADC_INT_EOIC);
- nvic_irq_enable(ADC0_1_IRQn, 0, 0);
- }
- void ADC0_1_IRQHandler(void)
- {
- if (adc_interrupt_flag_get(ADC0, ADC_INT_FLAG_EOIC) == SET)
- {
- adc_interrupt_flag_clear(ADC0, ADC_INT_FLAG_EOIC);
-
- uint16_t jdr1 = adc_inserted_data_read(ADC0, ADC_INSERTED_CHANNEL_0);
- vbat = jdr1 / 4095.0f *3.3 * 8.4f / 3.3;
-
- printf("%.3f\n",vbat);
- }
-
- }
- int main()
- {
- nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);
-
- SysTickTimer2_Init();
-
- App_USART1_Init();
- App_Bat_init();
-
- while(1)
- {
- }
- }
改用软件触发后能正常工作的代码:
- volatile float vbat = 0.0f; // 获取当前电池电量
- static void TIM1_TRGO_Init(void);
- static void ADC0_Init(void);
- //
- // @简介:对电池电压检测模块进行初始化
- //
- void App_Bat_init(void)
- {
- ADC0_Init();
- }
- static void ADC0_Init(void)
- {
- // #1. 初始化PB0引脚,模拟模式
- rcu_periph_clock_enable(RCU_GPIOB);
- gpio_init(GPIOB, GPIO_MODE_AIN, GPIO_OSPEED_2MHZ, GPIO_PIN_0);
-
- // #2. 配置ADC模块的时钟
- rcu_periph_clock_enable(RCU_ADC0); // 使能ADC0的时钟
- rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV6); // 设置分频器的分频系数(6分频) 72 / 6 = 12
-
- // #3. 初始化ADC的基本参数
- adc_mode_config(ADC_MODE_FREE); // 只使用一个ADC,属于独立模式
- adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT); // 结果转换右对齐
- adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, DISABLE); // 关闭连续转换模式
- adc_special_function_config(ADC0, ADC_SCAN_MODE, DISABLE); // 关闭扫描模式
-
- adc_channel_length_config(ADC0, ADC_INSERTED_CHANNEL, 1);
- adc_external_trigger_source_config(ADC0, ADC_INSERTED_CHANNEL, ADC0_1_2_EXTTRIG_INSERTED_NONE);
- adc_external_trigger_config(ADC0, ADC_INSERTED_CHANNEL, ENABLE);
-
- adc_inserted_channel_config(ADC0, 0, ADC_CHANNEL_8, ADC_SAMPLETIME_1POINT5);
-
- adc_enable(ADC0);
- adc_calibration_enable(ADC0);
-
- adc_interrupt_enable(ADC0, ADC_INT_EOIC);
- nvic_irq_enable(ADC0_1_IRQn, 0, 0);
- }
- void ADC0_1_IRQHandler(void)
- {
- if (adc_interrupt_flag_get(ADC0, ADC_INT_FLAG_EOIC) == SET)
- {
- adc_interrupt_flag_clear(ADC0, ADC_INT_FLAG_EOIC);
-
- uint16_t jdr1 = adc_inserted_data_read(ADC0, ADC_INSERTED_CHANNEL_0);
- vbat = jdr1 / 4095.0f *3.3 * 8.4f / 3.3;
-
- printf("%.3f\n",vbat);
- }
-
- }
- int main()
- {
- nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);
-
- SysTickTimer2_Init();
-
- App_USART1_Init();
- App_Bat_init();
-
- while(1)
- {
- uint32_t now = GetTick(); // 获取系统当前时间 毫秒级
- if (now - last_time > 10) // 10毫秒触发一次
- {
- last_time = now;
- adc_software_trigger_enable(ADC0, ADC_INSERTED_CHANNEL); // 通过软件启动的方式发送脉冲
- }
- }
- }
- 方库文件gd32f10x_adc.c,确认 ADC0 的注入通道支持 TIM1_TRGO 作为触发源(ADC0_1_EXTTRIG_INSERTED_T1_TRGO)。
- 软件触发工作正常,说明 ADC 的基本配置、通道选择、中断配置应该是正确的。
- TIM1 的配置看起来正确,应该能产生 TRGO 信号。
请问各位,可能是什么原因导致外部触发无法工作呢?是否有什么配置细节我忽略了?
感谢大家的帮助!