Просмотр исходного кода

fix to work with external audio without audio mode jerk

LTVA1 2 лет назад
Родитель
Сommit
4d175ab414
1 измененных файлов с 57 добавлено и 4 удалено
  1. 57 4
      flizzer_tracker_hal.c

+ 57 - 4
flizzer_tracker_hal.c

@@ -40,12 +40,61 @@ void tracker_engine_timer_isr(
 void sound_engine_PWM_timer_init(bool external_audio_output) // external audio on pin PA6
 {
     if(external_audio_output) {
-        furi_hal_gpio_init_ex(
-            &gpio_ext_pa6, GpioModeAltFunctionPushPull, GpioPullNo, GpioSpeedLow, GpioAltFn14TIM16);
-
-        if(furi_hal_speaker_is_mine()) {
+        /*if(furi_hal_speaker_is_mine()) {
             furi_hal_speaker_release();
+        }*/
+
+        //LL_TIM_DisableAllOutputs(SPEAKER_PWM_TIMER);
+        //LL_TIM_DisableCounter(SPEAKER_PWM_TIMER);
+
+        if(!(furi_hal_speaker_is_mine())) {
+            if(furi_hal_speaker_acquire(1000)) {
+                LL_TIM_DisableAllOutputs(SPEAKER_PWM_TIMER);
+                LL_TIM_DisableCounter(SPEAKER_PWM_TIMER);
+
+                LL_TIM_InitTypeDef TIM_InitStruct = {0};
+                LL_TIM_OC_InitTypeDef TIM_OC_InitStruct = {0};
+
+                TIM_InitStruct.Prescaler = 0;
+                TIM_InitStruct.Autoreload =
+                    1023; // 10-bit PWM resolution at around 60 kHz PWM rate
+                TIM_InitStruct.CounterMode = LL_TIM_COUNTERMODE_UP;
+                LL_TIM_Init(SPEAKER_PWM_TIMER, &TIM_InitStruct);
+
+                TIM_OC_InitStruct.OCMode = LL_TIM_OCMODE_PWM1;
+                TIM_OC_InitStruct.OCState = LL_TIM_OCSTATE_ENABLE;
+                TIM_OC_InitStruct.CompareValue = 0;
+                LL_TIM_OC_Init(SPEAKER_PWM_TIMER, SPEAKER_PWM_TIMER_CHANNEL, &TIM_OC_InitStruct);
+
+                SPEAKER_PWM_TIMER->CNT = 0;
+
+                LL_TIM_EnableAllOutputs(SPEAKER_PWM_TIMER);
+                LL_TIM_EnableCounter(SPEAKER_PWM_TIMER);
+            }
         }
+
+        furi_hal_gpio_init(&gpio_ext_pa6, GpioModeAnalog, GpioPullNo, GpioSpeedLow);
+
+        LL_TIM_InitTypeDef TIM_InitStruct = {0};
+        LL_TIM_OC_InitTypeDef TIM_OC_InitStruct = {0};
+
+        TIM_InitStruct.Prescaler = 0;
+        TIM_InitStruct.Autoreload = 1023; // 10-bit PWM resolution at around 60 kHz PWM rate
+        TIM_InitStruct.CounterMode = LL_TIM_COUNTERMODE_UP;
+        LL_TIM_Init(SPEAKER_PWM_TIMER, &TIM_InitStruct);
+
+        TIM_OC_InitStruct.OCMode = LL_TIM_OCMODE_PWM1;
+        TIM_OC_InitStruct.OCState = LL_TIM_OCSTATE_ENABLE;
+        TIM_OC_InitStruct.CompareValue = 0;
+        LL_TIM_OC_Init(SPEAKER_PWM_TIMER, SPEAKER_PWM_TIMER_CHANNEL, &TIM_OC_InitStruct);
+
+        SPEAKER_PWM_TIMER->CNT = 0;
+
+        LL_TIM_EnableAllOutputs(SPEAKER_PWM_TIMER);
+        LL_TIM_EnableCounter(SPEAKER_PWM_TIMER);
+
+        furi_hal_gpio_init(&gpio_ext_pa6, GpioModeAnalog, GpioPullNo, GpioSpeedLow);
+        //furi_hal_gpio_init_ex(&gpio_ext_pa6, GpioModeAltFunctionPushPull, GpioPullNo, GpioSpeedLow, GpioAltFn14TIM16);
     }
 
     else {
@@ -76,7 +125,11 @@ void sound_engine_PWM_timer_init(bool external_audio_output) // external audio o
         }
 
         furi_hal_gpio_init(&gpio_ext_pa6, GpioModeAnalog, GpioPullNo, GpioSpeedLow);
+        //furi_hal_gpio_init_ex(&gpio_ext_pa6, GpioModeAltFunctionPushPull, GpioPullNo, GpioSpeedLow, GpioAltFn14TIM16);
     }
+
+    furi_hal_gpio_init_ex(
+        &gpio_ext_pa6, GpioModeAltFunctionPushPull, GpioPullNo, GpioSpeedLow, GpioAltFn14TIM16);
 }
 
 void sound_engine_set_audio_output(bool external_audio_output) {