From c8968da343bedced90ba7e1a56e3ba7ee62172cc Mon Sep 17 00:00:00 2001 From: Dominic Clifton Date: Thu, 9 May 2019 15:03:31 +0900 Subject: [PATCH] [H7] Add PID-Audio support --- src/main/drivers/audio_stm32h7xx.c | 90 ++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 src/main/drivers/audio_stm32h7xx.c diff --git a/src/main/drivers/audio_stm32h7xx.c b/src/main/drivers/audio_stm32h7xx.c new file mode 100644 index 000000000..f184bb603 --- /dev/null +++ b/src/main/drivers/audio_stm32h7xx.c @@ -0,0 +1,90 @@ +/* + * This file is part of Cleanflight and Betaflight. + * + * Cleanflight and Betaflight are free software. You can redistribute + * this software and/or modify this software under the terms of the + * GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) + * any later version. + * + * Cleanflight and Betaflight are distributed in the hope that they + * will be useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this software. + * + * If not, see . + */ + +#include +#include +#include + +#include "platform.h" + +#include "common/maths.h" + +#include "drivers/audio.h" + +static DAC_HandleTypeDef hdac; +static TIM_HandleTypeDef handle; +static DAC_ChannelConfTypeDef sConfig; + +void audioSetupIO(void) +{ + __HAL_RCC_DAC12_CLK_ENABLE(); + __HAL_RCC_TIM6_CLK_ENABLE(); + + hdac.Instance = DAC1; + HAL_DAC_Init(&hdac); + + GPIO_InitTypeDef GPIO_InitStruct; + GPIO_InitStruct.Pin = GPIO_PIN_4; + GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); +} + +void audioGenerateWhiteNoise(void) +{ + handle.Instance = TIM6; + handle.Init.Period = 0xFF; + handle.Init.Prescaler = 0; + + handle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + handle.Init.CounterMode = TIM_COUNTERMODE_UP; + handle.Init.RepetitionCounter = 0; + HAL_TIM_Base_Init(&handle); + + TIM_MasterConfigTypeDef sMasterConfig; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE; + sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE; + HAL_TIMEx_MasterConfigSynchronization(&handle, &sMasterConfig); + + HAL_TIM_Base_Start(&handle); + + sConfig.DAC_Trigger = DAC_TRIGGER_T6_TRGO; + sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE; + HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_1); + + HAL_DACEx_NoiseWaveGenerate(&hdac, DAC_CHANNEL_1, DAC_LFSRUNMASK_BITS10_0); + HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_L, 0xcd00); + + HAL_DAC_Start(&hdac, DAC_CHANNEL_1); +} + +#define TONE_SPREAD 8 + +void audioPlayTone(uint8_t tone) +{ + handle.Init.Period = 64 + (MAX(TONE_MIN,MIN(tone, TONE_MAX)) * TONE_SPREAD); + TIM_Base_SetConfig(handle.Instance, &handle.Init); +} + +void audioSilence(void) +{ + HAL_DAC_Stop(&hdac, DAC_CHANNEL_1); + HAL_TIM_Base_Stop(&handle); +}