0

説明されたプロ Devboard で Atmel SAMB11 に問題が発生しました。Atmel から非常に単純な例をロードしました。この例では、32KHz タイマーが初期化されて µC をスリープから復帰させ、LED をオンにします。問題は、コントローラーがまったくスリープしないことです。LED をただちにアクティブにするだけで、割り込みを待ちません。

#include <asf.h>

// Callback Func to enable LED
static void aon_sleep_timer_callback(void)
{
    gpio_pin_set_output_level(LED_0_PIN, LED_0_ACTIVE);
}
//Configure LED
static void configure_gpio_pins(void)
{
    struct gpio_config config_gpio_pin;
    gpio_get_config_defaults(&config_gpio_pin);
    config_gpio_pin.direction = GPIO_PIN_DIR_OUTPUT;
    gpio_pin_set_config(LED_0_PIN, &config_gpio_pin);
    gpio_pin_set_output_level(LED_0_PIN, LED_0_INACTIVE);
}
// Configure Timer with 10sec to overflow
static void configure_aon_sleep_timer(void)
{
    struct aon_sleep_timer_config config_aon_sleep_timer;
    aon_sleep_timer_get_config_defaults(&config_aon_sleep_timer);
    config_aon_sleep_timer.counter = 320000; // Wait about 10sec
    aon_sleep_timer_init(&config_aon_sleep_timer);
}
// Configure Callback and enable Interrupt
static void configure_aon_sleep_timer_callback(void)
{
    aon_sleep_timer_register_callback(aon_sleep_timer_callback);
    NVIC_EnableIRQ(AON_SLEEP_TIMER_IRQn);
}

int main(void)
{
    // Setup Clock, LED and Timer
    system_clock_config(CLOCK_RESOURCE_XO_26_MHZ, CLOCK_FREQ_26_MHZ);
    configure_gpio_pins();
    configure_aon_sleep_timer();
    configure_aon_sleep_timer_callback();

    // wait for timer to be active
    while(!aon_sleep_timer_sleep_timer_active());
    // Go to sleep
    asm volatile ("wfi");
    asm volatile ("nop");
    // Enable LED immediately if sleep doesn't work
    gpio_pin_set_output_level(LED_0_PIN, LED_0_ACTIVE);
    while (true) {}
}

コードは自明のようですが、WFI コマンドはここでは機能しません。誰でも助けることができますか?

4

2 に答える 2

1

Prestige Worldwideによる回答に追加するだけです。

AO_GPIO0/1/2 が Low (プルダウンを推奨) であること、および AON スリープ タイマー割り込みが発生していないことを確認してください。これにより、ULP から SAMB11 がウェイクアップされます。

また、SWD でデバッグ セッションを実行している間は、ULP モードが期待どおりに動作しないように見えることにも注意してください。

デバッグとスリープ/ウェイクアップを実行すると、あらゆる種類の奇妙な動作が発生しましたが、デバッグしていないときに同じコードを実行すると、まったく問題はありませんでした。これは Atmel ICE を使用していたことに注意してください。Xplored ボードには EDBG が含まれており、このデバッガは ULP で問題なく動作するようです。

再開コールバックが一度も発生したことがありません。ASF のバグかもしれません。ただし、プラットフォームの待機後にすべての GPIO/デバイスをセットアップできるため、必要ありません。

于 2016-08-02T12:27:21.560 に答える
0

WFI 呼び出しは機能しますが、呼び出された直後に割り込みを受け取るだけです。これにより、WFI 呼び出しのブロックが停止し、実行が次の行に続きます。

// Go to sleepメイン関数が戻ることを可能にする以下のすべてを安全に削除できます。AON タイマーは引き続きそのコールバックを実行します。ただし、このアプローチにはいくつかの潜在的な欠点があります。

  • これにより、SAMB11 が低電力モードに移行できなくなります。
  • これにより、main の最後にある while ループが削除されます。現在の状態では while ループは必要ありませんが、後でコードを追加する計画があるかもしれません。

以下は、AON を構成し、低電力モードを使用するように SAMB11 を構成し、プラットフォームおよび/または BLE イベントを待機するループの例です。現在、ループが受け取るイベントはありません。ループでイベントを受信する場合は、AON コールバックを変更してat_ble_event_user_defined_post関数でイベントをポストするかmain()、ループに入る前に BLE モジュールを構成するように変更できます。

