硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3493|回复: 5
收起左侧

[HAL学习笔记] HAL库的DAC源文件stm32h7xx_hal_dac.c学习笔记(2019-05-30 V1.0)

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
发表于 2019-5-30 10:47:21 | 显示全部楼层 |阅读模式
1、STM32H7只有1个DAC,但是有两个独立的通道。
(1)DAC通道1可以接PA4引脚输出,或者接到片上其它外设,如果比较器,运放等
(2)DAC通道2可以接PA5引脚输出,或者接到片上其它外设,如果比较器,运放等

2、触发方式
(1)可以设置无触发DAC_TRIGGER_NONE
(2)EXTI触发EXTI Line 9
(3)定时器触发TIM1,TIM2,TIM4, TIM5, TIM6, TIM7,TIM8 和 TIM15 (DAC_TRIGGER_T1_TRGO, DAC_TRIGGER_T2_TRGO...)
(4)定时器触发HRTIM1,LPTIM1,LPTIM2(DAC_TRIGGER_HR1_TRGO1,DAC_TRIGGER_HR1_TRGO2,DAC_TRIGGER_LP1_OUT,DAC_TRIGGER_LP2_OUT)
(5)软件触发DAC_TRIGGER_SOFTWARE

3、通过使能输出缓冲来降低输出阻抗sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;

4、DAC的输出连接片上外设sConfig.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_ENABLE;

5、STM32H7中DAC,如果双通道引脚PA4和PA5仅使用一个,另一个会有波形效应。

6、支持正常模式和采样保持模式(这种模式是用于低功耗的)
(1)在采样保持模式下,DAC内核转换数据,然后保持数据转换电容器上的电压。 不转换时,DAC内核和样本之间的缓冲器完全关闭,DAC输出为三态,因此降低了整体功耗,但每次新转换前都需要稳定期。
(2)采样保持模式运行修改内部或者外部参考电压
(3)采样保持部分可以LSI时钟,也可以运行在几种低功耗模式下run mode, sleep mode & stop mode
使能LSI时钟,HAL_RCC_OscConfig配置RCC_OSCILLATORTYPE_LSI & RCC_LSI_ON
然后使能DAC_InitStructure.DAC_SampleAndHold = DAC_SAMPLEANDHOLD_ENABLE,并设置相关参数DAC_InitStructure.DAC_SampleAndHold = DAC_SAMPLEANDHOLD_ENABLE
& DAC_ChannelConfTypeDef.DAC_SampleAndHoldConfig.DAC_SampleTime,  DAC_HoldTime  & DAC_RefreshTime

7、支持出厂校准和用户自校准。

8、支持噪声波形和三角波生成,支持数据对齐方式设置。

9、DAC_OUTx = VREF+ * DOR / 4095,其实DOR是Data Output Register

比如需要DAC输出.07V,那么假设VREF+ = 3.3V, DAC_OUT1 = (3.3 * 868) / 4095 = 0.7V

10、每个通道都支持DMA请求。


工作流程:
1、
(1)函数HAL_DAC_Init初始化
(2)配置DAC_OUT1: PA4, DAC_OUT2: PA5引脚为模拟模式
(3)函数HAL_DAC_ConfigChannel配置通道参数
(4)函数HAL_DAC_Start() or HAL_DAC_Start_DMA()使能DAC

2、依次调用函数HAL_DACEx_GetTrimOffset,HAL_DACEx_SelfCalibrate和HAL_DACEx_SetUserTrimming进行校准。

3、查询模式
(1)函数HAL_DAC_Start() 启动
(2)函数HAL_DAC_GetValue()可以读取输出值
(3)函数HAL_DAC_Stop可以停止传输

4、
(1)函数HAL_DAC_Start_DMA()启动DMA方式转换
(2)DAC的数据传输一半的时候, HAL_DAC_ConvHalfCpltCallbackCh1() 或者 HAL_DACEx_ConvHalfCpltCallbackCh2() 会被调用
(3)DAC的数据传输完成的时候,HAL_DAC_ConvCpltCallbackCh1() 或者 HAL_DACEx_ConvHalfCpltCallbackCh2() 会被调用
(4)传输错误时,函数HAL_DAC_ErrorCallbackCh1会被调用
(5)DMA下移错误,会调用函数HAL_DAC_DMAUnderrunCallbackCh1()or HAL_DACEx_DMAUnderrunCallbackCh2()
(6)停止DAC的DMA方式,可以调用函数HAL_DAC_Stop_DMA

