实现了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脚:
看看终端打印的信息:
这里做了三次测试:
分别对应的结果如图所示:
我要赚赏金
