第四步:编写 main.c 代码
- /* USER CODE BEGIN PFP */
- void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
- {
- if(hadc == &hadc1)
- {
- // 使用DMA其实也会运行到这里,也可以将结果在这里输出。
- // 当然此函数也可以不写。
- }
- }
- /* USER CODE END PFP */
- /**
- * @brief The application entry point.
- * @retval int
- */
- int main(void)
- {
- /* USER CODE BEGIN 1 */
- uint16_t adc_value[3] = {0};
- /* USER CODE END 1 */
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
- HAL_Init();
-
- /* Configure the system clock */
- SystemClock_Config();
-
- /* Initialize all configured peripherals */
- MX_GPIO_Init();
- MX_DMA_Init();
- MX_ADC1_Init();
- MX_USART1_UART_Init();
-
- /* USER CODE BEGIN WHILE */
- HAL_ADCEx_Calibration_Start(&hadc1);
- // enable DMA通道
- // 参数:ADC1、目标缓冲区地址、从ADC外围设备传输到内存的数据长度
- /*
- * 此处有个大坑,经过测试,DMA中断非常容易进(具体的不知道)
- *
- * 如果ADC采样周期短的话,一直在执行中断,
- * 导致无法执行主程序,因此会卡死在这个函数里面出不去。
- *
- * 因此,ADC的采用周期需要长一点。
- */
- HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc_value, 3);
-
- while (1)
- {
- printf("-------------------- \r\n");
- printf("adc value[0]:%f \r\n", adc_value[0]/4096.0*3.3);
- printf("adc value[1]:%f \r\n", adc_value[1]/4096.0*3.3);
- printf("adc value[2]:%f \r\n", adc_value[2]/4096.0*3.3);
- HAL_Delay(1000);
- /* USER CODE END WHILE */
- /* USER CODE BEGIN 3 */
- }
- /* USER CODE END 3 */
- }
|