Приложение Windows 10 Iot Core аварийно завершает работу, если я пытаюсь открыть вывод PWM - PullRequest
2 голосов
/ 30 мая 2019

Я хочу открыть ШИМ-штырек к моему зуммеру. Но если я пытаюсь вызвать метод pwmController.OpenPin(6), приложение вылетает с System.Runtime.InteropServices.SEHException.

Я уже дважды проверил источники сэмплов, такие как ms-iot-samples . Но я не вижу своих проблем.

Идея заключалась в том, что некоторые разрешения отсутствуют, но если я попытаюсь добавить, например, <iot:Capability Name="lowLevelDevices" />, я больше не смогу собрать приложение.

Источник

private PwmPin buzzerPin;
private PwmController pwmController;

public RainbowHAT()
{
    // ... do something else
    InitAsync();
}

private async void InitAsync()
{
    Logger.Log(this, "Init");

    // Setup PWM controller.
    if (LightningProvider.IsLightningEnabled)
    {
        LowLevelDevicesController.DefaultProvider = LightningProvider.GetAggregateProvider();
    }

    var pwmControllers = await PwmController.GetControllersAsync(LightningPwmProvider.GetPwmProvider());
    if (pwmControllers == null || pwmControllers.Count < 2)
    {
        throw new OperationCanceledException("Operation canceled due missing GPIO controller");
    }

    pwmController = pwmControllers[1];
    pwmController.SetDesiredFrequency(50);

    // Setup buzzer
    buzzerPin = pwmController.OpenPin(13); <-- CRASH
    buzzerPin.SetActiveDutyCyclePercentage(0.05);
    buzzerPin.Start();
}

Я также попробовал следующий совет, чтобы уменьшить минимальную требуемую версию Windows , но это тоже не помогает.

1 Ответ

1 голос
/ 31 мая 2019

ШИМ-контроллеру требуется поддержка Lightning. Поэтому вам нужно установить драйвер контроллера как Драйвер с прямым отображением памяти . Здесь - пример о ШИМ на Raspberry Pi.

enter image description here

Вам также необходимо изменить код следующим образом:

    private async void InitAsync()
    {
        Logger.Log(this, "Init");

        // Setup PWM controller.
        if (LightningProvider.IsLightningEnabled)
        {
            var pwmControllers = await PwmController.GetControllersAsync(LightningPwmProvider.GetPwmProvider());
            if (pwmControllers == null || pwmControllers.Count < 2)
            {
                throw new OperationCanceledException("Operation canceled due missing GPIO controller");
            }

            pwmController = pwmControllers[1];
            pwmController.SetDesiredFrequency(50);

            // Setup buzzer
            buzzerPin = pwmController.OpenPin(13);
            buzzerPin.SetActiveDutyCyclePercentage(0.05);
            buzzerPin.Start();
        }
    }
...