关于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相关推荐

  1. 启明云端WT32-CAM操作视频,让你快速上手ESP32camera应用

    启明云端WT32-CAM操作视频,让你快速上手ESP32camera应用 首先拿到开发板后,在印有Wireless-tag.com这一面的VCC GND 处供 3.3V 电源即可启动开发板 上电后开发 ...

  2. 新手必看 | RVB2601开发板快速上手指南

    简介:技术解码栏目:是面向开发者详细解读芯片开放社区(OCC)上关于处理器.芯片.基础软件平台.集成开发环境及应用开发平台的相关技术,方便开发者学习及快速上手,提升开发效率. 之前我们推送了RISC- ...

  3. 第2章 初学 emWin 的准备工作及其快速上手

    以下内容转载自安富莱电子论坛:http://forum.armfly.com/forum.php?mod=viewthread&tid=24552&extra=page%3D3%26f ...

  4. 合泰HT32F52352入门教程(# 1W+字 博客帮您快速上手,拿奖不是梦 #)

    这篇文章适合已经有单片机基础,比如STM32.熟悉STM32库函数(标准库最好,HAL库要适应一下手写配置) 这篇文章的代码均经过本人烧写验证,帮你快速上手HT32F52352 如果觉得对你有帮助,记 ...

  5. 【快速上手mac必备】常用优质mac软件推荐(音视频、办公、软件开发、辅助工具、系统管理、云存储)

    本文章的主要内容是我作为一名大四学生.准程序员.up主这三种身份来给大家推荐一下 mac 上好用的软件以及工具.本人也是从去年9月份开始从windows阵营转移到了mac阵营,刚开始使用的时候,也曾主 ...

  6. 【转】Vue.js 2.0 快速上手精华梳理

    Vue.js 2.0 快速上手精华梳理 Sandy 发掘代码技巧:公众号:daimajiqiao 自从Vue2.0发布后,Vue就成了前端领域的热门话题,github也突破了三万的star,那么对于新 ...

  7. 『转载』Debussy快速上手(Verdi相似)

    『转载』Debussy快速上手(Verdi相似) Debussy 是NOVAS Software, Inc(思源科技)发展的HDL Debug & Analysis tool,这套软体主要不是 ...

  8. [转载]ESFramework 4.0 快速上手(15) -- 客户端登录验证

    ESFramework 4.0 快速上手(15) -- 客户端登录验证 在之前版本的Rapid引擎中,是没有提供客户端登陆验证的机制的,如果要验证用户的帐号密码信息,我们只有自己手动通过自定义信息来实 ...

  9. WijmoJS 2019V1正式发布:全新的在线 Demo 系统,助您快速上手,开发无忧

    2019独角兽企业重金招聘Python工程师标准>>> 下载WijmoJS 2019 v1 WijmoJS是为企业应用程序开发而推出的一系列包含HTML5和JavaScript的开发 ...

  10. react 快速上手开发_React中测试驱动开发的快速指南

    react 快速上手开发 by Michał Baranowski 通过MichałBaranowski React中测试驱动开发的快速指南 (A quick guide to test-driven ...

最新文章

  1. 企业的7种工作管理最佳实践
  2. 皮一皮:能到大四也是不容易了...
  3. 如何仅花25美元并在3小时内完成ImageNet训练?
  4. Shell判断参数是否为数字的6种方法(是否为整形)
  5. 几何画板自定义工具_几何画板sketchpad下载-几何画板sketchpad免费版下载v5.0.6.5
  6. 3. Javascript 对象
  7. 图片版坦克大战源代码之图片处理类(一)
  8. JavaWeb07-HTML篇笔记(三)
  9. 用reloadRowsAtIndexPaths刷新单个cell 跳动问题
  10. w ndows7如何清理垃圾,Win7系统垃圾一键清理工具 一键清除windows7系统垃圾文件
  11. mfp服务器控制中心,固网1008MFP驱动
  12. WPF+VB.net制作桌面股票小助手
  13. 浅谈核桃的栽培技术与种植管理方法
  14. 浙江大学计算机学院陈越教授,科学网—浙大教授陈越:快乐教学 行者无疆
  15. 100量子比特量子计算机,51量子比特模拟器问世,大规模量子计算机迈出重要一步...
  16. 【牛客网-公司真题-前端入门篇】——58同城2021校招笔试-前端
  17. 各种十进制转十六进制的方法
  18. python实现括号匹配算法_Python实现括号匹配方法详解
  19. PX4固定翼调试校准流程及实验相关问题记录分析
  20. JS制作蔡徐坤打篮球小游戏(鸡你太美?)

热门文章

  1. 面试让我手写红黑树?
  2. 鸿蒙不为手机而生,不是为手机而生,鸿蒙到底能做什么?答案让花粉始料未及...
  3. DOSBox下玩DOS经典GameZ或ZED游戏
  4. ElasticSearch学习_陶文2_时间序列数据库的秘密(2)——索引
  5. jpa日志 logback_SpringBoot | 第二十五章:日志管理之自定义Appender
  6. Nancy视图引擎(View Engines)
  7. 32位计算机直接访问的内存,32位64位-32位计算机可以访问多少内存?
  8. 如何用万用表判断发光二极管/LED的好坏
  9. 圣诞头像生成2021年版
  10. 适老装修改造 厨卫翻新如何玩出新花样