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); |