STM32C542R开发.6--DAC固定电压输出概述视频教学样品申请源码下载硬件准备参考程序生成STM32CUBEMX2时钟树配置DEBUG配置串口配置DAC配置生成项目导入STM32CubeIDE设置工程编码添加头文件printf 重定向变量定义主程序测试结果概述本章介绍如何使用 STM32C5 片内 DAC 实现固定模拟电压输出。STM32C5 的 DAC 支持 12 位/8 位分辨率、外部引脚输出、输出缓冲以及 DMA 等功能12 位模式下数字量范围为 04095。本实验使用 DAC1 Channel 1通过 PA4DAC1_OUT1 输出模拟电压。程序根据参考电压和目标输出电压计算 DAC 数字量并使用 HAL_DAC_SetChannelData() 设置转换数据随后通过 HAL_DAC_StartChannel() 启动 DAC 输出。需要样片的可以加群申请925643491 / 615061293 。视频教学https://www.bilibili.com/video/BV1WvbX6cE23/样品申请https://www.wjx.top/vm/OhcKxJk.aspx#源码下载https://download.csdn.net/download/qq_24312945/93403513硬件准备首先需要准备一个开发板这里我准备的是自己绘制的开发板需要的可以进行申请。主控为STM32C542RCT6参考程序https://github.com/CoreMaker-lab/STM32C542R_SENSORhttps://gitee.com/CoreMaker/STM32C542R_SENSOR生成STM32CUBEMX2用STM32CUBEMX2生成例程这里使用MCU为STM32C542RCT6。打开 STM32CubeMX2 后进入 Home 首页点击 MCU基于具体芯片型号创建工程在 MCU name 中输入 STM32C542RCT6选择对应的 STM32C5 芯片型号后点击 Continue 进入下一步工程配置。填写工程名称和保存路径后点击 “Automatically Download, Install Create Project”STM32CubeMX2 会自动下载所需软件包并创建工程。STM32CubeMX2 提示 Project Successfully Created 后点击右下角 “Launch Project” 进入工程配置界面。时钟树配置点击左侧外设配置入口进入 Peripherals 配置界面在 System 分类下选择 RCC用于配置系统时钟源HSE Source 选择 Crystal/ceramic resonator启用外部高速晶振LSE Source 选择 Crystal/ceramic resonator启用外部低速晶振点击左侧 Clock 图标进入时钟树配置界面HSE OSC设置外部高速晶振频率这里配置为 24 MHzPSI Mux / PLL选择并配置 PLL 时钟源用于倍频生成系统主频System Mux选择系统时钟来源当前系统主频配置为 144 MHzDEBUG配置在 Peripherals 中选择 Cortex → DEBUG将 Mode 配置为 Single-wire trace asynchronous用于后续程序下载、在线调试和 Trace 调试功能。串口配置查看原理图PA9和PA10设置为开发板的串口。在左侧 Peripherals 中选择 Connectivity → USART1Mode 选择 Async表示配置为异步串口模式Function used by the component 显示为 UART说明 USART1 在异步模式下使用 UART HAL 驱动串口参数配置为115200 波特率、8 位数据位、无校验、1 位停止位、收发模式GPIO TxUSART1_TX 选择 PA9GPIO RxUSART1_RX 选择 PA10PA9 / PA10 均配置为 Alternate 复用功能模式Pull 选择 No pull-up and no pull-downOutput type 选择 Push pullSpeed 选择 LowDAC配置打开 STM32CubeMX2进入 DAC 外设配置界面配置步骤如下。进入 Peripherals 外设配置页面。在 Analog 分类中选择 DAC1。点击 Active 使能 DAC1 外设。使能 Channel 1并设置为 12 bits - right alignment关闭 Trigger开启 Output Buffer输出连接选择 External pin数据格式选择 UnsignedWave generation 和 Sample and Hold 保持关闭。本实验采用软件直接更新 DAC 数据因此不需要外部触发源。ST 官方 STM32CubeMX2 DAC 基础输出教程同样建议在固定电压输出场景下关闭 Trigger并可开启 Output Buffer 以提高输出驱动能力。继续向下配置 System 参数。DAC1 Channel 1 的外部输出信号 DAC1_OUT1 选择 PA4 引脚。根据 STM32C5 数据手册PA4 支持 DAC1_OUT1 模拟输出功能。GPIO 参数保持默认模拟输出配置● DAC1_OUT1PA4● ModeAnalog● PullNo pull-up and no pull-down本实验仅通过软件设置 DAC 数据寄存器实现固定模拟电压输出不需要连续搬运数据因此 DMA Channel 1 保持关闭同时不使用 DAC 中断NVIC Interrupt 保持关闭生成项目修改配置后左下角会提示 Click to save需要先保存当前工程配置点击左侧 Project settings进入工程生成设置页面在 IDE Project Generation 中选择工程格式和工具链本例选择 CMake GCC然后点击 Generate IDE project 生成工程导入STM32CubeIDE打开 STM32CubeIDE点击菜单栏 File选择 Import…准备导入 STM32CubeMX2 生成的 CMake 工程在 Import 窗口中展开 Import STM32 Project选择 STM32 CMake Project点击 Next进入 CMake 工程路径选择页面Project name填写导入到 STM32CubeIDE 中显示的工程名称Source directory选择 STM32CubeMX2 生成的 CMake 工程目录点击 Next继续完成工程导入Toolchain选择 MCU ARM GCC表示使用 ARM GCC 工具链进行编译MCU确认芯片型号为 STM32C542RCTx与前面 STM32CubeMX2 中选择的 MCU 保持一致CPU/Core确认内核为 Cortex-M33Core 为 0点击 Finish完成 CMake 工程导入设置工程编码在 Project Explorer 中选中当前工程点击菜单栏 Project选择 Properties进入工程属性设置在工程属性中选择 ResourceText file encoding 选择 Other编码格式输入 GBK点击 Apply and Close 保存设置添加头文件在 main.c 中添加头文件#includemx_usart1.h#includestdio.h#includestring.hprintf 重定向为了让 printf() 输出到 USART1需要重写 _write() 函数。GCC 工程中printf() 底层会调用 _write() 输出字符因此只需要在 _write() 中调用 HAL_UART_Transmit()就可以把 printf() 的内容通过串口发送出去。int_write(intfile,char*ptr,intlen){hal_uart_handle_t*huart1mx_usart1_uart_gethandle();if(huart1!NULL){HAL_UART_Transmit(huart1,ptr,len,1000);}returnlen;}变量定义STM32C542 的 DAC 为 12 位分辨率数字量范围为 04095。这里假设 DAC 参考电压 VREF 为 3.3 V目标输出电压设置为 1.65 V程序根据目标电压自动计算需要写入 DAC 的数字值。ST 官方 STM32C5 HAL 文档给出的 DAC 输出关系为VOUT(VREF)×4095/DOR当目标电压为 1.65 V 时DAC_OUTPUT_VALUE1650×4095/3300≈2047/* DAC reference voltage, unit: mV */#defineDAC_VREF_MV3300U/* Target DAC output voltage, unit: mV */#defineDAC_OUTPUT_MV1650U/* 12-bit DAC maximum digital value */#defineDAC_MAX_VALUE4095U/* Calculate DAC digital value */#defineDAC_OUTPUT_VALUE((DAC_OUTPUT_MV*DAC_MAX_VALUE)/DAC_VREF_MV)主程序首先通过 mx_dac1_gethandle() 获取 DAC1 的操作句柄并判断句柄是否有效。随后调用 HAL_DAC_SetChannelData() 将计算得到的 DAC_OUTPUT_VALUE 写入 DAC1 Channel 1 的数据保持寄存器。根据 ST 官方 STM32C5 HAL2 的说明启动 DAC 前应先调用 HAL_DAC_SetChannelData() 设置初始转换数据再调用 HAL_DAC_StartChannel() 启动对应 DAC 通道。本实验设置参考电压为 3.3 V、目标输出电压为 1.65 V对应 12 位 DAC 数字量约为 2047DOR1.65/3.3×4095≈2047/* Get DAC1 handle */hal_dac_handle_t*hdac1mx_dac1_gethandle();if(hdac1NULL){return(-1);}/* * Set DAC Channel 1 data. * * VOUT VREF × DOR / 4095 * * VREF 3.3 V * VOUT 1.65 V * * DOR ≈ 2047 */if(HAL_DAC_SetChannelData(hdac1,HAL_DAC_CHANNEL_1,DAC_OUTPUT_VALUE)!HAL_OK){return(-1);}/* Start DAC1 Channel 1 */if(HAL_DAC_StartChannel(hdac1,HAL_DAC_CHANNEL_1)!HAL_OK){return(-1);}printf(STM32C542 DAC Test\r\n);printf(DAC1_OUT1: PA4\r\n);printf(DAC Output: %lu mV\r\n,(unsignedlong)DAC_OUTPUT_MV);printf(DAC Value : %lu\r\n,(unsignedlong)DAC_OUTPUT_VALUE);测试结果程序运行后通过串口可以看到 DAC1 使用 PA4DAC1_OUT1 输出目标电压设置为 1650 mV对应 12 位 DAC 数字量为 2047。使用万用表测量 PA4 引脚实际输出电压约为 1.653 V与理论输出 1.650 V 基本一致误差约 3 mV说明 STM32C542 DAC 固定电压输出功能正常。