完整源码下载:
https://github.com/simonliu009/STM32CubeMX-DAC-and-ADC
这一篇教程目标是由DAC输出一个阶梯电压,把它连接到一个ADC,由ADC读取这个电压并输出到串口。
软件:
STM32CubeMX V4.25.0
System Workbench V2.4
固件库版本:
STM32Cube FW_F1 V1.6.1
硬件:
OneNet 麒麟座V2.3
首先用一条杜邦线短接PA4和PA6两个引脚。我们会把PA4配置为DAC,PA6配置为ADC。
在STM32CubeMX中新建项目,选择正确的MCU型号
首先设置RCC和SYS,如下图
配置USART1为Asychronous模式
UART1配置用默认的115200,8, None和1就好。
然后设置PA4为DAC_OUT1, PA6引脚为ADC2_IN6, 完整引脚配置如下图:
然后根据板子实际情况设置时钟(麒麟座外部晶振是12M,STM32F103x的最高主频是72M),注意CubeMX可能会自动把ADC预分频系数设为6。
DAC和ADC设置都使用默认设置
Project - setting ,ToolChain/IDE选择 SW4STM32
勾选这里
保存以后,点击任务栏的生成代码图标
生成完毕以后在弹出的对话框点击"Open Project", System Workbench自动打开Eclipse并导入和打开了项目。
参考前面文章的printf()重定向到串口的代码,编辑main.c, 添加如下代码
[csharp] view plain copy
[csharp] view plain copy
然后修改main.c,添加两个变量存储DAC和ADC的值
[csharp] view plain copy
输出内容:
/* USER CODE BEGIN 3 */
if (DAC_Value >= 3967)
{
DAC_Value = 0;
}
DAC_Value += 128;
printf("DAC Value : %d \r\n",DAC_Value);
HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, DAC_Value);
HAL_Delay(500);
HAL_ADC_Start(&hadc2);
HAL_ADC_PollForConversion(&hadc2, 50);
if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc2), HAL_ADC_STATE_REG_EOC))
{
ADC2_Value = HAL_ADC_GetValue(&hadc2);
printf("ADC2 Reading : %d \r\n",ADC2_Value);
printf("PA6 Voltage : %.4f \r\n",ADC2_Value*3.3f/4096);
printf("\r\n");
}
HAL_Delay(2000);
}
/* USER CODE END 3 */
注意这里printf()输出浮点数%.4f会提示错误:
The float formatting support (-u _printf_float) is not enabled from linker flags
所以需要在这里添加一个-u _printf_float:
project properties > C/C++ Build > Settings > Tool Settings (TAB) > MCU GCC Linker > Miscellaneous > Linker flags
把-specs=nosys.specs -specs=nano.specs 改为 -specs=nosys.specs -specs=nano.specs -u _printf_float
最后,不要忘记把STM32Cube_FW_F1_V1.6.0\Projects\STM3210C_EVAL\Examples\UART\UART_Printf\syscalls.c 文件复制到src目录,很多教程没有提到这点。如果不复制这个文件,那么printf()是不起作用的。
然后右键点击项目,选择Properties, Run-Debug Settings, 点击右侧的New,在弹出对话框中选择Ac6 STM32 Debugging。
然后任务栏上点击Run图,当然会报错的,原因请查看另一篇我的博客(https://blog.csdn.net/toopoo/article/details/79680323),所以需要右键点击 项目名Run.cfg ,给它改个名字,
然后右键点击项目树里面的项目名称,选择“Propeties”,然后在Run/Debug Settings-选择项目名-Edit-Main-C/C++Application那里点击“Search Project”,然后选择出现的默认的elf文件:
然后在Debugger-User Defined-Browse 那里选择你自己改名的配置文件:
然后右键点击那个新的cfg文件,选择"Open With - Text Editor", 进行如下更改:
source [find interface/stlink.cfg] 更改为 source [find interface/stlink-v2.cfg]
reset_config srst_only srst_nogate connect_assert_srst 这一行改为 reset_config none
然后再Run一下,就可以了。
然后使用串口程序,波特率设为115200,就可以看到如下这些信息:
DAC Value : 128
ADC2 Reading : 66
PA6 Voltage : 0.0532
DAC Value : 256
ADC2 Reading : 193
PA6 Voltage : 0.1555
DAC Value : 384
ADC2 Reading : 321
PA6 Voltage : 0.2586
DAC Value : 512
ADC2 Reading : 448
PA6 Voltage : 0.3609
DAC Value : 640
ADC2 Reading : 576
PA6 Voltage : 0.4641
DAC Value : 768
ADC2 Reading : 704
PA6 Voltage : 0.5672
DAC Value : 896
ADC2 Reading : 832
PA6 Voltage : 0.6703
DAC Value : 1024
ADC2 Reading : 1140
PA6 Voltage : 0.9185
DAC Value : 1152
ADC2 Reading : 1089
PA6 Voltage : 0.8774
DAC Value为1152时,麒麟座的蜂鸣器开始鸣叫,因为PA4引脚是蜂鸣器的使能引脚,0.8V已经能让蜂鸣器工作了。
DAC和ADC读数有差距是因为线材的压降和噪声的影响。