实现了printf和scanf函数后,就用在DAC实验上试试。设定电压值,然后输出对应的模拟值。
首先请出神器,STM32CUBE配置UART,RCC,DAC怎么配置就不贴出了,我前面几个实验已经都介绍过了。当使能DAC时,可以看到PA4被选定了。PA4就是模拟输出引脚了。
配置DAC:
生成项目后,在main.c中的DAC初始化函数已经对DAC进行了配置,同时配置了通道:
void MX_DAC_Init(void) { DAC_ChannelConfTypeDef sConfig; /**DAC Initialization */ hdac.Instance = DAC; HAL_DAC_Init(&hdac); /**DAC channel OUT1 config */ sConfig.DAC_Trigger = DAC_TRIGGER_NONE; sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_DISABLE; HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_1); }
除了这个初始化函数,我们再实现DAC值得设定,以及启动DAC就可以到达最终目的了。再看看下面这个函数:
HAL_StatusTypeDef HAL_DAC_SetValue(DAC_HandleTypeDef* hdac, uint32_t channel, uint32_t alignment, uint32_t data)
从入口参数我们可以看出,有一个是选择对齐方式的,我这里选择的是12位右对齐。DAC部分大概就是这些,下面是主要的代码:
int main(void) { uint32_t ui_tmp_dat; float f_val; /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration----------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* Configure the system clock */ SystemClock_Config(); /* System interrupt init*/ HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_DAC_Init(); MX_USART2_UART_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ /* USER CODE BEGIN 3 */ /* Infinite loop */ printf("Please input voltage value:\n\r"); while (1) { scanf("%f", &f_val); HAL_DAC_Stop(&hdac, DAC_CHANNEL_1); printf("set:%f V\n\r", f_val); ui_tmp_dat = (uint32_t)(f_val * 4095 / 3.3); HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, ui_tmp_dat); HAL_DAC_Start(&hdac, DAC_CHANNEL_1); } /* USER CODE END 3 */ }
为了方便用万用表测量,用杜邦先引出了PA4和GND脚:
看看终端打印的信息:
这里做了三次测试:
分别对应的结果如图所示: