開発ボード: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) // 等待中断
;
}