adc dma采集

This commit is contained in:
DESKTOP-2E6P1Q6\Administrator 2025-09-23 18:07:24 +08:00
parent 4ca82f2c6c
commit 9ed0bb00be
6 changed files with 57 additions and 78 deletions

View File

@ -357,12 +357,9 @@
<state>$PROJ_DIR$\..\rtthread</state>
<state>$PROJ_DIR$\..\rtthread\include\libc</state>
<state>$PROJ_DIR$\..\rtthread\include</state>
<state>D:\newPtz\drivers</state>
<state>D:\newPtz\drivers\mb85rc64</state>
<state>D:\newPtz\drivers\tmp75</state>
<state>C:\Users\Admin\Documents\newPtz\drivers</state>
<state>C:\Users\Admin\Documents\newPtz\drivers\mb85rc64</state>
<state>C:\Users\Admin\Documents\newPtz\drivers\tmp75</state>
<state>C:\Users\Administrator\Documents\newPtz\drivers\mb85rc64</state>
<state>C:\Users\Administrator\Documents\newPtz\drivers\tmp75</state>
<state>C:\Users\Administrator\Documents\newPtz\drivers</state>
</option>
<option>
<name>CCStdIncCheck</name>
@ -775,11 +772,11 @@
</option>
<option>
<name>IlinkIcfOverride</name>
<state>0</state>
<state>1</state>
</option>
<option>
<name>IlinkIcfFile</name>
<state>$TOOLKIT_DIR$/config/linker/GigaDevice/GD32F470xE.icf</state>
<state>C:\Users\Administrator\Documents\newPtz\EWARM\iar\GD32F450xE.icf</state>
</option>
<option>
<name>IlinkIcfFileSlave</name>

View File