この例をコンパイルするには、ASF ウィザードを使用して BLE モジュールをプロジェクトに追加します。

#include <asf.h>
#include "platform.h"

// Configure LED
static void configure_gpio_pins(void)
{
    struct gpio_config config_gpio_pin;
    gpio_get_config_defaults(&config_gpio_pin);
    config_gpio_pin.direction = GPIO_PIN_DIR_OUTPUT;
    gpio_pin_set_config(LED_0_PIN, &config_gpio_pin);
    gpio_pin_set_output_level(LED_0_PIN, LED_0_INACTIVE);
}

// Callback Func to toggle LED
static bool led_is_on = false;
static void aon_sleep_timer_callback(void)
{
    configure_gpio_pins();
    if(led_is_on) {
        gpio_pin_set_output_level(LED_0_PIN, LED_0_INACTIVE);
        led_is_on = false;
    } else {
        gpio_pin_set_output_level(LED_0_PIN, LED_0_ACTIVE);
        led_is_on = true;
    }
}

// Configure Timer to fire periodically
static void configure_aon_sleep_timer(void)
{
    struct aon_sleep_timer_config config_aon_sleep_timer;
    aon_sleep_timer_get_config_defaults(&config_aon_sleep_timer);
    config_aon_sleep_timer.counter = 32000; // Wait about 1 sec
    config_aon_sleep_timer.mode = AON_SLEEP_TIMER_RELOAD_MODE;
    aon_sleep_timer_init(&config_aon_sleep_timer);
}
// Configure Callback and enable Interrupt
static void configure_aon_sleep_timer_callback(void)
{
    aon_sleep_timer_register_callback(aon_sleep_timer_callback);
    NVIC_EnableIRQ(AON_SLEEP_TIMER0_IRQn);
}

int main(void)
{
    // Setup Clock
    system_clock_config(CLOCK_RESOURCE_XO_26_MHZ, CLOCK_FREQ_26_MHZ);

    plf_drv_status plf_status;
    if((plf_status = platform_driver_init()) == STATUS_SUCCESS) {

        // Setup LED and Timer
        configure_gpio_pins();
        configure_aon_sleep_timer();
        configure_aon_sleep_timer_callback();

        // wait for timer to be active
        while(!aon_sleep_timer_sleep_timer_active());

        // Go to sleep
        release_sleep_lock();
        while(true) {
            // Replace platform_event_wait with at_ble_event_get if you would like to read the received event.
            plf_status = platform_event_wait(0);
        }
    }
}

WFI に関して、次の例は、ほとんどの割り込みをオフにし、WFI を使用してブロックする方法を示していますmain()。割り込みを受信するたびに LED がトグルします。これらの割り込みが最初に有効になっている理由がわからないため、これを使用することはお勧めしません。これは、WFI が SAMB11 でどのようにブロックできるかを示すことを目的としています。

#include <asf.h>
#include "platform.h"

// Configure LED
static void configure_gpio_pins(void)
{
    struct gpio_config config_gpio_pin;
    gpio_get_config_defaults(&config_gpio_pin);
    config_gpio_pin.direction = GPIO_PIN_DIR_OUTPUT;
    gpio_pin_set_config(LED_0_PIN, &config_gpio_pin);
    gpio_pin_set_output_level(LED_0_PIN, LED_0_INACTIVE);
}

// Callback Func to toggle LED
static bool led_is_on = false;
static void toggle_led(void)
{
    configure_gpio_pins();
    if(led_is_on) {
        gpio_pin_set_output_level(LED_0_PIN, LED_0_INACTIVE);
        led_is_on = false;
    } else {
        gpio_pin_set_output_level(LED_0_PIN, LED_0_ACTIVE);
        led_is_on = true;
    }
}

int main(void)
{
    // Setup Clock
    system_clock_config(CLOCK_RESOURCE_XO_26_MHZ, CLOCK_FREQ_26_MHZ);

    // Clear all interrupts.
    NVIC->ICER[0] = 0xFFFFFFFF;

    // During testing, interrupts were received about once per second; stopped receiving interrupts (LED stopped flashing) after about 2 minutes.
    int loop_count = 0;
    while(true) {
        __WFI();
        toggle_led();
    }
}
于 2016-06-11T23:07:45.683 に答える