第四步:编写 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 */
}
|