RT-Thread: STM32F103的DAC 操作、DAC驱动

说明:文档记录基于RT-Thread的STM32F103外设DAC操作。

1.DAC的GPIO配置

函数位于 drivers\stm32f1xx_hal_msp.c

//DAC底层驱动,时钟配置,引脚 配置
//此函数会被HAL_DAC_Init()调用
//hdac:DAC句柄
void HAL_DAC_MspInit(DAC_HandleTypeDef* hdac)
{GPIO_InitTypeDef GPIO_Initure;__HAL_RCC_DAC_CLK_ENABLE();             //使能DAC时钟__HAL_RCC_GPIOA_CLK_ENABLE();           //开启GPIOA时钟GPIO_Initure.Pin=GPIO_PIN_4;            //PA4GPIO_Initure.Mode=GPIO_MODE_ANALOG;     //模拟GPIO_Initure.Pull=GPIO_NOPULL;          //不带上下拉HAL_GPIO_Init(GPIOA,&GPIO_Initure);//新增DAC2GPIO_Initure.Pin=GPIO_PIN_5;            //PA4GPIO_Initure.Mode=GPIO_MODE_ANALOG;     //模拟GPIO_Initure.Pull=GPIO_NOPULL;          //不带上下拉HAL_GPIO_Init(GPIOA,&GPIO_Initure);
}
void HAL_DAC_MspInit(DAC_HandleTypeDef* hdac)
{GPIO_InitTypeDef GPIO_InitStruct = {0};if(hdac->Instance==DAC){/* USER CODE BEGIN DAC_MspInit 0 *//* USER CODE END DAC_MspInit 0 *//* Peripheral clock enable */__HAL_RCC_DAC_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();/**DAC GPIO ConfigurationPA4     ------> DAC_OUT1PA5     ------> DAC_OUT2*/GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5;GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);/* USER CODE BEGIN DAC_MspInit 1 *//* USER CODE END DAC_MspInit 1 */}}

2.调试代码

        以下是成功调试的代码,开发板是野火的 霸道STM32,这个开发板只有DAC2 ;PA5能用,所以代码是在 原子的 DAC1,PAC4的基础上增加了DAC2, 关于RT Thread 线程部分也只做了 DAC2部分的。

备注:关于DAC1,DAC2 的引脚配置的函数位于 drivers \ stm32f1xx_hal_msp.c

void HAL_DAC_MspInit(DAC_HandleTypeDef* hdac) 函数,里面对DAC1,DAC2的IO进行了配置,如果只用到其中一个,需要到这个函数里面把其一关闭。

 GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5;//这段代码同时配置了DAC1,DAC2即 PA4,PA5,如果只需其一,删掉其一即可。

2.1 DAC_DRIVERS.h

#include <rtthread.h>
#include <rtdevice.h>
#include "board.h"extern DAC_HandleTypeDef DAC1_Handler;//DAC句柄
extern DAC_HandleTypeDef DAC2_Handler;//DAC句柄void DAC2_test(void);

2.2 DAC_DRIVERS.c

