開発ボード: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)
;
}