RT-Thread Studio学习(十三)DAC

RT-Thread Studio学习(十三)DAC

  • 一、简介
  • 二、新建RT-Thread项目并使用外部时钟
  • 三、启用DAC
  • 四、测试
  • 五、总结

一、简介

本文将基于STM32F407VET芯片介绍如何在RT-Thread Studio开发环境下使用DAC设备。硬件及开发环境如下:

  • OS WIN10
  • STM32F407VET6
  • STM32CubeMX v6.10.0
  • STM32Cube MCU Package for STM32F4 Series v1.28.0
  • RT-Thread Studio v2.2.7
  • RT-Thread Source Code v5.0.2
  • STM32F4 chip support packages v0.2.3

二、新建RT-Thread项目并使用外部时钟

打开RT-Thread Studio软件新建基于芯片的项目,并使用外部时钟系统,具体参见《RT-Thread Studio学习(一)使用外部时钟系统》。

三、启用DAC

  1. 打开DAC驱动框架
    RT-Thread Setting 中借助图形化配置工具打开软件DAC的驱动框架,如下图所示
    在这里插入图片描述
  2. 定义DAC相关的宏
    board.h文件末尾添加:
/*-------------------------- DAC CONFIG BEGIN --------------------------*//** if you want to use dac you can use the following instructions.** STEP 1, open dac driver framework support in the RT-Thread Settings file** STEP 2, define macro related to the dac*                 such as     #define BSP_USING_DAC1** STEP 3, copy your dac init function from stm32xxxx_hal_msp.c generated by stm32cubemx to the end of board.c file*                 such as     void HAL_DAC_MspInit(DAC_HandleTypeDef* dacHandle)** STEP 4, modify your stm32xxxx_hal_config.h file to support dac peripherals. define macro related to the peripherals*                 such as     #define HAL_DAC_MODULE_ENABLED**/#define BSP_USING_DAC1/*-------------------------- DAC CONFIG END --------------------------*/
  1. 复制DAC初始化函数
    双击RT-Thread Studio工程中的cubemx.ioc文件,使能DAC1和DAC2,具体如下图:
    在这里插入图片描述从使能DAC后再重新生成STM32CubeMX代码,将.\cubemx\Src\dac.c中的函数HAL_DAC_MspInit(DAC_HandleTypeDef* dacHandle)复制到board.c的末尾。
void HAL_DAC_MspInit(DAC_HandleTypeDef* dacHandle)
{GPIO_InitTypeDef GPIO_InitStruct = {0};if(dacHandle->Instance==DAC){/* USER CODE BEGIN DAC_MspInit 0 *//* USER CODE END DAC_MspInit 0 *//* DAC 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;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);/* USER CODE BEGIN DAC_MspInit 1 *//* USER CODE END DAC_MspInit 1 */}
}
  1. 定义.\cubemx\Inc\stm32f4xx_hal_conf.h中的相关宏
#define HAL_DAC_MODULE_ENABLED

四、测试

修改main.c的代码为:

