From 28f07b11832509a9f570c22746c037b2aa54831d Mon Sep 17 00:00:00 2001 From: dufresne <1625800082@qq.com> Date: Thu, 18 Sep 2025 14:28:40 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=A0=E5=85=A5=E6=B3=A8=E5=85=A5=E7=BB=84?= =?UTF-8?q?=E4=B8=AD=E6=96=AD=E9=87=87=E9=9B=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- applications/main/main.c | 32 +++++++++++++++++++++++--------- drivers/drv_adc.c | 9 ++++++++- drivers/drv_adc.h | 14 +++++++++++--- 3 files changed, 42 insertions(+), 13 deletions(-) diff --git a/applications/main/main.c b/applications/main/main.c index 0e9111d..2d51c2c 100644 --- a/applications/main/main.c +++ b/applications/main/main.c @@ -149,11 +149,13 @@ int main(void) rt_thread_mdelay(250); #endif - voltage = ptz_Voltage_collect_adc1_task(); - rt_thread_mdelay(500); + // voltage = ptz_Voltage_collect_adc1_task(); + // rt_thread_mdelay(500); - current = ptz_Current_collect_adc1_task(); - rt_thread_mdelay(500); + // current = ptz_Current_collect_adc1_task(); + // rt_thread_mdelay(500); + + adc_software_trigger_enable(ADCX, SEQUENCE_CHANNEL);// 软件触发使能 后续接读取 //测试mb铁电读写 read_mb_id((uint8_t*)&tiedian_id);//读取铁电ID @@ -181,27 +183,39 @@ int main(void) void DMA1_Channel0_IRQHandler(void) { if(dma_interrupt_flag_get(DMA1, USER_DMA_ADC_CHANNEL, DMA_INT_FLAG_FTF)) { - dma_interrupt_flag_clear(DMA1, USER_DMA_ADC_CHANNEL, DMA_INT_FLAG_FTF); ttest.status = 1; + dma_interrupt_flag_clear(DMA1, USER_DMA_ADC_CHANNEL, DMA_INT_FLAG_FTF); // 处理传输完成 } if(dma_interrupt_flag_get(DMA1, USER_DMA_ADC_CHANNEL, DMA_INT_FLAG_HTF)) { - dma_interrupt_flag_clear(DMA1, USER_DMA_ADC_CHANNEL, DMA_INT_FLAG_HTF); ttest.status = 2; + dma_interrupt_flag_clear(DMA1, USER_DMA_ADC_CHANNEL, DMA_INT_FLAG_HTF); // 处理半传输完成(如果使能了) } if(dma_interrupt_flag_get(DMA1, USER_DMA_ADC_CHANNEL, DMA_INT_FLAG_FEE)) { - dma_interrupt_flag_clear(DMA1, USER_DMA_ADC_CHANNEL, DMA_INT_FLAG_FEE); ttest.status = 3; + dma_interrupt_flag_clear(DMA1, USER_DMA_ADC_CHANNEL, DMA_INT_FLAG_FEE); // 处理错误 } if(dma_interrupt_flag_get(DMA1, USER_DMA_ADC_CHANNEL, DMA_INT_FLAG_TAE)) { - dma_interrupt_flag_clear(DMA1, USER_DMA_ADC_CHANNEL, DMA_INT_FLAG_TAE); ttest.status = 6; + dma_interrupt_flag_clear(DMA1, USER_DMA_ADC_CHANNEL, DMA_INT_FLAG_TAE); // 处理错误 } } -#endif \ No newline at end of file +#endif + +void ADC_IRQHandler() +{ + if(adc_interrupt_flag_get(ADCX, ADC_INT_FLAG_EOC)) { + voltage = adc_inserted_data_read(ADCX, ADC_INSERTED_CHANNEL_0); // 读取注入组数据寄存器 + voltage = voltage / 4095.0 * 3.3; + current = adc_inserted_data_read(ADCX, ADC_INSERTED_CHANNEL_1); // 读取注入组数据寄存器 + current = ((current / 4095.0 * 3.3) - 3.3 / 2) / 0.132; + adc_interrupt_flag_clear(ADCX, ADC_INT_FLAG_EOC); + // 处理传输完成 + } +} \ No newline at end of file diff --git a/drivers/drv_adc.c b/drivers/drv_adc.c index 3490fa2..7136e76 100644 --- a/drivers/drv_adc.c +++ b/drivers/drv_adc.c @@ -30,7 +30,7 @@ void adc_init(void) #endif adc_config(); - + adc_interrupt_int(); #ifdef DMAX ctl = DMA_CHCTL(DMAX, USER_DMA_ADC_CHANNEL); if (ctl == 33762576) @@ -171,6 +171,13 @@ void adc_config(void) #endif } +void adc_interrupt_int(void) +{ + adc_interrupt_enable (ADCX, ADC_INT_EOC); + nvic_irq_enable (ADCX_IRQn, ADCX_PRIORITY_PRE, ADCX_PRIORITY_SUB); + +} + /* ---------------------------------------------------------------------------------------------------------------- */ // adc电压采集 diff --git a/drivers/drv_adc.h b/drivers/drv_adc.h index 82533ea..10c04cd 100644 --- a/drivers/drv_adc.h +++ b/drivers/drv_adc.h @@ -39,7 +39,7 @@ adc模式配置参数 // #define DMAX DMA1 #ifdef DMAX -#define DMA_STATUS DISABLE // 是否开启dma +#define DMA_STATUS DISABLE // 是否开启dma *后续把这个定义改到#ifdef里* #define USER_DMA_ADC_CHANNEL DMA_CH3 //DMA通道:ADC0:DMA_CH0 DMA_CH4 // ADC1:DMA_CH2 DMA_CH3 // ADC2:DMA_CH0 DMA_CH3 @@ -56,16 +56,24 @@ adc模式配置参数 #endif +#define ADCX_IRQn ADC_IRQn +#define ADCX_PRIORITY_PRE 2U //抢占优先级 +#define ADCX_PRIORITY_SUB 0U //子优先级 + + void adc_init(void); void adc_rcu_config(void); void adc_gpio_config(void); -void adc_dma_config(void); void adc_config(void); +void adc_interrupt_int(void); float ptz_Voltage_collect_adc1_task(); float ptz_Current_collect_adc1_task(); float ptz_temperature_collect_tmp75_task(); -__weak void DMA1_Channel0_IRQHandler(void); +#ifdef DMAX +void adc_dma_config(void); +__weak void DMA1_Channel0_IRQHandler(void); +#endif #endif