基于RT-Thread的STM32F4开发第三讲——DAC

news2025/5/14 14:13:10

文章目录

  • 前言
  • 一、DAC是什么?
  • 二、RT-Thread工程创建
  • 三、DAC函数编写
    • 1.DAC.c
    • 2.DAC.h
    • 3.main.c
  • 四、结果测试
  • 五、工程分享


前言

本章利用RT-Thread最新的驱动5.1.0开发DAC模块,使用的开发板是正点原子的STM32F4探索者。很多配置和上文重复,本文不再重复叙述。


一、DAC是什么?

DAC 是 Digital-to-Analog Converter 的缩写,即数模转换器。它是一种电子设备,用于将数字信号(通常是二进制代码)转换为连续的模拟信号(如电压或电流)。在嵌入式系统、通信设备、音频系统等领域有广泛应用。
在STM32F4中DAC 模块是12 位电压输出数模转换器。DAC 可以按 8 位或 12 位模式进行配置,并且可与 DMA 控制器配合使用。在 12 位模式下,数据可以采用左对齐或右对齐。DAC 有两个输出 通道,每个通道各有一个转换器。在 DAC 双通道模式下,每个通道可以单独进行转换;当 两个通道组合在一起同步执行更新操作时,也可以同时进行转换。可通过一个输入参考电压引脚 VREF+ (与 ADC 共享)来提高分辨率。

二、RT-Thread工程创建

首先得到一个RT-Thread的STMF4系列驱动5.1.0不报错工程(RT-Thread studio的驱动5.1.0报错修改)
参考上文使用cubemx配置好外设和时钟基于RT-Thread的STM32F4开发第二讲第一篇——ADC
在这里插入图片描述
如图,这是DAC外设的配置。配置好后生成工程
RT-Thread外设初始化整体的流程差不过。

  1. RT-Thread Settings外设开启
  2. 在board.h中预定义宏
  3. 在board.c中粘贴函数HAL_xxx_MspInit和HAL_xxx_MspDeInit
  4. 在stm32xxxx_hal_config.h使能HAL库外设宏定义
    其中第四步cubemx创建工程时已经完成了,不需更改了。其他配置如图
    在这里插入图片描述
    然后进入board.h文件,预定义DAC1的宏,这个文件没有像其他外设(如ADC)预先定义好再注释DAC的宏,需要我们手动添加。
    在这里插入图片描述
    将函数void HAL_DAC_MspInit(DAC_HandleTypeDef* dacHandle)void HAL_DAC_MspDeInit(DAC_HandleTypeDef* dacHandle)粘贴到board.c中,具体操作看上文。
    用cubemx生成的dac.c文件中的函数void MX_DAC_Init(void),去dac_donfig.h和drv_dac.c中对比初始化配置,更新或补全外设初始化
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
注意drv_dac.c使用了很多预编译指令,如果你的芯片型号不在其中,要手动添加进去。
以上配置好后,工程不报错就可以编写DAC工作函数了

三、DAC函数编写

下面是DAC输出电压计算公式,函数rt_dac_write(dac_handle, DAC_CHANNEl, dac_value)的参数dac_value值就是DOR的值。
在这里插入图片描述

1.DAC.c

#include "DAC.h"
#include "stdlib.h"

#define     DBG_TAG     "dac"
#define     DBG_LVL     DBG_INFO
#include <rtdbg.h>

