|
先简述一下我的情况:我是用TIM3来同步触发ADC1和ADC3,这个同步采样没啥问题。假如一开始ADC1采样正弦波,ADC3采样方波(波形由外部的信号发生器调整),按下一次按键后,在串口中打印出他们采样的数据波形。现在,上电,按下按键,串口正常打印出了ADC1的正弦波和ADC3的方波;改变ADC1采样的波形为方波,ADC3不变,按下按键,这时候问题来了,打印出来的ADC1采样的波形还是正弦波,ADC3是方波,再按下一次按键后,打印出的数据才是正常的。就是这个问题,搞了两三天没啥头脑,是DMA的问题吗?大佬帮忙看一下问题
以下是我的CubeMX中的配置和软件中的代码(ADC1和ADC3的配置是一样的):
#include "main.h"
#include "adc.h"
#include "dac.h"
#include "dma.h"
#include "memorymap.h"
#include "spi.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"
#include "fmc.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
//----------- ADC -----------//
__attribute__((section (".RAM_SDRAM"))) ADC_DMASamplingConfig ADC_Channels[2]; /* 定义包含 ADC1_CH3 和 ADC3_CH3 的数组 */
//----------- FFT -----------//
__attribute__((section (".RAM_SDRAM"))) SP_UnlimitedFFTData infinite_fft_s[2];
SP_FFTPeakInfo fft_Peak_Data[2];
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
void PeriphCommonClock_Config(void);
static void MPU_Config(void);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
if(hadc->Instance == ADC1){
// HAL_ADC_Stop_DMA(&hadc1); /* 停止DMA以防止数据覆盖 */
ADC_Channels[0].ADC_ConvEnd_Flag = 1; /* ADC采集DMA搬运结束标志位置一 */
}
if(hadc->Instance == ADC3){
// HAL_ADC_Stop_DMA(&hadc3); /* 停止DMA以防止数据覆盖 */
ADC_Channels[1].ADC_ConvEnd_Flag = 1; /* ADC采集DMA搬运结束标志位置一 */
}
}
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MPU Configuration--------------------------------------------------------*/
MPU_Config();
/* Enable the CPU Cache */
/* Enable I-Cache---------------------------------------------------------*/
SCB_EnableICache();
/* Enable D-Cache---------------------------------------------------------*/
SCB_EnableDCache();
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
delay_init(400); /* 延时函数初始化 主频:400MHz */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* Configure the peripherals common clocks */
PeriphCommonClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_USART1_UART_Init();
MX_TIM6_Init();
MX_USART2_UART_Init();
MX_DAC1_Init();
MX_ADC1_Init();
MX_TIM3_Init();
MX_TIM7_Init();
MX_SPI4_Init();
MX_ADC3_Init();
MX_FMC_Init();
/* USER CODE BEGIN 2 */
//------------
// LED
//------------
LED0_TOGGLE();
//------------------------------------------------------
// TFTLCD
//------------------------------------------------------
lcd_init();
#if PICTURE_USE_FLAG
lcd_show_pieture(0,160,480,480,(uint16_t *)gImage_Test);
lcd_show_pieture(45,64,64,64,(uint16_t *)gImage_tong);
lcd_show_pieture(154,64,64,64,(uint16_t *)gImage_xin);
lcd_show_pieture(263,64,64,64,(uint16_t *)gImage_dian);
lcd_show_pieture(372,64,64,64,(uint16_t *)gImage_zi);
#endif
//---------------------------------------------------------------------------------------------
// 设置采样率
//---------------------------------------------------------------------------------------------
ADC_Channels[0].SamplingRate = Set_SamplingRate(&htim3,200000000,163840); /* 必须要在定时器启动前进行设置!*/
ADC_Channels[1].SamplingRate = ADC_Channels[0].SamplingRate;
//---------------------------------------------------------------------------------------------
// ADC-DMA 启动
//---------------------------------------------------------------------------------------------
HAL_ADCEx_Calibration_Start(&hadc1, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED); /* ADC 校准 */
HAL_ADCEx_Calibration_Start(&hadc3, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED); /* ADC 校准 */
delay_ms(50); /* 给ADC时间校准 */
HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&ADC_Channels[0].DMA_Buffer, ADC_DMA_SAMPLE_LENGTH * sizeof(uint16_t)); /* 启动DMA转换ADC_DMA_SAMPLE_LENGTH次,完成后回调callback */
HAL_ADC_Start_DMA(&hadc3,(uint32_t*)&ADC_Channels[1].DMA_Buffer, ADC_DMA_SAMPLE_LENGTH * sizeof(uint16_t)); /* 启动DMA转换ADC_DMA_SAMPLE_LENGTH次,完成后回调callback */
HAL_TIM_Base_Start(&htim3); /* 启动定时器3 */
//---------------------------------------------------------------------------------------------
// 打印初始化信息
//---------------------------------------------------------------------------------------------
Set_Current_USART(USART1_IDX);
printf("\r\n\r\n");
printf("STM32H743ADC最高采样频率:1.8MHz\r\n");
printf("采样100kHz及以上频率信号时,串口波特率以及采样保持时间也会影响采样到的波形完整性\r\n");
printf("对实时采样来说,信号频率越高时采样频率也要越高,采样频率越高则采样保持时间也要越大(不一定)\r\n");
printf("并且采样保持时间建议在1.5T/2.5T/8.5T之间选择,越大则也会影响采样精度\r\n");
printf("ADC的转换过程包括采样阶段和转换阶段,接近极限采样率时,输入信号的电压在短时间内可能无法稳定下来,从而造成不准确的采样结果\r\n");
printf("STM32的ADC具有较高的输入阻抗,但采样频率过高时,电容的充电时间可能无法跟上输入信号的变化,从而影响采样的准确性\r\n");
printf("故当输入信号频率较高时,最好采用等效采样的方法或使用AD模块\r\n");
printf("APB1 Timer时钟频率:%d Hz\r\n",HAL_RCC_GetPCLK1Freq()*2);
printf("采样率:%d Hz\r\n\r\n",ADC_Channels[0].SamplingRate);
printf("现在有两个FFT运算工程:1、DSP库实现FFT(myfft.c) 2、重新实现不限制点数FFT(fft.c)\r\n");
printf("一、DSP库实现FFT(myfft.c):\r\n");
printf("使用的是DSP库来实现FFT,所提供的运算点数有:256、512、1024、2048、4096,最低只能256个点,最高只能4096个点\r\n");
printf("二、重新实现不限制点数FFT(myfft.c):\r\n");
printf("由于DSP库限制最大只能4096点,对于高采样率来说,频率分辨率会较差。\r\n");
printf("重新实现的FFT函数不限制点数,满足2^n即可,n最小值4,即16个点的FFT,而最大值不限。\r\n\r\n");
printf("使用且需改变采样点数:1、使用且改变DSP库实现的FFT点数 2、使用且改变重新实现不限制点数的FFT点数\r\n");
printf("一、使用且改变DSP库实现的FFT点数:\r\n");
printf("修改位置:1. myfft.h 中 FFT_LENGTH 的值 2. adc.h 中 ADC_DMA_SAMPLE_LENGTH 的值 3. WindowingFunction.h 中 WINDOW_LENGTH 的值\r\n");
printf("注意事项:FFT_LENGTH = ADC_DMA_SAMPLE_LENGTH = WINDOW_LENGTH\r\n\r\n");
printf("二、使用且改变重新实现不限制点数的FFT点数:\r\n");
printf("修改位置:1. FFTInc.h 中 MAX_FFT_N 的值 2. adc.h 中 ADC_DMA_SAMPLE_LENGTH 的值 3. WindowingFunction.h 中 WINDOW_LENGTH 的值\r\n");
printf("注意事项:MAX_FFT_N = ADC_DMA_SAMPLE_LENGTH = WINDOW_LENGTH\r\n");
//------------------------------------------------------------------
// DAC
//------------------------------------------------------------------
uint32_t DAC_Freq = 5000; /* DAC 输出信号频率 */
DAC_Init(CHANNEL_1); /* DAC ch1 初始化 */
DAC_Init(CHANNEL_2); /* DAC ch2 初始化 */
DAC_GenerateWave(SINE, DAC_CHANNEL_1, DAC_Freq, 2, DAC_WAVE_LENGTH); /* DAC 输出信号:波形 通道 频率 幅值 点数*/
DAC_GenerateWave(SINE, DAC_CHANNEL_2, DAC_Freq, 2, DAC_WAVE_LENGTH); /* DAC 输出信号:波形 通道 频率 幅值 点数 */
Set_Current_USART(USART1_IDX);
//------------------------------------------------
// AD9833
//------------------------------------------------
delay_ms(200); /* 使 AD9833 先上电 */
AD9833_A_Init(); /* AD9833_A 初始化 */
AD9833_B_Init(); /* AD9833_B 初始化 */
AD9833_A_SetFrequencyQuick(1000.0, AD9833_A_SINE); /* AD9833_A 输出信号:频率 波形 */
AD9833_B_SetFrequencyQuick(1000.0, AD9833_B_SINE); /* AD9833_B 输出信号:频率 波形 */
//------------------------------------------------
// AD9959
//------------------------------------------------
delay_ms(200); /* 使 AD9959 先上电 */
AD9959_Init(); /* AD9959 初始化 */
AD9959_enablechannel0(); /* 使能通道0 */
AD9959_Setwavefrequency(1000000); /* AD9959 输出信号:频率 */
AD9959_enablechannel1(); /* 使能通道1 */
AD9959_Setwavefrequency(2000000); /* AD9959 输出信号:频率 */
AD9959_enablechannel2(); /* 使能通道2 */
AD9959_Setwavefrequency(3000000); /* AD9959 输出信号:频率 */
AD9959_enablechannel3(); /* 使能通道3 */
AD9959_Setwavefrequency(4000000); /* AD9959 输出信号:频率 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
uint8_t Key = KEY_Scan(0);
if(ADC_Channels[0].ADC_ConvEnd_Flag == 1 && ADC_Channels[1].ADC_ConvEnd_Flag == 1 && Key == 4){
ADC_Channels[0].ADC_ConvEnd_Flag = 0;
ADC_Channels[1].ADC_ConvEnd_Flag = 0;
Key = 0;
/* 将采集到的整形数据提前转换为浮点数据存储 */
for(int i=0; i<ADC_DMA_SAMPLE_LENGTH; i++) ADC_Channels[0].DMA_floatData[i] = ADC_Channels[0].DMA_Buffer[i];
for(int i=0; i<ADC_DMA_SAMPLE_LENGTH; i++) ADC_Channels[1].DMA_floatData[i] = ADC_Channels[1].DMA_Buffer[i];
/*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
//主程序区:
// FFT测试
Infinite_FFT(ADC_Channels[0].DMA_floatData, infinite_fft_s[0].fft_Input, infinite_fft_s[0].fft_Output, MAX_FFT_N);
Infinite_FFT(ADC_Channels[1].DMA_floatData, infinite_fft_s[1].fft_Input, infinite_fft_s[1].fft_Output, MAX_FFT_N);
/* 串口打印 */
for(uint32_t i=0;i<ADC_DMA_SAMPLE_LENGTH/8;i++){
printf("%f,%f,%f,%f\r\n", ADC_Channels[0].DMA_floatData[i]*ZOOM, ADC_Channels[1].DMA_floatData[i]*ZOOM, infinite_fft_s[0].fft_Output[i], infinite_fft_s[1].fft_Output[i]);
}
/* LCD */
lcd_clear(BLACK);
lcd_draw_line(288, 0, 288, 800, RED);
lcd_draw_line(96 , 0, 96 , 800, RED);
for(uint32_t i=0;i<800;i++){
lcd_draw_line(ADC_Channels[0].DMA_floatData[i]*96.0/65535.0+384-48, i, ADC_Channels[0].DMA_floatData[i+1]*96.0/65535.0+384-48, i+1, YELLOW);
lcd_draw_line(ADC_Channels[1].DMA_floatData[i]*96.0/65535.0+192-48, i, ADC_Channels[1].DMA_floatData[i+1]*96.0/65535.0+192-48, i+1, LIGHTBLUE);
lcd_draw_line(infinite_fft_s[0].fft_Output[i]*50.0+288, i+10, infinite_fft_s[0].fft_Output[i+1]*50.0+288, i+10+1, RED);
lcd_draw_line(infinite_fft_s[1].fft_Output[i]*50.0+96, i+10, infinite_fft_s[1].fft_Output[i+1]*50.0+96, i+10+1, RED);
}
// arm_max_f32(&infinite_fft_s[0].fft_Output[1],MAX_FFT_N/2,&fft_Peak_Data[0].MaxAmp,&fft_Peak_Data[0].MaxAmp_Index);
// arm_max_f32(&infinite_fft_s[1].fft_Output[1],MAX_FFT_N/2,&fft_Peak_Data[1].MaxAmp,&fft_Peak_Data[1].MaxAmp_Index);
//
// lcd_draw_line(288, 50, infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*0]*50.0+288, 50, RED);
// lcd_draw_line(288, 100, infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*1]*500.0+288, 100, RED);
// lcd_draw_line(288, 150, infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*2]*500.0+288, 150, RED);
// lcd_draw_line(288, 200, infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*3]*500.0+288, 200, RED);
// lcd_draw_line(288, 250, infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*4]*500.0+288, 250, RED);
// lcd_draw_line(288, 300, infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*5]*500.0+288, 300, RED);
// lcd_draw_line(288, 350, infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*6]*500.0+288, 350, RED);
// lcd_draw_line(288, 400, infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*7]*500.0+288, 400, RED);
// lcd_draw_line(288, 450, infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*8]*500.0+288, 450, RED);
// lcd_draw_line(288, 500, infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*9]*500.0+288, 500, RED);
// lcd_draw_line(288, 550, infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*10]*500.0+288, 550, RED);
// lcd_draw_line(288, 600, infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*11]*500.0+288, 600, RED);
//
// lcd_draw_line(96, 50, infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*0]*50.0+96, 50, RED);
// lcd_draw_line(96, 100, infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*1]*500.0+96, 100, RED);
// lcd_draw_line(96, 150, infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*2]*500.0+96, 150, RED);
// lcd_draw_line(96, 200, infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*3]*500.0+96, 200, RED);
// lcd_draw_line(96, 250, infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*4]*500.0+96, 250, RED);
// lcd_draw_line(96, 300, infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*5]*500.0+96, 300, RED);
// lcd_draw_line(96, 350, infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*6]*500.0+96, 350, RED);
// lcd_draw_line(96, 400, infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*7]*500.0+96, 400, RED);
// lcd_draw_line(96, 450, infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*8]*500.0+96, 450, RED);
// lcd_draw_line(96, 500, infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*9]*500.0+96, 500, RED);
// lcd_draw_line(96, 550, infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*10]*500.0+96, 550, RED);
// lcd_draw_line(96, 600, infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*11]*500.0+96, 600, RED);
printf("信号1 直流:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*0]*500, fft_Peak_Data[0].MaxAmp_Index*0);
printf("信号1 基波:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*1]*500, fft_Peak_Data[0].MaxAmp_Index*1);
printf("信号1二次谐波:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*2]*500,fft_Peak_Data[0].MaxAmp_Index*2);
printf("信号1三次谐波:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*3]*500,fft_Peak_Data[0].MaxAmp_Index*3);
printf("信号1四次谐波:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*4]*500,fft_Peak_Data[0].MaxAmp_Index*4);
printf("信号1五次谐波:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*5]*500,fft_Peak_Data[0].MaxAmp_Index*5);
printf("信号1六次谐波:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*2]*500,fft_Peak_Data[0].MaxAmp_Index*2);
printf("信号1七次谐波:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*3]*500,fft_Peak_Data[0].MaxAmp_Index*3);
printf("信号1八次谐波:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*4]*500,fft_Peak_Data[0].MaxAmp_Index*4);
printf("信号1九次谐波:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*5]*500,fft_Peak_Data[0].MaxAmp_Index*5);
printf("信号1十次谐波:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*2]*500,fft_Peak_Data[0].MaxAmp_Index*2);
printf("信号1十一次谐波:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*3]*500,fft_Peak_Data[0].MaxAmp_Index*3);
printf("\r\n");
printf("信号2 直流:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*0]*500, fft_Peak_Data[1].MaxAmp_Index*0);
printf("信号2 基波:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*1]*500, fft_Peak_Data[1].MaxAmp_Index*1);
printf("信号2二次谐波:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*2]*500,fft_Peak_Data[1].MaxAmp_Index*2);
printf("信号2三次谐波:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*3]*500,fft_Peak_Data[1].MaxAmp_Index*3);
printf("信号2四次谐波:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*4]*500,fft_Peak_Data[1].MaxAmp_Index*4);
printf("信号2五次谐波:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*5]*500,fft_Peak_Data[1].MaxAmp_Index*5);
printf("信号2六次谐波:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*2]*500,fft_Peak_Data[1].MaxAmp_Index*2);
printf("信号2七次谐波:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*3]*500,fft_Peak_Data[1].MaxAmp_Index*3);
printf("信号2八次谐波:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*4]*500,fft_Peak_Data[1].MaxAmp_Index*4);
printf("信号2九次谐波:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*5]*500,fft_Peak_Data[1].MaxAmp_Index*5);
printf("信号2十次谐波:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*2]*500,fft_Peak_Data[1].MaxAmp_Index*2);
printf("信号2十一次谐波:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[0].fft_Output[fft_Peak_Data[1].MaxAmp_Index*3]*500,fft_Peak_Data[1].MaxAmp_Index*3);
printf("\r\n");
printf("\r\n");
/*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&ADC_Channels[0].DMA_Buffer, ADC_DMA_SAMPLE_LENGTH * sizeof(uint16_t));
HAL_ADC_Start_DMA(&hadc3,(uint32_t*)&ADC_Channels[1].DMA_Buffer, ADC_DMA_SAMPLE_LENGTH * sizeof(uint16_t));
}
}
}
|
-
ADC配置
-
DMA配置
|