/** Copyright (c) 2006-2024, RT-Thread Development Team** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date           Author       Notes* 2024-01-15     RT-Thread    first version*/#include <rtthread.h>
#include "stm32f4xx.h"
#include <rtdevice.h>#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>// PA4     ------> DAC_OUT1
// PA5     ------> DAC_OUT2
DAC_HandleTypeDef hdac;#define DAC_DEV_NAME        "dac1"  /* DAC 设备名称 */
#define DAC_DEV_CHANNEL     1       /* DAC 通道 */
#define REFER_VOLTAGE       330         /* 参考电压 3.3V,数据精度乘以100保留2位小数*/
#define CONVERT_BITS        (1 << 12)   /* 转换位数为12位 */// 设置dac的使用命令 dac_set dac1 1 200
// 第一个参数为命令,第二个参数为 dac 设备名称,第 3 个参数为 dac 通道,
// 第 4 个参数为 dac 输出数值
static int dac_set(int argc, char *argv[])
{if(argc!=4){rt_kprintf("Usage:    dac_set <device name> <channel> <value>\n");rt_kprintf("Example:  dac_set dac1 1 1000\n");return RT_ERROR;}rt_dac_device_t dac_dev;rt_uint32_t value, vol, channel;rt_err_t ret = RT_EOK;char dacdevname[RT_NAME_MAX];rt_strncpy(dacdevname, argv[1], RT_NAME_MAX);channel = atoi(argv[2]);  // DAC channelvalue = atoi(argv[3]);/* 查找设备 */dac_dev = (rt_dac_device_t)rt_device_find(dacdevname);if (dac_dev == RT_NULL){rt_kprintf("dac sample run failed! can't find %s device!\n", dacdevname);return RT_ERROR;}/* 打开通道 */ret = rt_dac_enable(dac_dev, channel);/* 设置输出值 */rt_dac_write(dac_dev, channel, value);rt_kprintf("the value is :%d \n", value);/* 转换为对应电压值 */vol = value * REFER_VOLTAGE / CONVERT_BITS;rt_kprintf("the voltage is :%d.%02d \n", vol / 100, vol % 100);/* 延时查看效果,关闭通道后无输出 */
//    rt_thread_mdelay(500);/* 关闭通道 */
//    ret = rt_dac_disable(dac_dev, channel);return ret;
}static int dac1_vol_sample()
{rt_dac_device_t dac_dev;rt_uint32_t value, vol;rt_err_t ret = RT_EOK;/* 查找设备 */dac_dev = (rt_dac_device_t)rt_device_find(DAC_DEV_NAME);if (dac_dev == RT_NULL){rt_kprintf("dac sample run failed! can't find %s device!\n", DAC_DEV_NAME);return RT_ERROR;}/* 打开通道 */ret = rt_dac_enable(dac_dev, DAC_DEV_CHANNEL);/* 设置输出值 */value=1000;rt_dac_write(dac_dev, DAC_DEV_CHANNEL, value);rt_kprintf("the value is :%d \n", value);/* 转换为对应电压值 */vol = value * REFER_VOLTAGE / CONVERT_BITS;rt_kprintf("the voltage is :%d.%02d \n", vol / 100, vol % 100);/* 延时查看效果,关闭通道后无输出 */// rt_thread_mdelay(500);/* 关闭通道 */// ret = rt_dac_disable(dac_dev, DAC_DEV_CHANNEL);return ret;
}int main(void)
{int count = 1;LOG_D("Hello RT-Thread! 2024.1.17");LOG_D("System CLock information");LOG_D("SYSCLK_Frequency = %d", HAL_RCC_GetSysClockFreq());LOG_D("HCLK_Frequency   = %d", HAL_RCC_GetHCLKFreq());LOG_D("PCLK1_Frequency  = %d", HAL_RCC_GetPCLK1Freq());LOG_D("PCLK2_Frequency  = %d", HAL_RCC_GetPCLK2Freq());LOG_D("SysTick->LOAD    = %d", SysTick->LOAD);LOG_D("Current tick     = %d", rt_tick_get());dac1_vol_sample();while (count++){LOG_D("Hello RT-Thread! %d", rt_tick_get());rt_thread_mdelay(60000);}return RT_EOK;
}/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(dac_set, set dac voltage. Useage: dac_set adc1 1 200);

运行结果如下:
在这里插入图片描述
在PA4和PA5脚用万用表测得输出电压为0.8082V

五、总结

不需要在board.h中添加#define BSP_USING_DAC2宏定义,因为dac1的通道2就是dac2

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

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

相关文章

力扣309. 买卖股票的最佳时机含冷冻期(动态规划,Java C++解法)

Problem: 309. 买卖股票的最佳时机含冷冻期 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 Problem: 714. 买卖股票的最佳时机含手续费 该题目可以看作是上述题目的改编&#xff0c;该题目添加了一个冷冻期使得动态转移方程更加复杂&#xff0c;具体思路如下&#xf…

RK3568 android11 移植 v4l2loopback 虚拟摄像头

一&#xff0c;v4l2loopback 简介 v4l2loopback是一个Linux内核模块&#xff0c;它允许用户创建虚拟视频设备。这种虚拟视频设备可以用于各种用途&#xff0c;例如将实际摄像头的视频流复制到虚拟设备上&#xff0c;或者用于视频流的处理和分析等。v4l2loopback的主要作用是创…

Android CarService源码分析

文章目录 一、CarService的基本架构1.1、Android Automative整体框架1.2、Framework CarService1.3、目录结构1.3.1、CarService1.3.2、Car APP 二、CarService的启动流程2.1、系统启动后在SystemServer进程中启动CarServiceHelperService2.2、CarService启动 三、CarService源…

RT-Thread 15. list_timer与软定时器

1. 代码 void rt_thread_usr1_entry(void *parameter) {/* set LED2 pin mode to output */rt_pin_mode(LED2_PIN, PIN_MODE_OUTPUT);while (1){rt_pin_write(LED2_PIN, PIN_HIGH);rt_thread_mdelay(2000);rt_pin_write(LED2_PIN, PIN_LOW);rt_thread_mdelay(3000);} }int ma…

Unity URP切换品质和Feature开关的性能问题

现在对我的项目进行安卓端发布&#xff0c;需要切换品质和一些Feature开关。 我是这样做的。 划分品质 首先Renerer分为2个Android和PC&#xff0c;图中其他不用参考。 每个副本的URP Asset分为pc和android&#xff0c;例如图中的 hall和hall_android。 我们可以看到hall用的…

python贪吃蛇游戏

为了实现这个游戏&#xff0c;需要用到Python的pygame模块&#xff0c;它是一个专门用于开发游戏的模块&#xff0c;提供了很多方便的功能&#xff0c;比如窗口、图形、音效、事件处理等。 用pygame来创建一个窗口&#xff0c;设置游戏的背景色&#xff0c;画出蛇和食物&#…

解决Reinitialized existing Git repository

非初始化提交 可能是因为你想重新初始化已存在的Git仓库。这可能是因为你想重置Git仓库的状态&#xff0c;或者想重新开始一个新的Git历史记录。 要解决这个问题&#xff0c;你可以按照以下步骤操作&#xff1a; 确保你在正确的目录下。在命令行中使用cd命令切换到你的Git仓库…

