一、IO配置原理图:
二、在Cube Mx配置对应IO口
本实例只用到UASR1(TX、RX) & ADC1(IN1、IN3):
三、配置ADC
1、打开通道1、3
2、设置ADC参数:
注意多通道应用需要将End Of Conversion Selection选项配置为End of sequence of conversion.
3、配置ADC对应DMA
由于ADC为12位,因此记录数据的内存长度至少需要12位,标准数据类型中半个字(即两个字节最为接近)。另,由于需要记录两个数据,因此内存地址递增选项勾起来。
四、配置USART参数:
五、配置时钟树
然后就可以点击生成代码了。
主要代码参考如下:
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_ADC1_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
HAL_DMA_Start(&hdma_adc1, (uint32_t)ADC1+ 0x40, (uint32_t)(&ADC1_RESULT), 2);
HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED);
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)ADC1_RESULT, 2);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
Vinfact = (float)ADC1_RESULT[0]/ 4096 * (float)3.3;
Voutfact = (float)ADC1_RESULT[1]/ 4096 * (float)3.3;
printf("Vin is : %f V \n\r", Vinfact);
printf("Vout is : %f V \n\r", Voutfact);
SysTick_Delay_Ms(1000);
}
/* USER CODE END 3 */
}
注意Cube MX只是加速完成了对应寄存器的配置,最终代码中还需要自行掉用启动外设的相关库函数,比如本实例中的DMA启动函数:
HAL_DMA_Start(&hdma_adc1, (uint32_t)ADC1+ 0x40, (uint32_t)(&ADC1_RESULT), 2);
ADC启动函数:
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)ADC1_RESULT, 2);