STM32H743 DAC sofortiges Ausschalten (keine Fallzeit)
In unserem vorherigen Beitrag STM32H743 DAC Anstiegs-/Abfallzeit-Experimente haben wir gezeigt, dass der STM23H743 relativ lange Einschalt-/Ausschaltzeiten von ungefähr 950 Nanosekunden hat, was die Erzeugung schneller Rechtecksignale einschränkt:

Es gibt jedoch einen Trick, wie man Abfallzeiten beinahe 3 Größenordnungen besser erhält für den Sonderfall des Schaltens entweder auf Vollskala VDD oder auf GND.
Anstatt den DAC auf den neuen Wert zu setzen, können Sie einfach den DAC deaktivieren und den Rest dem GPIO überlassen. Dies erlaubt extrem schnelle Abfallzeiten von ungefähr 5ns.
Beachten Sie, dass das Umschalten des GPIO in den digitalen Modus, während der DAC an ist, keine Auswirkung zu haben scheint.
Bitte beachten Sie, dass ich keine Mühe darauf verwandt habe, den Messaufbau immun gegen die hohen Transienten zu machen, was zu einigen Oszillationen führt. Sie sollten eigene Messungen durchführen, wenn Sie spezifische Anforderungen haben.

DAC-Abfallzeit von 3/4-Vollskala-Wert (3072)
Beachten Sie, dass das schnelle Einschalten des DAC nicht im Rahmen dieses Beitrags liegt, aber beim Umschalten des DAC-Enable-Bits können Sie dennoch ziemlich leicht 250ns-Anstiegszeiten erhalten.

Codebeispiel
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();
}
}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;
}