STM32H743 DAC 瞬时关闭(无下降时间)
在我们之前的文章 STM32H743 DAC 上升/下降时间实验 中,我们展示了 STM23H743 具有相对较长的约 950 纳秒的开启/关闭时间,限制了快速矩形信号的生成:

然而,对于切换到满量程 VDD 或 GND 的特殊情况,有一个技巧可以获得几乎好 3 个数量级的下降时间。
与其将 DAC 设置为新值,你可以直接禁用 DAC 并让 GPIO 处理其余部分。这允许约 5ns 的极快下降时间。
注意,在 DAC 开启时将 GPIO 切换到数字模式似乎没有任何效果。
请注意,我没有采取任何措施使测量设置免受高瞬态的影响,导致一些振荡。如果你有特定要求,应该自己进行测量。

从 3/4 满量程值 (3072) 的 DAC 下降时间
注意,快速开启 DAC 超出了本文的范围,但在切换 DAC 使能位时,你仍然可以轻松获得 250ns 的上升时间。

代码示例
stm32h743_dac_init.c
void Init() {
DAC_ChannelConfTypeDef sConfig = {0};
// Initialize DAC
hdac.Instance = DAC1;
if (HAL_DAC_Init(&hdac) != HAL_OK)
{
// Initialization Error
__BKPT();
}
// Configure DAC channel
sConfig.DAC_Trigger = DAC_TRIGGER_NONE; // No trigger, free-running mode
sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
if (HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_1) != HAL_OK)
{
// Channel configuration Error
__BKPT();
}
// Enable DAC Channel and start the conversion
if (HAL_DAC_Start(&hdac, DAC_CHANNEL_1) != HAL_OK)
{
// Starting Error
__BKPT();
}
// Set DAC to some value, which won't be changed for this example
if (HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 3072) != HAL_OK)
{
// Setting DAC value Error
__BKPT();
}
}stm32h743_dac_pulse.c
void Pulse_On() {
// Enable DAC
hdac.Instance->CR |= DAC_CR_EN1;
// Set GPIO to analog mode
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_4;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
void Pulse_Off() {
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_4;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
// Clear EN1 bit of DAC_CR
hdac.Instance->CR &= ~DAC_CR_EN1;
}If this post helped you, please consider buying me a coffee or donating via PayPal to support research & publishing of new posts on TechOverflow