1.配置ADC(RCC、YSY、USART、时钟树配置请参考笔记1、笔记2)
2.配置DAC
3.烧写代码、修改usart.c ,重定向printf
#include "stdio.h" //这个变量是其他.c文件定义的 extern UART_HandleTypeDef huart1; uint8_t ch; uint8_t ch_r; //重写这个函数,重定向printf函数到串口,意思就是说printf直接输出到串口,其默认输出到控制台的 /*fputc*/ int fputc(int c, FILE * f) { ch=c; HAL_UART_Transmit(&huart1,&ch,1,1000);//发送串口 return c; } //重定向scanf函数到串口 意思就是说接受串口发过来的数据,其默认是接受控制台的数据 /*fgetc*/ int fgetc(FILE * F) { HAL_UART_Receive (&huart1,&ch_r,1,0xffff);//接收 return ch_r; }
4.在main.c中添加代码,打印电压值
static double SetVcc = 0; static uint16_t ReadVcc; SetVcc = SetVcc + 0.5; if(SetVcc > 3.3) { SetVcc = 0; } /* 设置DAC输出的电压 */ HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, (SetVcc / 3.3 * 4096)); HAL_DAC_Start(&hdac, DAC_CHANNEL_1); /* 打印 */ printf("PA0 set voltage:%.4f\n", SetVcc);
HAL_ADC_Start(&hadc1); HAL_ADC_PollForConversion(&hadc1, 50); if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC)) { /* 读取ADC的电压 */ ReadVcc = HAL_ADC_GetValue(&hadc1); /* 打印 */ printf("PA4 read voltage:%.4f\n", ReadVcc * 3.3f / 4096); } HAL_Delay(500); }