目录
初始方式
思路为用同一个tim触发adc进行采样
,
normal就是DMA只转存一次,一个数组,这样的好处是配置简单
circular就是DMA不断转运,后面最好加上中断,关掉tim,不然给新数组赋值也会出现问题
要保证先开启DMA,再开启ADC,也可以直接在上图中调整RANK
/* USER CODE BEGIN PD */
#define length 1024
#define ADC1_BUFFER_SIZE 1024
#define ADC2_BUFFER_SIZE 1024
/* USER CODE END PD */
ALIGN_32BYTES (uint16_t adc1_data[ADC1_BUFFER_SIZE]) __attribute__((section(".ARM.__at_0x24000000")));
ALIGN_32BYTES (uint16_t adc2_data[ADC2_BUFFER_SIZE]) __attribute__((section(".ARM.__at_0x38000000")));
/* USER CODE BEGIN 2 */
MX_ADC1_Init(); //��濮���璋��ㄦ�捐���?, 纭�淇���MX_DMA_Init()��濮�����,����浼��������烘��
MX_ADC2_Init(); //��濮���璋��ㄦ�捐���?, 纭�淇���MX_DMA_Init()��濮�����
HAL_ADCEx_Calibration_Start(&hadc1, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED) ; // AD��?���锛�f4涓���锟�??
HAL_ADCEx_Calibration_Start(&hadc2, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED) ;
HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc1_data, ADC1_BUFFER_SIZE);
HAL_ADC_Start_DMA(&hadc2, (uint32_t *)adc2_data, ADC2_BUFFER_SIZE);
HAL_TIM_Base_Start(&htim8);//锟�??瀹�瑕���ADC锟�??�����ㄥ���瑙�锟�???
问题在于adc1_data数组是16位的数组,但是由于HAL库函数的设置,转存的需要是32位的数组,故进行了强转与ALIGN_32BYTE的操作
更新后
只要把这里改为word,那么这个数组就统一当作32位来操作。故可以进行地址的操作(如快排等)。
HAL_ADCEx_Calibration_Start(&hadc1, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED) ;
HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc1_data, ADC1_BUFFER_SIZE);
HAL_TIM_Base_Start(&htim8);
delay_ms(20);
//在快排前要停止dma的转运
HAL_ADC_Stop_DMA(&hadc1);
QuickSort(adc1_data, 0, ADC1_BUFFER_SIZE-1);