STM32-快速上手DAC
关于DAC的模块分析在《STM32-一文搞懂DAC》已经记过了,这里只记快速使用。
目录
1 概述
2 配置步骤
3 库函数汇总
4 代码范例
1 概述
STM32的DAC模块只存在于大容量产品中,是12位数字输入,电压输出的数字/模拟转换器,2个输出通道,每个通道都有单独的转换器,支持双DAC模式。DAC可以通过引脚输入参考电压VREF+以获得更精确的转换结果。DAC模块在APB1时钟下!
2 配置步骤
- (1)DAC模块时钟使能(在APB1下)、输出IO端口时钟使能(APB2下)。
- void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);
- void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
- (2)输出端口配置
- void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
- (3)DAC模块配置
- void DAC_Init(uint32_t DAC_Channel, DAC_InitTypeDef* DAC_InitStruct);
主要配置前文《stm32-一文搞懂DAC》中提到的控制寄存器DAC_CR。
typedef struct {uint32_t DAC_Trigger; /*!< Specifies the external trigger for the selected DAC channel.This parameter can be a value of @ref DAC_trigger_selection */uint32_t DAC_WaveGeneration; /*!< Specifies whether DAC channel noise waves or triangle wavesare generated, or whether no wave is generated.This parameter can be a value of @ref DAC_wave_generation */uint32_t DAC_LFSRUnmask_TriangleAmplitude; /*!< Specifies the LFSR mask for noise wave generation orthe maximum amplitude triangle generation for the DAC channel. This parameter can be a value of @ref DAC_lfsrunmask_triangleamplitude */uint32_t DAC_OutputBuffer; /*!< Specifies whether the DAC channel output buffer is enabled or disabled.This parameter can be a value of @ref DAC_output_buffer */ }DAC_InitTypeDef;
DAC_Trigger 通道触发源选择,可选通道如下
#define DAC_Trigger_None ((uint32_t)0x00000000) /*!< Conversion is automatic once the DAC1_DHRxxxx register has been loaded, and not by external trigger */ #define DAC_Trigger_T6_TRGO ((uint32_t)0x00000004) /*!< TIM6 TRGO selected as external conversion trigger for DAC channel */ #define DAC_Trigger_T8_TRGO ((uint32_t)0x0000000C) /*!< TIM8 TRGO selected as external conversion trigger for DAC channelonly in High-density devices*/ #define DAC_Trigger_T3_TRGO ((uint32_t)0x0000000C) /*!< TIM8 TRGO selected as external conversion trigger for DAC channelonly in Connectivity line, Medium-density and Low-density Value Line devices */ #define DAC_Trigger_T7_TRGO ((uint32_t)0x00000014) /*!< TIM7 TRGO selected as external conversion trigger for DAC channel */ #define DAC_Trigger_T5_TRGO ((uint32_t)0x0000001C) /*!< TIM5 TRGO selected as external conversion trigger for DAC channel */ #define DAC_Trigger_T15_TRGO ((uint32_t)0x0000001C) /*!< TIM15 TRGO selected as external conversion trigger for DAC channel only in Medium-density and Low-density Value Line devices*/ #define DAC_Trigger_T2_TRGO ((uint32_t)0x00000024) /*!< TIM2 TRGO selected as external conversion trigger for DAC channel */ #define DAC_Trigger_T4_TRGO ((uint32_t)0x0000002C) /*!< TIM4 TRGO selected as external conversion trigger for DAC channel */ #define DAC_Trigger_Ext_IT9 ((uint32_t)0x00000034) /*!< EXTI Line9 event selected as external conversion trigger for DAC channel */ #define DAC_Trigger_Software ((uint32_t)0x0000003C) /*!< Conversion started by software trigger for DAC channel */
DAC_WaveGeneration 是否使用波形发生器,可选参数如下。
#define DAC_WaveGeneration_None ((uint32_t)0x00000000)//不使用波形发生器 #define DAC_WaveGeneration_Noise ((uint32_t)0x00000040)//波形发生器生成噪声 #define DAC_WaveGeneration_Triangle ((uint32_t)0x00000080)//波形发生器生成三角波
DAC_LFSRUnmask_TriangleAmplitude 用来设置屏蔽/幅值选择器,只有在使用波形发生器的时候才可用。在使用噪声发生器的时候用来设置屏蔽位(改变噪声生成算法);在使用三角波发生器的时候用来设置三角波幅值。可选参数如下
#define DAC_LFSRUnmask_Bit0 ((uint32_t)0x00000000) /*!< Unmask DAC channel LFSR bit0 for noise wave generation */ #define DAC_LFSRUnmask_Bits1_0 ((uint32_t)0x00000100) /*!< Unmask DAC channel LFSR bit[1:0] for noise wave generation */ #define DAC_LFSRUnmask_Bits2_0 ((uint32_t)0x00000200) /*!< Unmask DAC channel LFSR bit[2:0] for noise wave generation */ #define DAC_LFSRUnmask_Bits3_0 ((uint32_t)0x00000300) /*!< Unmask DAC channel LFSR bit[3:0] for noise wave generation */ #define DAC_LFSRUnmask_Bits4_0 ((uint32_t)0x00000400) /*!< Unmask DAC channel LFSR bit[4:0] for noise wave generation */ #define DAC_LFSRUnmask_Bits5_0 ((uint32_t)0x00000500) /*!< Unmask DAC channel LFSR bit[5:0] for noise wave generation */ #define DAC_LFSRUnmask_Bits6_0 ((uint32_t)0x00000600) /*!< Unmask DAC channel LFSR bit[6:0] for noise wave generation */ #define DAC_LFSRUnmask_Bits7_0 ((uint32_t)0x00000700) /*!< Unmask DAC channel LFSR bit[7:0] for noise wave generation */ #define DAC_LFSRUnmask_Bits8_0 ((uint32_t)0x00000800) /*!< Unmask DAC channel LFSR bit[8:0] for noise wave generation */ #define DAC_LFSRUnmask_Bits9_0 ((uint32_t)0x00000900) /*!< Unmask DAC channel LFSR bit[9:0] for noise wave generation */ #define DAC_LFSRUnmask_Bits10_0 ((uint32_t)0x00000A00) /*!< Unmask DAC channel LFSR bit[10:0] for noise wave generation */ #define DAC_LFSRUnmask_Bits11_0 ((uint32_t)0x00000B00) /*!< Unmask DAC channel LFSR bit[11:0] for noise wave generation */#define DAC_TriangleAmplitude_1 ((uint32_t)0x00000000) /*!< Select max triangle amplitude of 1 */ #define DAC_TriangleAmplitude_3 ((uint32_t)0x00000100) /*!< Select max triangle amplitude of 3 */ #define DAC_TriangleAmplitude_7 ((uint32_t)0x00000200) /*!< Select max triangle amplitude of 7 */ #define DAC_TriangleAmplitude_15 ((uint32_t)0x00000300) /*!< Select max triangle amplitude of 15 */ #define DAC_TriangleAmplitude_31 ((uint32_t)0x00000400) /*!< Select max triangle amplitude of 31 */ #define DAC_TriangleAmplitude_63 ((uint32_t)0x00000500) /*!< Select max triangle amplitude of 63 */ #define DAC_TriangleAmplitude_127 ((uint32_t)0x00000600) /*!< Select max triangle amplitude of 127 */ #define DAC_TriangleAmplitude_255 ((uint32_t)0x00000700) /*!< Select max triangle amplitude of 255 */ #define DAC_TriangleAmplitude_511 ((uint32_t)0x00000800) /*!< Select max triangle amplitude of 511 */ #define DAC_TriangleAmplitude_1023 ((uint32_t)0x00000900) /*!< Select max triangle amplitude of 1023 */ #define DAC_TriangleAmplitude_2047 ((uint32_t)0x00000A00) /*!< Select max triangle amplitude of 2047 */ #define DAC_TriangleAmplitude_4095 ((uint32_t)0x00000B00) /*!< Select max triangle amplitude of 4095 */
DAC_OutputBuffer DAC输出缓存,使用时可以增加驱动能力,但是该功能下不能输出0,慎用。可选参数:
#define DAC_OutputBuffer_Enable ((uint32_t)0x00000000) #define DAC_OutputBuffer_Disable ((uint32_t)0x00000002)
- (4)使能DAC通道
- void DAC_Cmd(uint32_t DAC_Channel, FunctionalState NewState);
- (5)写入数据寄存器DHR中数据及设置对齐方式。(不启动外部触发的情况下就直接启动输出)
- void DAC_SetChannel1Data(uint32_t DAC_Align, uint16_t Data)
为DAC_Align可选参数为
#define DAC_Align_12b_R ((uint32_t)0x00000000)
#define DAC_Align_12b_L ((uint32_t)0x00000004)
#define DAC_Align_8b_R ((uint32_t)0x00000008)
3 库函数汇总
所有DAC相关库函数如下
void DAC_DeInit(void);
void DAC_Init(uint32_t DAC_Channel, DAC_InitTypeDef* DAC_InitStruct);
void DAC_StructInit(DAC_InitTypeDef* DAC_InitStruct);
void DAC_Cmd(uint32_t DAC_Channel, FunctionalState NewState);
#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL)
void DAC_ITConfig(uint32_t DAC_Channel, uint32_t DAC_IT, FunctionalState NewState);
#endif
void DAC_DMACmd(uint32_t DAC_Channel, FunctionalState NewState);
void DAC_SoftwareTriggerCmd(uint32_t DAC_Channel, FunctionalState NewState);
void DAC_DualSoftwareTriggerCmd(FunctionalState NewState);
void DAC_WaveGenerationCmd(uint32_t DAC_Channel, uint32_t DAC_Wave, FunctionalState NewState);
void DAC_SetChannel1Data(uint32_t DAC_Align, uint16_t Data);
void DAC_SetChannel2Data(uint32_t DAC_Align, uint16_t Data);
void DAC_SetDualChannelData(uint32_t DAC_Align, uint16_t Data2, uint16_t Data1);
uint16_t DAC_GetDataOutputValue(uint32_t DAC_Channel);
#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL)
FlagStatus DAC_GetFlagStatus(uint32_t DAC_Channel, uint32_t DAC_FLAG);
void DAC_ClearFlag(uint32_t DAC_Channel, uint32_t DAC_FLAG);
ITStatus DAC_GetITStatus(uint32_t DAC_Channel, uint32_t DAC_IT);
void DAC_ClearITPendingBit(uint32_t DAC_Channel, uint32_t DAC_IT);
4 代码范例
dac.c
void Dac1_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;DAC_InitTypeDef DAC_InitType;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE ); //使能PORTA通道时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE ); //使能DAC通道时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; // 端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_SetBits(GPIOA,GPIO_Pin_4); //PA.4 输出高DAC_InitType.DAC_Trigger=DAC_Trigger_None; //不使用触发功能 TEN1=0DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_None;//不使用波形发生DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;//屏蔽、幅值设置DAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_Disable ; //DAC1输出缓存关闭 BOFF1=1DAC_Init(DAC_Channel_1,&DAC_InitType); //初始化DAC通道1DAC_Cmd(DAC_Channel_1, ENABLE); //使能DAC1DAC_SetChannel1Data(DAC_Align_12b_R, 0); //12位右对齐数据格式设置DAC值
}//设置通道1输出电压
//vol:0~3300,代表0~3.3V
void Dac1_Set_Vol(u16 vol)
{float temp=vol;temp/=1000;temp=temp*4096/3.3;DAC_SetChannel1Data(DAC_Align_12b_R,temp);//12位右对齐数据格式设置DAC值
}
参考:正点原子源码
《STM32中/英文手册》
STM32-快速上手DAC相关推荐
- 启明云端WT32-CAM操作视频,让你快速上手ESP32camera应用
启明云端WT32-CAM操作视频,让你快速上手ESP32camera应用 首先拿到开发板后,在印有Wireless-tag.com这一面的VCC GND 处供 3.3V 电源即可启动开发板 上电后开发 ...
- 新手必看 | RVB2601开发板快速上手指南
简介:技术解码栏目:是面向开发者详细解读芯片开放社区(OCC)上关于处理器.芯片.基础软件平台.集成开发环境及应用开发平台的相关技术,方便开发者学习及快速上手,提升开发效率. 之前我们推送了RISC- ...
- 第2章 初学 emWin 的准备工作及其快速上手
以下内容转载自安富莱电子论坛:http://forum.armfly.com/forum.php?mod=viewthread&tid=24552&extra=page%3D3%26f ...
- 合泰HT32F52352入门教程(# 1W+字 博客帮您快速上手,拿奖不是梦 #)
这篇文章适合已经有单片机基础,比如STM32.熟悉STM32库函数(标准库最好,HAL库要适应一下手写配置) 这篇文章的代码均经过本人烧写验证,帮你快速上手HT32F52352 如果觉得对你有帮助,记 ...
- 【快速上手mac必备】常用优质mac软件推荐(音视频、办公、软件开发、辅助工具、系统管理、云存储)
本文章的主要内容是我作为一名大四学生.准程序员.up主这三种身份来给大家推荐一下 mac 上好用的软件以及工具.本人也是从去年9月份开始从windows阵营转移到了mac阵营,刚开始使用的时候,也曾主 ...
- 【转】Vue.js 2.0 快速上手精华梳理
Vue.js 2.0 快速上手精华梳理 Sandy 发掘代码技巧:公众号:daimajiqiao 自从Vue2.0发布后,Vue就成了前端领域的热门话题,github也突破了三万的star,那么对于新 ...
- 『转载』Debussy快速上手(Verdi相似)
『转载』Debussy快速上手(Verdi相似) Debussy 是NOVAS Software, Inc(思源科技)发展的HDL Debug & Analysis tool,这套软体主要不是 ...
- [转载]ESFramework 4.0 快速上手(15) -- 客户端登录验证
ESFramework 4.0 快速上手(15) -- 客户端登录验证 在之前版本的Rapid引擎中,是没有提供客户端登陆验证的机制的,如果要验证用户的帐号密码信息,我们只有自己手动通过自定义信息来实 ...
- WijmoJS 2019V1正式发布:全新的在线 Demo 系统,助您快速上手,开发无忧
2019独角兽企业重金招聘Python工程师标准>>> 下载WijmoJS 2019 v1 WijmoJS是为企业应用程序开发而推出的一系列包含HTML5和JavaScript的开发 ...
- react 快速上手开发_React中测试驱动开发的快速指南
react 快速上手开发 by Michał Baranowski 通过MichałBaranowski React中测试驱动开发的快速指南 (A quick guide to test-driven ...
最新文章
- 企业的7种工作管理最佳实践
- 皮一皮:能到大四也是不容易了...
- 如何仅花25美元并在3小时内完成ImageNet训练?
- Shell判断参数是否为数字的6种方法(是否为整形)
- 几何画板自定义工具_几何画板sketchpad下载-几何画板sketchpad免费版下载v5.0.6.5
- 3. Javascript 对象
- 图片版坦克大战源代码之图片处理类(一)
- JavaWeb07-HTML篇笔记(三)
- 用reloadRowsAtIndexPaths刷新单个cell 跳动问题
- w ndows7如何清理垃圾,Win7系统垃圾一键清理工具 一键清除windows7系统垃圾文件
- mfp服务器控制中心,固网1008MFP驱动
- WPF+VB.net制作桌面股票小助手
- 浅谈核桃的栽培技术与种植管理方法
- 浙江大学计算机学院陈越教授,科学网—浙大教授陈越:快乐教学 行者无疆
- 100量子比特量子计算机,51量子比特模拟器问世,大规模量子计算机迈出重要一步...
- 【牛客网-公司真题-前端入门篇】——58同城2021校招笔试-前端
- 各种十进制转十六进制的方法
- python实现括号匹配算法_Python实现括号匹配方法详解
- PX4固定翼调试校准流程及实验相关问题记录分析
- JS制作蔡徐坤打篮球小游戏(鸡你太美?)
热门文章
- 面试让我手写红黑树?
- 鸿蒙不为手机而生,不是为手机而生,鸿蒙到底能做什么?答案让花粉始料未及...
- DOSBox下玩DOS经典GameZ或ZED游戏
- ElasticSearch学习_陶文2_时间序列数据库的秘密(2)——索引
- jpa日志 logback_SpringBoot | 第二十五章:日志管理之自定义Appender
- Nancy视图引擎(View Engines)
- 32位计算机直接访问的内存,32位64位-32位计算机可以访问多少内存?
- 如何用万用表判断发光二极管/LED的好坏
- 圣诞头像生成2021年版
- 适老装修改造 厨卫翻新如何玩出新花样