5、函数
(+) __HAL_DAC_ENABLE : Enable the DAC peripheral
(+) __HAL_DAC_DISABLE : Disable the DAC peripheral
(+) __HAL_DAC_CLEAR_FLAG: Clear the DAC's pending flags
(+) __HAL_DAC_GET_FLAG: Get the selected DAC's flag status


函数
HAL_StatusTypeDef HAL_DAC_Init(DAC_HandleTypeDef* hdac);
HAL_StatusTypeDef HAL_DAC_DeInit(DAC_HandleTypeDef* hdac);
void HAL_DAC_MspInit(DAC_HandleTypeDef* hdac);
void HAL_DAC_MspDeInit(DAC_HandleTypeDef* hdac);

HAL_StatusTypeDef HAL_DAC_Start(DAC_HandleTypeDef* hdac, uint32_t Channel);
HAL_StatusTypeDef HAL_DAC_Stop(DAC_HandleTypeDef* hdac, uint32_t Channel);
HAL_StatusTypeDef HAL_DAC_Start_DMA(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t* pData, uint32_t Length, uint32_t Alignment);
HAL_StatusTypeDef HAL_DAC_Stop_DMA(DAC_HandleTypeDef* hdac, uint32_t Channel);

void HAL_DAC_IRQHandler(DAC_HandleTypeDef* hdac);
HAL_StatusTypeDef HAL_DAC_SetValue(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t Alignment, uint32_t Data);
void HAL_DAC_ConvCpltCallbackCh1(DAC_HandleTypeDef* hdac);
void HAL_DAC_ConvHalfCpltCallbackCh1(DAC_HandleTypeDef* hdac);
void HAL_DAC_ErrorCallbackCh1(DAC_HandleTypeDef *hdac);
void HAL_DAC_DMAUnderrunCallbackCh1(DAC_HandleTypeDef *hdac);

HAL_StatusTypeDef HAL_DAC_ConfigChannel(DAC_HandleTypeDef* hdac, DAC_ChannelConfTypeDef* sConfig, uint32_t Channel);
uint32_t HAL_DAC_GetValue(DAC_HandleTypeDef* hdac, uint32_t Channel);

HAL_DAC_StateTypeDef HAL_DAC_GetState(DAC_HandleTypeDef* hdac);
uint32_t HAL_DAC_GetError(DAC_HandleTypeDef *hdac);



QQ截图20190530104609.jpg

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
 楼主| 发表于 2019-5-30 17:56:12 | 显示全部楼层
更新完毕。
回复

使用道具 举报

2

主题

569

回帖

575

积分

金牌会员

积分
575
发表于 2019-6-2 08:20:04 | 显示全部楼层
我也注意到了两通道相互影响的问题,用两条通道播放声音,只要其中一条通道播放,另一条通道也会滋滋叫。改电路,两条通道接独立的放大器,独立的SHDN控制就好了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
 楼主| 发表于 2019-6-3 09:14:28 | 显示全部楼层
leiyitan 发表于 2019-6-2 08:20
我也注意到了两通道相互影响的问题,用两条通道播放声音,只要其中一条通道播放,另一条通道也会滋滋叫。改 ...

配置下他的引脚状态就行。
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2020-3-27 10:37:51 | 显示全部楼层
DA输出用哪个寄出去可以直接手动更改DA值
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
 楼主| 发表于 2020-3-27 11:01:34 | 显示全部楼层
289466080 发表于 2020-3-27 10:37
DA输出用哪个寄出去可以直接手动更改DA值

这个参考此贴的例子即可,除非你输出直流,直接修改DR数据寄存器。

DAC+DMA的定时器触发输出:

http://www.armbbs.cn/forum.php?m ... &extra=page%3D1
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-5 19:25 , Processed in 0.244058 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表