stm32 H7 ADC DMA采集
学习记录一下
简单实现了adc采集波形数据,并通过vofa打印出波形
定时器配置
ADC配置
根据板子原理图,配置差分模式
设置dma
然后配置一下串口和时钟,生成工程,注意DMA搬运数据是需要时间的,因此需要有AdcConvEnd这样一个标志位,搬运完成之后再进下一次采集传输
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
#define SAMP_NUM 1024
/* USER CODE END PD *//* USER CODE BEGIN PV */uint16_t ADC_1_buff[SAMP_NUM];//uint16_t ADC_2_buff[SAMP_NUM];__IO uint8_t AdcConvEnd = 0; // ADC DMA搬运完成标志
/* USER CODE END PV */
/* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */HAL_ADC_Start_DMA(&hadc1,(uint32_t *)ADC_1_buff,SAMP_NUM); // 开启ADC DMA采样HAL_TIM_Base_Start(&htim1); // 使能定时器while(!AdcConvEnd); // DMA搬运完成标志// 打印波形数据for(int i=0;i<SAMP_NUM;i++){printf("%d\n",ADC_1_buff[i]);}}/* USER CODE END 3 */
在stm32h7xx_it.c文件中找到
void DMA1_Stream1_IRQHandler(void)
{/* USER CODE BEGIN DMA1_Stream1_IRQn 0 *//* USER CODE END DMA1_Stream1_IRQn 0 */HAL_DMA_IRQHandler(&hdma_adc1);/* USER CODE BEGIN DMA1_Stream1_IRQn 1 */AdcConvEnd = 1; // DMA传输完成/* USER CODE END DMA1_Stream1_IRQn 1 */
}
串口重定向
// 串口重定向 int fputc(int ch, FILE *f){HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);return ch;}int fgetc(FILE *f){uint8_t ch = 0;HAL_UART_Receive(&huart1, &ch, 1, 0xffff);return ch;}
实际测试