1、准备材料
正点原子stm32f407探索者开发板V2.4
STM32CubeMX软件(Version 6.10.0)
keil µVision5 IDE(MDK-Arm)
ST-LINK/V2驱动
野火DAP仿真器
XCOM V2.6串口助手
一台示波器
2、实验目标
使用STM32CubeMX软件配置STM32F407开发板的DAC OUT1实现输出三角波
3、实验流程
3.0、前提知识
STM32F407的DAC输出引脚除可以输出 DACoutput = VREF+ * DOR / 4095 的模拟电压之外,其DAC控制逻辑中还有两个重要的波形生成器 Wave generation mode ,分别为三角波和噪声波,本小节的实验主要以生成三角波为例,只会在“3.0、前提知识”中简单提到噪声波相关内容,在实际生成过程中两者的设置类似,且均简单易理解
使用DAC输出指定三角波/噪声波需要先指定DAC的输出触发源 Trigger ,DAC输出的触发源一共有7个,包括Timer 2/4/5/6/7/8 Trigger Out event和Software trigger,一般使用定时器的溢出时间作为DAC输出的触发源,本实验采用了TIM6的溢出更新事件作为DAC OUT1 三角波的触发源,所有可选的触发源如下图所示
当DAC输出三角波时需要设置参数 Maximum Triangle Amplitude ,当触发源定时器每次产生溢出更新事件时,DAC的输出值就会从基值增加1/减少1,因为TIM6基础定时器只能向上计数,因此当TIM6每次溢出时,DAC的输出会增加1,直到增加到设置的 Maximum Triangle Amplitude 参数值为止,然后逐渐减少直到基值,这个过程会反复执行从而生成三角波
上述过程如下图所示 (注释1)
当DAC输出伪噪声波时需要设置 Noise Amplitude 参数,其主要配置生成噪声波使用的12位LFSR寄存器解锁的位,如下图所示为DAC使用LFSR寄存器生成伪噪声的算法结构图,这里具体不做深究 (注释1)
3.1、CubeMX相关配置
3.1.0、工程基本配置
打开STM32CubeMX软件,单击ACCESS TO MCU SELECTOR选择开发板MCU(选择你使用开发板的主控MCU型号),选中MCU型号后单击页面右上角Start Project开始工程,具体如下图所示
开始工程之后在配置主页面System Core/RCC中配置HSE/LSE晶振,在System Core/SYS中配置Debug模式,具体如下图所示
详细工程建立内容读者可以阅读“STM32CubeMX教程1 工程建立”
3.1.1、时钟树配置
系统时钟使用8MHz外部高速时钟HSE,HCLK、PCLK1和PCLK2均设置为STM32F407能达到的最高时钟频率,具体如下图所示
3.1.2、外设参数配置
在Pinout & Configuration页面左边功能分类栏目Analog中单击其中DAC
在Mode中勾选OUT1 Configuration
将DAC OUT1的触发源选择为TIM6外部触发,最大三角波幅值设置为4095
具体配置如下图所示
在Pinout & Configuration页面左边功能分类栏目Timers中单击其中TIM6
勾选Activated激活定时器,配置其计数器参数溢出时间为0.1ms,具体参数解释请阅读“STM32CubeMX教程5 TIM 定时器概述及基本定时器”
外部事件触发选择更新事件Updata Event,具体配置如下图所示
3.1.3、外设中断配置
此实验无需开启DAC的任何中断
3.2、生成代码
3.2.0、配置Project Manager页面
单击进入Project Manager页面,在左边Project分栏中修改工程名称、工程目录和工具链,然后在Code Generator中勾选“Gnerate peripheral initialization as a pair of ‘c/h’ files per peripheral”,最后单击页面右上角GENERATE CODE生成工程,具体如下图所示
详细Project Manager配置内容读者可以阅读”STM32CubeMX教程1 工程建立“实验3.4.3小节
3.2.1、外设初始化调用流程
请阅读“STM32CubeMX教程16 DAC – 输出3.3V内任意电压”实验“3.2.1、外设初始化调用流程”小节
3.2.2、外设中断调用流程
此实验无需开启DAC的任何中断
3.2.3、添加其他必要代码
在主函数中启动DAC通道1输出,默认基值设置为0即可,源代码如下所示
/*启动DAC输出*/
HAL_DAC_Start(&hdac,DAC_CHANNEL_1);
/*设置DAC三角波输出基值*/
int32_t DacValue=0;
HAL_DAC_SetValue(&hdac,DAC_CHANNEL_1,DAC_ALIGN_12B_L,DacValue);
/*启动TIM6触发源*/
HAL_TIM_Base_Start(&htim6);
printf("Resetrn");
4、常用函数
请阅读“STM32CubeMX教程16 DAC – 输出3.3V内任意电压”实验
5、烧录验证
烧录程序,单片机上电后,将示波器的探头挂钩与DAC OUT1引脚PA4相连接,接地环与开发板上的GND引脚连接,将示波器每格电压幅值调节为1.00V,将每格子采集时间调节为400ms,然后开启示波器对DAC OU1输出的波形采集
设置Maximum Triangle Amplitud最大三角波幅值设置为2047时由示波器采集到的三角波如下图所示,其中三角波的幅值电压为1.48V,大致为3.3V的一半,波形频率为2.446Hz,计算的周期大约为408.8ms,定时器溢出时间为0.1ms,期待的周期为0.120482=409.6ms,与示波器采集结果大致一致
设置Maximum Triangle Amplitud最大三角波幅值设置为4095时由示波器采集到的三角波如下图所示,其中三角波的幅值电压为2.96V,波形频率为1.207Hz,计算的周期大约为828.5ms,定时器溢出时间为0.1ms,期待的周期为0.140962=819.2ms,与示波器采集结果大致一致
6、注释解析
注释1:图片来源STM32F4xx 中文参考手册
参考资料
STM32Cube高效开发教程(基础篇)
更多内容请浏览 STM32CubeMX+STM32F4系列教程文章汇总贴