【问题标题】:Windows 10 Iot Core app crashes if I try to open a PWM pin如果我尝试打开 PWM 引脚,Windows 10 Iot Core 应用程序会崩溃
【发布时间】:2019-05-30 13:03:24
【问题描述】:

我想为蜂鸣器打开一个 PWM 引脚。但如果我尝试调用 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();
}

我也尝试了以下tip to reduce the min required Windows version,但这也无济于事。

【问题讨论】:

    标签: c# windows-10-iot-core pwm


    【解决方案1】:

    PWM 控制器需要 Lightning 支持。所以需要将控制器驱动设置为Direct Memory Mapped DriverHere 是一个关于 Raspberry Pi 上 PWM 的示例。

    你还需要修改代码如下:

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

    【讨论】:

    • 完美。谢谢!
    • 注意:闪电驱动程序仍处于试验阶段。目前,当启用 DMM 驱动程序(闪电)时,对 I2C 控制器的访问会中断。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 2023-04-04
    相关资源
    最近更新 更多