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;画出蛇和食物&#…

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

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

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分区可以将一个大表分成多个小表&…

软件需求规格说明书-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";

Python之可迭代对象、迭代器、生成器

Python可迭代对象&#xff08;Iterable&#xff09; Python中经常使用for来对某个对象进行遍历&#xff0c;此时被遍历的这个对象就是可迭代对象&#xff0c;像常见的list,tuple都是。如果给一个准确的定义的话&#xff0c;就是只要它定义了可以返回一个迭代器的__iter__方法…

鸿蒙HarmonyOS应用开发者认证 题库+答案案

建议用手机和PC两台设备协助&#xff0c;一台考试&#xff0c;一台找答案 1.在Colum和Row容器组件中&#xff0c;justifycontent用于设置子组件在主轴方向上的对齐格式&#xff0c;alignItems用于设置子组件在交叉抽方向上的对齐格式。 正确(True) 2.Video组件可以支持本地视频…

甜蜜而简洁——深入了解Pytest插件pytest-sugar

在日常的软件开发中,测试是确保代码质量的关键步骤之一。然而,对于测试报告的生成和测试结果的可读性,一直以来都是开发者关注的焦点。Pytest插件 pytest-sugar 以其清晰而美观的输出,为我们提供了一种愉悦的测试体验。本文将深入介绍 pytest-sugar 插件的基本用法和实际案…

css3 纯代码案例

css3 纯代码案例 前言渐变之美1.1 纯CSS3实现的渐变背景1.2 使用多重颜色和方向打造丰富渐变效果1.3 渐变色停留动画的巧妙运用 纯CSS图形绘制2.1 使用border属性制作三角形、梯形等形状伪类箭头图标2.2 利用transform创建旋转、缩放的图形 浮动的阴影敲代码css准备reset 样式复…

基于springboot+vue的图书个性化推荐系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

Jupyter Notebook五分钟基础速通

1 作用 常用于数据分析 2 安装 2.1 Anaconda 通过直接安装Anaconda&#xff0c;会自动安装Jupyter Notebook 2.2 命令行安装 ① 3.x版本 pip3 install --upgrade pip pip3 install jupyter ② 2.x版本 pip install --upgrade pip pip install jupyter 3 启动 cmd窗口下…