@ -761,10 +761,10 @@ void dma_flag_clear(uint32_t dma_periph, dma_channel_enum channelx, uint32_t fla
\retval none
*/
void dma_interrupt_enable(uint32_t dma_periph, dma_channel_enum channelx, uint32_t source)
{
if(DMA_CHXFCTL_FEEIE != source) {
{//DMA_CHXFCTL_FEEIE 7
if(DMA_CHXFCTL_FEEIE != source) {//不是7
DMA_CHCTL(dma_periph, channelx) |= source;
} else {
} else {//是7
DMA_CHFCTL(dma_periph, channelx) |= source;
}
}

View File

@ -46,9 +46,6 @@ float current;
float current_origin;
char tiedian_id[3]={0};
#ifdef MDAX
uint32_t ctl_data = 0;
#endif
uint32_t primask;
@ -56,9 +53,6 @@ uint16_t tmp_value = 0;
extern uint16_t USER_ADC_DMA_DATA_BUFF;//bsp_adc.c中定义的ADC数据接收数组
uint8_t g_ADCDataReady=0;//DMA传输完成ADC数据标志位
typedef struct _MB85TEST_
{
char ttt;
@ -113,42 +107,27 @@ int main(void)
// 进入主循环或启动其他任务
while (1)
{
#ifdef DMAX
ctl_data = DMA_CHCTL(DMAX, USER_DMA_ADC_CHANNEL);
if (ctl_data == 33762576)
{
// dma_channel_enable (DMA1, USER_DMA_ADC_CHANNEL);
ttest.status = 5;
}
else if (ctl_data == 33762577)
{
ttest.status = 4;
#ifdef ADC_MODE_3
for(uint8_t i=0; i<CHANNEL_LENGTH; i++)
{
tmp_value = BSP_ADCDataAcquire(i);
if (i == 0)
{
voltage = tmp_value/ 4095.0 * 3.3;
}
else
{
current = tmp_value/ 4095.0 * 3.3;
}
}
__asm volatile("mrs %0, primask" : "=r"(primask));
if(SET == g_ADCDataReady)
{
g_ADCDataReady = RESET;
for(uint8_t i=0; i<CHANNEL_LENGTH; i++)
{
tmp_value = BSP_ADCDataAcquire(i);
if (i == 0)
{
voltage = tmp_value/ 4095.0 * 3.3;
}
else
{
current = tmp_value/ 4095.0 * 3.3;
}
}
}
rt_thread_mdelay(250);
#endif
#ifndef ADC_MODE_2
#if (defined ADC_MODE_0) || (defined ADC_MODE_1)
voltage = ptz_Voltage_collect_adc1_task();
rt_thread_mdelay(500);
@ -210,7 +189,7 @@ void DMA1_Channel0_IRQHandler(void)
#endif
//下次移到drv_adc.c文件里
#ifdef ADCX_IRQn
void ADC_IRQHandler()
{

BIN
doc/~$dma ctl参数.xlsx Normal file

Binary file not shown.

View File

@ -15,9 +15,10 @@
#ifdef DMAX
/*全局声明区*/
uint16_t USER_ADC_DMA_DATA_BUFF[16] = {0};
uint32_t ctl = 0;
#endif
bool filter_v_flag = 0;//滤波开启标志位,全局改变一次
@ -43,20 +44,6 @@ void adc_init(void)
adc_interrupt_int();
#endif
#ifdef DMAX
ctl = DMA_CHCTL(DMAX, USER_DMA_ADC_CHANNEL);
if (ctl == 33762576)
{
// dma_channel_enable (DMA1, USER_DMA_ADC_CHANNEL);
// ttest.status = 5;
dma_channel_enable (DMA1, USER_DMA_ADC_CHANNEL);// enable DMA channel
}
else if (ctl == 33762577)
{
// ttest.status = 4;
}
#endif
}
/* 时钟+GPIO */
void adc_rcu_config(void)
@ -100,20 +87,20 @@ void adc_dma_config(void)
dma_single_data_parameter.direction = DMA_PERIPH_TO_MEMORY; //ADC外设到RAM全局变量 DMA外设到内存模式开启
dma_single_data_parameter.number = CHANNEL_LENGTH; //宏决定传输个数
dma_single_data_parameter.priority = DMA_PRIORITY_ULTRA_HIGH; //优先级设为超高,可改用宏
dma_single_data_mode_init (DMA1, USER_DMA_ADC_CHANNEL, &dma_single_data_parameter);
dma_single_data_mode_init (DMAX, USER_DMA_ADC_CHANNEL, &dma_single_data_parameter);
/* 配置 dma 子连接 */
dma_channel_subperipheral_select (DMA1, USER_DMA_ADC_CHANNEL, USER_DMA_ADC_SUBPERI);
dma_channel_subperipheral_select (DMAX, USER_DMA_ADC_CHANNEL, USER_DMA_ADC_SUBPERI);
/* enable DMA circulation mode */
dma_circulation_enable (DMA1, USER_DMA_ADC_CHANNEL);// 开启循环模式
dma_circulation_enable (DMAX, USER_DMA_ADC_CHANNEL);// 开启循环模式
/* enable DMA it */
dma_interrupt_enable (DMA1,USER_DMA_ADC_CHANNEL,DMA_INT_FTF);//DMA传输完成标志位 打开全部完成中断
dma_interrupt_enable (DMA1,USER_DMA_ADC_CHANNEL,DMA_INT_TAE);
dma_interrupt_enable (DMA1,USER_DMA_ADC_CHANNEL,DMA_INT_FEE);
dma_interrupt_enable (DMAX,USER_DMA_ADC_CHANNEL,DMA_INT_FTF);//DMA传输完成标志位 打开全部完成中断 4
// dma_interrupt_enable (DMAX,USER_DMA_ADC_CHANNEL,DMA_INT_TAE);//传输错误中断使能位 2
// dma_interrupt_enable (DMAX,USER_DMA_ADC_CHANNEL,DMA_INT_FEE);// 7
nvic_irq_enable (DMA_ADC_IRQn, DMA_ADC_PRIORITY_PRE, DMA_ADC_PRIORITY_SUB);
dma_channel_enable (DMA1, USER_DMA_ADC_CHANNEL);// enable DMA channel
dma_channel_enable (DMAX, USER_DMA_ADC_CHANNEL);// enable DMA channel
}
@ -163,7 +150,10 @@ void adc_config(void)
adc_inserted_channel_config (ADCX, 0, VOLTAGE_ADC_CHANNEL, ADC_SAMPLETIME_480);//电压
adc_inserted_channel_config (ADCX, 1, CURRENT_ADC_CHANNEL, ADC_SAMPLETIME_480);//电流
}
#ifdef DMAX
adc_routine_channel_config(ADCX, 0, VOLTAGE_ADC_CHANNEL, ADC_SAMPLETIME_480);
adc_routine_channel_config(ADCX, 1, CURRENT_ADC_CHANNEL, ADC_SAMPLETIME_480);
#endif
/* 使能外部触发:这里使用软件触发,所以先禁用硬件触发 */
// adc_external_trigger_source_config(ADCX, SEQUENCE_CHANNEL, ADC_EXTTRIG_ROUTINE_T0_CH0);

View File

@ -24,9 +24,10 @@
#define LB_I_DEL 2 //电流滤波最高最低各删除个数
#define LB_T_DEL 1 //温度滤波最高最低各删除个数
#define ADC_MODE_0 //规则组、单次转换、非扫描
// #define ADC_MODE_0 //规则组、单次转换、非扫描
// #define ADC_MODE_1 //注入组、单次转换、扫描、转换结束标志位采集
// #define ADC_MODE_2 //注入组、单次转换、扫描、中断转换结束标志位采集
#define ADC_MODE_3 //规则组、连续转换、扫描、DMA采集
/*
adc模式配置参数
@ -34,36 +35,47 @@ adc模式配置参数
DISABLE
*/
#ifdef ADC_MODE_0
#define CONTINUOUS_STATUS DISABLE // 是否开启连续转换
#define SEQUENCE_CHANNEL ADC_ROUTINE_CHANNEL // 规则组
// #define SEQUENCE_CHANNEL ADC_INSERTED_CHANNEL // 注入组
#define SCAN_STATUS DISABLE // 是否开启扫描模式
#define CHANNEL_LENGTH 1 // 通道数量:1~16
#endif
#ifdef ADC_MODE_1
#define CONTINUOUS_STATUS DISABLE // 是否开启连续转换
// #define SEQUENCE_CHANNEL ADC_ROUTINE_CHANNEL // 规则组
#define SEQUENCE_CHANNEL ADC_INSERTED_CHANNEL // 注入组
#define SCAN_STATUS ENABLE // 是否开启扫描模式
#define CHANNEL_LENGTH 2 // 通道数量:1~16
#endif
#ifdef ADC_MODE_2
#define CONTINUOUS_STATUS DISABLE // 是否开启连续转换
// #define SEQUENCE_CHANNEL ADC_ROUTINE_CHANNEL // 规则组
#define CONTINUOUS_STATUS DISABLE // 不开启连续转换
#define SEQUENCE_CHANNEL ADC_INSERTED_CHANNEL // 注入组
#define SCAN_STATUS ENABLE // 是否开启扫描模式
#define CHANNEL_LENGTH 2 // 通道数量:1~16
#define ADCX_IRQn ADC_IRQn
#endif
#ifdef ADC_MODE_3
#define CONTINUOUS_STATUS ENABLE // 开启连续转换
#define SEQUENCE_CHANNEL ADC_ROUTINE_CHANNEL // 规则组
#define SCAN_STATUS ENABLE // 是否开启扫描模式
#define CHANNEL_LENGTH 2 // 通道数量:1~16
#define DMAX DMA1
#endif
/* adc dma */
// #define DMAX DMA1
#ifdef DMAX
#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
@ -102,6 +114,7 @@ void adc_interrupt_int(void);
#ifdef DMAX
void adc_dma_config(void);
__weak void DMA1_Channel0_IRQHandler(void);
uint16_t BSP_ADCDataAcquire(uint8_t _index);
#endif
#endif