VUE工程化项目--vue组件化

组件化开发 & 根组件 &#xff1a; ① 组件化&#xff1a; 一个页面可以拆分成 一个个组件 &#xff0c;每个组件有着自己独立的 结构、样式、行为 。 好处&#xff1a;便于 维护 &#xff0c;利于 复用 → 提升 开发效率 。 组件分类&#xff1a;普通组件、根组件。 …

智慧灌区解决方案:针对典型灌区水利管理需求

​随着国家对农业水利的重视,各地积极推进智慧灌区建设,以实现对水资源的精准调度和科学化管理。下面我们针对典型灌区水利管理需求,推荐智慧灌区解决方案。 一、方案构成智慧水利解决方案- 智慧水利信息化系统-智慧水利平台-智慧水利公司 - 星创智慧水利 一、方案构成 (一)水…

《设计模式的艺术》笔记 - 代理模式

介绍 代理模式是给某一个对象提供一个代理&#xff0c;并由代理对象控制对原对象的引用。代理模式是一种对象结构型模式。 实现 myclass.h // // Created by yuwp on 2024/1/12. //#ifndef DESIGNPATTERNS_MYCLASS_H #define DESIGNPATTERNS_MYCLASS_H#include <iostream&…

RHEL8 Samba服务器详细配置用户模式

任务&#xff1a; 配置server01为samba服务器&#xff0c;samba服务器的/companydata/sales为共享目录&#xff0c;共享名为sales&#xff0c;里面创建测试文件test_share.tar&#xff0c;创建用户组sales&#xff0c;创建组内用户sale1&#xff0c;要求配置用户模式访问&#…

react umi/max 页签(react-activation)

思路&#xff1a;通过react-activation实现页面缓存&#xff0c;通过umi-plugin-keep-alive将react-activation注入umi框架&#xff0c;封装页签组件最后通过路由的wrappers属性引入页面。 浏览本博客之前先看一下我的博客实现的功能是否满足需求&#xff0c;实现功能&#xf…

【SpringBoot】Bean 是什么?

感兴趣的话&#xff0c;可以看我另外一篇关于 Bean 的文章&#xff1a;【Java基础】Spring 中 Bean 的理解与使用 一、Bean 定义 Bean 作为 Spring 框架面试中不可或缺的概念&#xff0c;其本质上是指代任何被 Spring 加载生成出来的对象。&#xff08;本质上区别于 Java Bea…

MySQL 基于创建时间进行RANGE分区

MySQL是一款广泛使用的关系型数据库。在MySQL中&#xff0c;大量数据场景提高查询效率是非常关键的&#xff0c;所以&#xff0c;对数据表进行分区是一个很好的选择。 在创建分区表之前&#xff0c;需要了解一下MySQL分区的基本概念。MySQL分区可以将一个大表分成多个小表&…

【MySQL】使用 CAST 函数处理 unsigned 相减错误(BIGINT UNSIGNED value is out of range)

力扣题 1、题目地址 2175. 世界排名的变化 2、模拟表 表&#xff1a;TeamPoints Column NameTypeteam_idintnamevarcharpointsint team_id 包含唯一值。这张表的每一行均包含了一支国家队的 ID&#xff0c;它所代表的国家&#xff0c;以及它在全球排名中的得分。没有两支…

Mellanox Cumulus 10GB交换机 - 网卡接口配置成网桥

服务器上有一张网卡KVM虚拟机网桥&#xff0c;模拟出多套虚拟网桥 登陆交换机Mellanox Cumulus 第一步&#xff1a;创建桥 - 名称为bridge sudo brctl addbr bridge 第二步&#xff1a;添加接口至master bridge sudo brctl addif br0 swp17 启动master bridge接口 sudo …

软件需求规格说明书-word

软件需求规格说明书编写规范 1.项目背景 2.项目目标 3.系统架构 4.总体流程 5.名称解释 6.功能模块 软件开发全文档获取&#xff1a;软件项目开发全套文档下载_软件项目文档-CSDN博客

【JavaEE进阶】 图书管理系统开发日记——壹

文章目录 &#x1f332;序言&#x1f334;前端代码的引入&#x1f38b;约定前后端交互接口&#x1f343;后端服务器代码实现&#x1f6a9;UserController.java&#x1f6a9;BookController.java ⭕总结 &#x1f332;序言 该图书管理系统&#xff0c;博主将一步一步进行实现。…

react中如何使用其他字体

找到一个.ttf字体文件放入到assets文件夹中在global.less文件中利用font-face全局注册使用&#xff1a;font-family: "YouSheBiaoTiHei";

Template -- Vue3

Vue3 版本 Node 21.6.0Npm 10.2.4 项目 创建 npm init vite 项目名称vuejsnpm inpm run dev 依赖 npm i element-plus # UI npm i axios # 网络 npm i vue-router4 # 路由 npm i vuexnext # 状态管理npm i sass -D …