K210はじめに-ベアメタル開発(6)タイマーpwm

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

開発環境:kendryteIDE公式

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

(1)新しいフォルダを作成します06my_code_pwm

ギフト+地球

例-> pwmと入力->開発バージョンを選択->今すぐフォルダにダウンロード

インストールの依存関係

クリーン+ビルド

環境の構成が完了しました。コードの変更を始めましょう

(2)コードを変更する

PWMは第20章にあります

例もあります

将来の移植を容易にするために、2つのマクロ定義が定義されています

コードは次のように変更されます

PWMについて話しましょう

パラメータタイプは次のとおりです。

同様に、移植を容易にするために、最初にマクロ定義を作成します

初期化コードは次のとおりです

PWMセットのデューティサイクルを構成します

PWM出力を有効にし、最後にマスター割り込みスイッチをオンにします

タイマー割り込みサービス機能、ここでのルーチンは呼吸光(暗い->明るい->暗い->明るい)です、良い、変更する必要はありません

(3)ランプはどこにありますか?ランプを見つけてください

デバイス管理をクリックすると、彼が実際にTIMER1を構成していることがわかりました。

0を使用したタイマーデバイスは、IO17,18に対応するようにLEDに変更します

ただし、チャネル0のみを構成したため、光出力は1つだけで、次に1つの光を構成し、保存します。

ワンストップクリーン+ビルド+ダウンロード

(4)効果 

ライトはついていますが、呼吸効果がないようですか?

 

(5)見つかった問題

データシートに書かれている内容を思い出す前に、PWMをチャンネル1に30分以上変更しました。

 

構成をチャネル2に変更します

ワンストップで行く

効果 

呼吸灯があります

 

タイマーPWM学習が完了しました。次回お会いしましょう

 

コード

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

#define TIMER_DEVICE TIMER_DEVICE_0
#define TIMER_DEVICE_CH TIMER_CHANNEL_0

#define TIMER_PWM PWM_DEVICE_0
#define TIMER_PWM_CHN PWM_CHANNEL_1

int timer_callback(void *ctx) {
  static double cnt = 0.1;
  static int flag = 0;

  // 重新赋值PWM输出频率以及占空比
  pwm_set_frequency(TIMER_PWM, TIMER_PWM_CHN, 200000, cnt);

  // 三目运算,构成呼吸灯
  flag ? (cnt -= 0.01) : (cnt += 0.01);

  //越界判断
  if (cnt > 1.0) {
    cnt = 1.0;
    flag = 1;
  } else if (cnt < 0.0) {
    cnt = 0.0;
    flag = 0;
  }
}

int main(void) {
  /* Init Platform-Level Interrupt Controller(PLIC) */
  plic_init();  // 初始化中断
  /* Init timer */
  timer_init(TIMER_DEVICE);  //初始化定时器

  /* Set timer interval to 10ms (1e7ns) */
  // 配置定时器时间
  timer_set_interval(TIMER_DEVICE, TIMER_DEVICE_CH, 1e7);

  /* Set timer callback function with repeat method */
  // 绑定下中断回调函数(不带形参)
  timer_irq_register(TIMER_DEVICE, TIMER_DEVICE_CH, 0, 1, timer_callback, NULL);

  // 定时器0, 通道0,定时器回调函数,优先级
  // //上一节学的定时器,可以替代上面的注册函数吧 timer_set_irq(TIMER_DEVICE,
  // TIMER_DEVICE_CH, timer_callback, 1);

  /* Enable timer */
  //使能定时器
  timer_set_enable(TIMER_DEVICE, TIMER_DEVICE_CH, 1);

  /* Init PWM */
  // 初始化PWM
  pwm_init(TIMER_PWM);
  /* Set PWM to 200000Hz */
  // 设置PWM的频率 以及占空比
  pwm_set_frequency(TIMER_PWM, TIMER_PWM_CHN, 200000, 0.5);
  /* Enable PWM */
  // 启动产生PWM
  pwm_set_enable(TIMER_PWM, TIMER_PWM_CHN, 1);

  /* Enable global interrupt for machine mode of RISC-V */
  sysctl_enable_irq();  // 开中断
  while (1)
    ;
}

 

おすすめ

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