K210はじめに-ベアメタル開発(5)タイマータイミング

開発ボード:K210 AIRVR3バージョンwidora

開発環境:kendryteIDE公式

必要なリファレンスドキュメント:スタンドアロンSDKプログラミングガイドv0.5.0、およびWidora回路図

(1)新しいフォルダを作成します05my_code_timer

ギフト+地球

例->タイマーを検索し、開発バージョン(開発)を選択して、今すぐフォルダーにダウンロードします

古いルールインストールの依存関係

クリーン+ビルド

環境がセットアップされ、コードが変更されます。

(2)コードを変更する

第18章のタイマー

ドキュメントに例があります

LEDライトを使用するには、開発ボードの回路図も確認してください

LEDがIO17および18に対応していることがわかりました

コード初期化割り込みについて話を始めましょう

タイマーを初期化する

このパラメーターの入力方法を参照してください。関数名を右クリックして、定義にジャンプします。

タイマーは3つあります。タイマー0を使用してTIMER_DEVICE_0を過去にコピーします。

時間間隔の設定(タイマーの設定)

パラメータ1、今すぐタイマー0を入力します(TIMER_DEVICE_0)

パラメータ2彼はここに4つのチャンネルを持っています、私はかわいいです、それが何を意味するのかわかりません、チャンネル0に記入して試してください

パラメータ3はタイミング時間を入力し、彼が書き込む単位はns(ナノ秒)です。

私はここでタイミング1ms = 1000us = 1000000nsです

登録と構成の中断

タイマーを有効にする

パラメータ1はタイマー番号を入力し、パラメータ2はタイマーのチャネルを入力し、パラメータ3は有効かどうかを入力します

すべてを書き込んだ後、トータル割り込みをオンにします

次に、LEDライト構成を追加します

ヘッダーファイル#include "gpio.h"を追加し、依存関係をインストール->クリーン+ビルド

次に、前に学習したLED構成コードを追加します

以下にタイマー割り込み関数を記述してください

200msフリップLED1

500msフリップLED2

2つのフラグの範囲は異なり、影響はありません

開発ボードのプラグイン、ワンストップサービス 

クリーン+ビルド+ダウンロード

効果

2つのLEDが点滅するだけです(異なる期間)、他に何がありますか

 

タイマー割り込み学習が完了しました。またお会いしましょう

 

コード

#include <fpioa.h>
#include <plic.h>
#include <pwm.h>
#include <stdio.h>
#include <sysctl.h>
#include <syslog.h>
#include <timer.h>

#include "gpio.h"

int timer_callback(void)  // 1ms来一次
{
  static uint16_t flag200ms = 0;
  static uint16_t flag500ms = 0;

  if (++flag200ms == 200) {
    static uint8_t flag = 0;
    if (flag)
      gpio_set_pin(0, GPIO_PV_LOW);  // LED0
    else
      gpio_set_pin(0, GPIO_PV_HIGH);

    flag200ms = 0;
    flag = !flag;
  }

  if (++flag500ms == 500) {
    static uint8_t flag = 0;
    if (flag)
      gpio_set_pin(1, GPIO_PV_LOW);  // LED1
    else
      gpio_set_pin(1, GPIO_PV_HIGH);

    flag500ms = 0;
    flag = !flag;
  }
}

int main(void) {
  /* Init Platform-Level Interrupt Controller(PLIC) */
  // 初始化中断模块
  plic_init();

  gpio_init();
  fpioa_set_function(17, FUNC_GPIO0);
  fpioa_set_function(18, FUNC_GPIO1);
  gpio_set_drive_mode(0, GPIO_DM_OUTPUT);
  gpio_set_drive_mode(1, GPIO_DM_OUTPUT);
  gpio_set_pin(0, GPIO_PV_LOW);  // 熄灭LED
  gpio_set_pin(1, GPIO_PV_LOW);

  timer_init(TIMER_DEVICE_0);  //定时器0
  // 参数1 定时器0, 参数2定时器通道,参数3 定时时间(纳秒)
  timer_set_interval(TIMER_DEVICE_0, TIMER_CHANNEL_0, 1000000);
  // 定时器0, 通道0,定时器回调函数,优先级
  timer_set_irq(TIMER_DEVICE_0, TIMER_CHANNEL_0, timer_callback, 1);
  // 定时器0, 通道0, 使能(1)/失效(0)
  timer_set_enable(TIMER_DEVICE_0, TIMER_CHANNEL_0, 1);

  sysctl_enable_irq();

  while (1)  // 等待中断
    ;
}

 

おすすめ

転載: blog.csdn.net/jwdeng1995/article/details/108032724