打印

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

[复制链接]
241|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
棋王高手|  楼主 | 2018-8-1 19:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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);

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

378

主题

378

帖子

0

粉丝