#include "DAC_DRIVERS.h"DAC_HandleTypeDef DAC1_Handler; //DAC句柄
DAC_HandleTypeDef DAC2_Handler; //DAC句柄
//初始化DAC1
void DAC1_Init(void)
{DAC_ChannelConfTypeDef DACCH1_Config;DAC1_Handler.Instance = DAC;HAL_DAC_Init(&DAC1_Handler);                            //初始化DACDACCH1_Config.DAC_Trigger = DAC_TRIGGER_NONE;             //不使用触发功能DACCH1_Config.DAC_OutputBuffer = DAC_OUTPUTBUFFER_DISABLE;             //DAC1输出缓冲关闭HAL_DAC_ConfigChannel(&DAC1_Handler, &DACCH1_Config, DAC_CHANNEL_1);             //DAC通道1配置HAL_DAC_Start(&DAC1_Handler, DAC_CHANNEL_1);             //开启DAC通道1
}//初始化DAC2
void DAC2_Init(void)
{DAC_ChannelConfTypeDef DACCH2_Config;DAC2_Handler.Instance = DAC;HAL_DAC_Init(&DAC2_Handler);                            //初始化DACDACCH2_Config.DAC_Trigger = DAC_TRIGGER_NONE;             //不使用触发功能DACCH2_Config.DAC_OutputBuffer = DAC_OUTPUTBUFFER_DISABLE;             //DAC1输出缓冲关闭HAL_DAC_ConfigChannel(&DAC2_Handler, &DACCH2_Config, DAC_CHANNEL_2);             //DAC通道1配置HAL_DAC_Start(&DAC2_Handler, DAC_CHANNEL_2);             //开启DAC通道1
}//设置通道1输出电压
//vol:0~3300,代表0~3.3V
void DAC1_Set_Vol(rt_uint16_t vol)
{double temp = vol;temp /= 1000;temp = temp * 4096 / 3.3;HAL_DAC_SetValue(&DAC1_Handler, DAC_CHANNEL_1, DAC_ALIGN_12B_R, temp);   //12位右对齐数据格式设置DAC值
}//设置通道2输出电压
//vol:0~3300,代表0~3.3V
void DAC2_Set_Vol(rt_uint16_t vol)
{double temp=vol;temp /= 1000;temp = temp * 4096 / 3.3;HAL_DAC_SetValue(&DAC2_Handler, DAC_CHANNEL_2, DAC_ALIGN_12B_R, temp);   //12位右对齐数据格式设置DAC值
}/* 线程 DAC2_entry 的入口函数 */
static void DAC2_entry(void *param)
{DAC2_Init();rt_uint16_t vout = 1300;while (1){DAC2_Set_Vol(vout);rt_kprintf("DAC2, PA5= %d mV \n", 1300);rt_thread_mdelay(2000);             //以ms为单位延时,函数自动去算出设置的时间需要多少时钟节拍。}}
//线程创建函数
void DAC2_test(void)
{rt_thread_t tid1;     //创建线程控制块指针来接收线程创建函数的返回值,目的是通过返回值判断线程是否创建ok/* 创建线程 1,名称是 DAC2,入口是 DAC2_entry*/tid1 = rt_thread_create("DAC2", DAC2_entry, RT_NULL, 5000,  //设置内存堆栈大小10, 10);   //设置优先级,时间片参数,时间片是在有多个相同优先级线程时,这个线程每次被执行多少个时间片/* 如果获得线程控制块,启动这个线程 */if (tid1 != RT_NULL)rt_thread_startup(tid1);
}
//INIT_APP_EXPORT(DAC2_test);

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

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

相关文章

el-upload子组件上传多张图片(上传为files或base64url)

场景&#xff1a; 在表单页&#xff0c;有图片需要上传&#xff0c;表单的操作行按钮中有上传按钮&#xff0c;点击上传按钮。 弹出el-dialog进行图片的上传&#xff0c;可以上传多张图片。 由于多个表单页都有上传多张图片的操作&#xff0c;因此将上传多图的el-upload定义…

Web中的转发与重定向

转发与重定向 一、转发和重定向的概念1.转发2.重定向 二、JavaWeb 中的转发和重定向三、SpringMVC 中的转发和重定向1.转发(1) 默认的方式(2) 完整的方式 2.重定向 四、总结 一、转发和重定向的概念 在 Web 应用中&#xff0c;转发和重定向都是用于将请求从一个页面传递到另一…

09-信息收集-APP及其他资产等

信息收集-APP及其他资产等 信息收集-APP及其他资产等一、APP提取季抓包及后续配合1、某APK一键提取反编译2、利用bp抓取更多URL 二、某IP无web框架下的第三方测试1、各种端口一顿乱扫 —— 思路2、各种接口一顿乱扫 —— 思路3、接口部分一顿测试 —— 思路 三、**案例演示**1、…

【Redis笔记】缓存——缓存分类、更新策略、缓存穿透、缓存雪崩、缓存击穿

缓存 缓存(Cache),就是数据交换的缓冲区,俗称的缓存就是缓冲区内的数据,一般从数据库中获取,存储于高速存储媒介上。 缓存的本质就是用空间换时间&#xff0c;牺牲数据的实时性&#xff0c;以服务器内存中的数据暂时代替从数据库读取最新的数据&#xff0c;减少数据库IO&#…

民事二审案件庭审应如何准备?

一、你要明确审理范围&#xff0c;固定上诉请求 首先&#xff0c;第二审人民法院围绕当事人的上诉请求进行审理。 其次&#xff0c;在第二审程序中&#xff0c;原审原告增加独立的诉讼请求或者原审被告提出反诉的&#xff0c;第二审人民法院可以根据当事人自愿的原则就新增加的…

技术革新与市场需求:探索亚信安慧AntDB的发展之路

在这个信息爆炸的时代&#xff0c;企业对数据处理的需求日益增长&#xff0c;而传统的数据库系统往往难以应对海量数据的存储和处理。亚信安慧AntDB的出现&#xff0c;为解决这一难题提供了有力的工具。它不仅具备高吞吐、高并发、高性能的特点&#xff0c;还拥有极佳的扩展性和…

HTML+JavaScript-05

DOM 什么是 DOM&#xff1f; DOM 是一项 W3C (World Wide Web Consortium) 标准。 DOM 定义了访问文档的标准&#xff1a; “W3C 文档对象模型&#xff08;DOM&#xff09;是中立于平台和语言的接口&#xff0c;它允许程序和脚本动态地访问、更新文档的内容、结构和样式。”…

AI绘画探索人工智能的未来

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-8fL64RHWVzwpzR6m {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

SouthLeetCode-打卡24年01月第5周

SouthLeetCode-打卡24年01月第5周 // Date : 2024/01/39 ~ 2024/01/31 031.删除链表的倒数第 N 个结点 (1) 题目描述 031#LeetCode.19.#北岸计划2024/01/29 (2) 题解代码 Version1.0 class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {if(head …

【知识图谱--第一讲概论】

深度学习–连接主义 知识图谱–符号主义 表示 有属性图和RDF图两种 RDF由三元组表示&#xff1a;Subject - Predicate - Object 存储 图数据库 抽取 融合 推理 问答 图算法

Seata下载与配置、启动

目录 Seata下载Seata配置启动Seata Seata下载 首先&#xff0c;我们需要知道我们要使用哪个版本的seata&#xff0c;这就要查看spring-cloud-alibaba版本说明&#xff0c;找到我们对应的seata。 spring-cloud-alibaba版本说明: 地址链接 下面是部分版本说明&#xff1a; s…

【MyBatis】MyBatis是什么?作用?怎么实现?

一、MyBatis是什么 MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO&#xff08;Plain …

【Java】小白友好的JDBC基础学习笔记

目录 JDBC简介 JDBC使用基本步骤 DriverManager Connection Statement PreparedStatement ResultSet JDBC简介 JDBC&#xff08;Java Database Connectivity&#xff09;是 Java 提供的一种用于与关系型数据库进行交互的 API&#xff08;应用程序接口&#xff09;。它允…

感染了后缀为.pings勒索病毒如何应对?数据能够恢复吗?

导言&#xff1a; 近期&#xff0c;一种名为.pings的勒索病毒悄然出现&#xff0c;给用户的数据安全带来了极大的威胁。该病毒以强力的加密手段对用户文件进行锁定&#xff0c;并勒索赎金。在本文中&#xff0c;91数据恢复将深入介绍.pings勒索病毒的特点&#xff0c;提供被感…

代码随想录二刷——字符串day9

文章目录 前言字符串知识点 一、 28. 找出字符串中第一个匹配项的下标二、459. 重复的子字符串总结 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招&#xff0c;计划二刷完卡子哥的刷题计划&#xff0c;加油&#xff01; 二刷决定精刷了&#xff0c;于是参加了卡子哥的刷…

虚拟机扩容后黑屏卡死解决方法

亲测有效&#xff0c;首先一般是在扩容后黑屏的&#xff0c;现象为开机后看到个横线光标不闪&#xff0c;黑屏&#xff0c;进入不了桌面。原因是硬盘已经满了&#xff0c;所以解决方法就是清理硬盘。所以首先还是要解决登录问题。 开机时按 esc 键进入 GNU GRUB&#xff0c;选择…

详解SpringCloud微服务技术栈:深入ElasticSearch(4)——ES集群

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;详解SpringCloud微服务技术栈&#xff1a;深入ElasticSearch&#xff08;3&#xff09;——数据同步&#xff08;酒店管理项目&a…

新火种AI|GPT Store可能是一个“硅基人才市场”

作者&#xff1a;一号 编辑&#xff1a;美美 也许我们都错了&#xff0c;GPT Store可能是一个“硅基人才市场”&#xff0c;而不是APP Store。 如果要说在AI领域中最火的一个应用&#xff0c;那么在当下&#xff0c;毫无疑问会是ChatGPT。 2023年&#xff0c;全球前50的AI工…

IT行业中最重要的证书

在IT行业&#xff0c;拥有一些含金量较高的证书是职业发展的关键。这些证书不仅可以证明技能水平&#xff0c;还有助于提升在职场上的竞争力。本文将介绍几个IT行业中最重要的证书。 1. Cisco认证 CCNA&#xff08;Cisco Certified Network Associate&#xff09;是Cisco公司新…

LeetCode: 189.轮转数组

本篇目标了解&#xff0c;翻转数组的经典解法&#xff0c; 189. 轮转数组 - 力扣&#xff08;LeetCode&#xff09; 目录 基本方法概述&#xff1a; 1&#xff0c;翻转做法&#xff0c;推荐时O&#xff08;n&#xff09;&#xff0c;空&#xff08;1&#xff09; 2&#x…