#define     DAC_ANME   "dac1"
#define     DAC_CHANNEl     1
rt_dac_device_t dac_handle;
void DAC_int(void)
{
    dac_handle = (rt_dac_device_t)rt_device_find(DAC_ANME);
    if(dac_handle == RT_NULL)
    {
        LOG_I("failed to dac handle find");
        return;
    }
    if(rt_dac_enable(dac_handle, DAC_CHANNEl) != RT_EOK){
        LOG_I("failed to dac handle enable");
        return;
    }
    if(rt_dac_write(dac_handle, DAC_CHANNEl, 2000) != RT_EOK){
        LOG_I("failed to dac output set");
        return;
    }
    LOG_I("success to dac handle init");
    return;
}
void dac_voltage(int argc,char **argv)
{
    static int dac_value = 0;
    dac_value = atoi(argv[1]);
    if(dac_value>=0 && dac_value<4096){
        if(rt_dac_write(dac_handle, DAC_CHANNEl, dac_value) != RT_EOK){
            LOG_I("failed to dac output voltage change");
            return;
        }
    }
    else {
        LOG_I("input value error");
    }
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(dac_voltage, dac voltage convert sample);

2.DAC.h

#ifndef APP_ADC_H_
#define APP_ADC_H_

#include <board.h>
#include <rtdevice.h>

int adc_init(void);
int adc_thread_init(void);

#endif /* APP_ADC_H_ */

3.main.c

#include <rtthread.h>

#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
#include "DAC.h"

int main(void)
{
    DAC_int();

    while (1)
    {
        rt_thread_mdelay(1000);
    }

    return RT_EOK;
}

四、结果测试

经过测试,输入的dac_value在0——4095之间,PA4引脚能输出0.15V——3.29V。如果后面结合硬件定时器可以使用DAC的高级功能——输出特定波形

五、工程分享

通过网盘分享的文件:IO_DAC.zip
链接: https://pan.baidu.com/s/121vVZVeXfjvNNqQjDr9_aA?pwd=jykw 提取码: jykw


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2375449.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络状态可以通过hutool.HttpStatus获取

网络状态可以通过hutool.HttpStatus获取 全部都是静态int类型

Gemini 2.5 推动视频理解进入新时代

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

谈谈各种IO模型

目前的IO模型有5种&#xff1a;BIO&#xff08;阻塞IO&#xff09;、NIO&#xff08;非阻塞IO&#xff09;、IO多路复用、信号驱动IO、异步IO&#xff08;AIO&#xff09; 了解这些模型之前&#xff0c;我们需要先知道IO模型中的几个概念&#xff1a;阻塞&非阻塞、同步&am…

Linux系统管理与编程20:Apache

兰生幽谷&#xff0c;不为莫服而不芳&#xff1b; 君子行义&#xff0c;不为莫知而止休。 做好网络和yum配置&#xff0c;用前面dns规划的www的IP进行。 #!/bin/bash #----------------------------------------------------------- # File Name: myWeb.sh # Version: 1.0 # …

BFS算法篇——打开智慧之门,BFS算法在拓扑排序中的诗意探索(下)

文章目录 引言一、课程表1.1 题目链接&#xff1a;https://leetcode.cn/problems/course-schedule/description/1.2 题目分析&#xff1a;1.3 思路讲解&#xff1a;1.4 代码实现&#xff1a; 二、课程表||2.1 题目链接&#xff1a;https://leetcode.cn/problems/course-schedul…

【入门】纸盒的最大体积是多少?

描述 在一张尺寸为 n * n 厘米的正方形硬纸板的四个角上&#xff0c;分别裁剪掉一个 m * m 厘米的小正方形&#xff0c;就可以做成一个无盖纸盒&#xff0c;请问这个无盖纸盒的最大体积是多少&#xff1f; 立方体的体积 v 底面积 * 高&#xff09; 比如&#xff1a; n 5 &am…

QT5.14安装以及新建基础项目

进入qt中文网站&#xff1a;Qt | 软件开发全周期的各阶段工具 额&#xff0c;考虑新手可能还是找不到&#xff0c;我就分享一下我下载的的吧 通过网盘分享的文件&#xff1a;qt-opensource-windows-x86-5.14.2.exe 链接:https://pan.baidu.com/s/1yQTRp-b_ISje5B3UWb7Apw?pw…

KV cache 缓存与量化:加速大型语言模型推理的关键技术

引言 在大型语言模型&#xff08;LLM&#xff09;的推理过程中&#xff0c;KV 缓存&#xff08;Key-Value Cache&#xff09; 是一项至关重要的优化技术。自回归生成&#xff08;如逐 token 生成文本&#xff09;的特性决定了模型需要反复利用历史token的注意力计算结果&#…

BlockMesh Ai项目 监控节点部署教程

项目介绍 BlockMesh 是一个创新、开放且安全的网络&#xff0c;允许用户轻松地将多余的带宽货币化。 它为用户提供了被动获利并参与人工智能数据层、在线隐私、开源和区块链行业前沿的绝佳机会。 此教程为Linux系统教程 教程开始 首先到这里注册账号&#xff0c;注册后保存…

【Bluedroid】蓝牙 HID DEVICE 初始化流程源码解析

本文深入剖析Android蓝牙协议栈中HID设备&#xff08;BT-HD&#xff09;服务的初始化与启用流程&#xff0c;从接口初始化、服务掩码管理、服务请求路由到属性回调通知&#xff0c;完整展现蓝牙HID服务激活的技术路径。通过代码逻辑梳理&#xff0c;揭示服务启用的核心机制&…

iOS创建Certificate证书、制作p12证书流程

一、创建Certificates 1、第一步得先在苹果电脑上创建一个.certSigningRequest的文件。首先打开钥匙串&#xff0c;使用快捷键【command空格】——输入【钥匙串】回车&#xff08;找不到就搜一下钥匙串访问使用手册&#xff09; 2、然后在苹果电脑的左上角菜单栏选择【钥匙串…

curl发送数据不为null,但是后端接收到为null

curl -X POST http://localhost:8080/xiaozhi/test --header "Content-Type: application/json" -d "{\"age\":123}"经过检查发现注解导入错误 正确的应该是 import org.springframework.web.bind.annotation.RequestBody;

blazor与硬件通信实现案例

在网页接入硬件交互通信方案这篇博客中,曾经提到了网页中接入各种硬件操作的方法,即通过Windows Service作为指令的中转,并建立websocket通信连接,进而实现接入硬件的各种操作。这篇博客就以实际的案例来讲解具体怎么实现。 一、建立Windows Service项目 比如我就建立了一…

Linux下mysql的安装与远程链接

linux安装mysql 01下载依赖&#xff1a; 找到网址/download下&#xff1a; 最下面MySQL Community&#xff08;mysql社区版&#xff09; 选择MySQL Community Server 选择对应的mysql版本 操作系统版本选择 根据操作系统的版本选择具体版本号 下载离线版本 安装包详情 0…

【HT周赛】T3.二维平面 题解(分块:矩形chkmax,求矩形和)

题意 需要维护 n n n \times n nn 平面上的整点&#xff0c;每个点 ( x , y ) (x, y) (x,y) 有权值 V ( x , y ) V(x, y) V(x,y)&#xff0c;初始都为 0 0 0。 同时给定 n n n 次修改操作&#xff0c;每次修改给出 x 1 , x 2 , y 1 , y 2 , v x_1, x_2, y_1, y_2, v x…

qemu热迁移后内存占用突增问题

1.问题描述 虚拟机配置了memoryBackingmemfd的情况下&#xff0c;热迁移虚拟机后&#xff0c;在目的节点 qemu-kvm 进程占用 rss 会突增很多。 如果去掉这个配置没这个现象。 <memoryBacking><source typememfd/> </memoryBacking>2.问题现象 2.1 不配置…

鸿蒙 Core File Kit(文件基础服务)之简单使用文件

查看常用的沙箱目录 应用沙箱文件访问关系图 应用文件目录结构图 查看常用的沙箱目录 Entry Component struct Index {build() {Button(查看常用的沙箱目录).onClick(_>{let ctx getContext() // UI下只能使用这个方法&#xff0c;不能 this.contextconsole.log(--应用缓存…

基于Qt的app开发第七天

写在前面 笔者是大一下计科生&#xff0c;标题这个项目是笔者这个学期的课设&#xff0c;与学长共创&#xff0c;我负责客户端部分&#xff0c;现在已经实现了待办板块的新建、修改。 这个项目目前已经走上正轨了&#xff0c;博主也实现了主要功能的从无到有&#xff…

目标检测任务常用脚本1——将YOLO格式的数据集转换成VOC格式的数据集

在目标检测任务中&#xff0c;不同框架使用的标注格式各不相同。常见的框架中&#xff0c;YOLO 使用 .txt 文件进行标注&#xff0c;而 PASCAL VOC 则使用 .xml 文件。如果你需要将一个 YOLO 格式的数据集转换为 VOC 格式以便适配其他模型&#xff0c;本文提供了一个结构清晰、…

NLTK库: 数据集3-分类与标注语料(Categorized and Tagged Corpora)

NLTK库: 数据集3-分类与标注语料&#xff08;Categorized and Tagged Corpora&#xff09; 1.二分类语料 主要是电影语料&#xff0c;和情绪(积极消极、主观客观)有关&#xff0c;有以下2个语料&#xff1a; 1.1 movie_reviews: IMDb 影评 IMDb&#xff08;Internet Movie …