dp24をregisterを直接叩いてpwm

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
maxonK
Date:
Thu May 07 07:48:13 2015 +0000
Commit message:
dp24pin???????????pwm????????

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 04dd91d291e4 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Thu May 07 07:48:13 2015 +0000
@@ -0,0 +1,131 @@
+#include "mbed.h"
+
+// Reuse initialization code from the mbed library
+DigitalOut PIO0_8(dp1); // P1_18
+//dp24pwm初期化関数プロトタイプ宣言
+void CT32B0_MAT2_PWM_registerSet(unsigned int );
+//dp24pwmdutyセット関数プロトタイプ宣言
+void CT32B0_MAT2_PWM_dutySet(unsigned int , unsigned int);
+
+int main()
+{
+    //LEDチカチカ
+    //後ろから8bit目まで1を送る(たぶんそこがp0_8のビット位置)
+    unsigned int mask_pin8 = 1 << 8;
+    //レジスタ位置。メモリ上にあるのでポインタでアクセスできるぽい
+    volatile unsigned int *GPIO0DATA = (unsigned int *)(0x50000000 + 0x3FFC );
+
+    //PWM周波数
+    unsigned int pwmFrequency = 4;
+    //dp24pwm初期化
+    CT32B0_MAT2_PWM_registerSet(pwmFrequency);
+
+
+    while (true) {
+        //ビット和でセットする
+        //他のビットに影響を与えずに操作できる
+        *GPIO0DATA |= mask_pin8;
+        //dp24pwm出力を10%に
+        CT32B0_MAT2_PWM_dutySet(pwmFrequency,(1024/10));
+        wait(5);
+        //マスクのビット反転
+        mask_pin8 = ~mask_pin8;
+
+        //LOWにしたいビットだけ入れたのを反転したものをビット積でセット
+        *GPIO0DATA &= mask_pin8;
+        //マスクのビット反転
+        mask_pin8 = ~mask_pin8;
+        //dp24pwm出力を0%に
+        CT32B0_MAT2_PWM_dutySet(pwmFrequency,0);
+        wait(5);
+
+    }
+}
+
+void CT32B0_MAT2_PWM_registerSet(unsigned int pwmFrequency)
+{
+    //PWM機能設定用
+    //pwmピンのピン機能選択をmbedで行う
+    PwmOut MAT2(dp24);//CT32B0_MAT2
+    //PWM周波数
+    //unsigned int pwmFrequency = 4;
+    //各種レジスタ設定用ビットマスク
+    //システムAHBクロック制御レジスタマスク
+    unsigned int mask_SYSAHBCLKCTRL = 0x3 << 9;
+    //IO設定レジスタレジスタマスク
+    //unsigned int mask_IOCON_PIO0_1 = 1 << 1;
+    //タイマ制御レジスタマスク
+    //0ビット目を1にしてタイマ、プリスケールカウンタをイネーブルへ
+    unsigned int mask_TMR32B0TCR = 1;
+    //プリスケールレジスタマスク
+    unsigned int val_TMR32B0PR = 0;
+    //マッチ制御レジスタマスク
+    //0~3番のマッチレジスタの、PWM出力ピンにしたい番号以外のどれか1つをタイマ・カウンタ(TC)リセット用に設定する
+    //残りのマッチレジスタはディスエーブルにする
+    //mbedのピン配列ではタイマ0は3番をTCリセットに使うといいかも
+    unsigned int mask_TMR32B0MCR = 1 << 10;
+    //PWM制御レジスタマスク
+    //1つのタイマブロックで同時に、異なるデューティで動作できるPWMは3つまで
+    //CT32Bn_MATxピンの、TCリセットに使っていない番号のどれをPWMピンにするか選択して、ビットを1にする
+    //mbedではMAT2がpwmOutになってる
+    unsigned int mask_TMR32B0PWMC = 1 << 2;
+    //マッチレジスタ値
+    //・マッチ制御レジスタでTCリセット用に設定したマッチレジスタに、周期を設定する
+    // ((48*10^6)/nHz)で任意の周波数になる、はずである
+    //・マッチ制御レジスタでTCリセット用に設定しなかったマッチレジスタで、PWM出力ピンにする番号のマッチレジスタにパルス長を設定する
+    // ここでいうパルス長は、LOWレベルの長さになる。 0で常にHIGH,TCリセット値より大きいと常にLOW,TCリセット値と等しい場合は完全にはLOWにならない
+    unsigned int val_TMR32B0MR3 = /*10;*/((48000000) / (pwmFrequency));
+    unsigned int val_TMR32B0MR2 = /*8;*/((48000000) / (pwmFrequency)) + 1;
+
+    //システムAHBクロック制御レジスタアドレス
+    volatile unsigned int *SYSAHBCLKCTRLLocal = (unsigned int *)0x40048080;
+    //IO設定レジスタアドレス
+    //volatile unsigned int *IOCON_PIO0_1Local = (unsigned int *)0x40044010;
+    //プリスケールレジスタアドレス
+    volatile unsigned int *TMR32B0PRLocal = (unsigned int *)0x4001400C;
+    //タイマ制御レジスタアドレス
+    volatile unsigned int *TMR32B0TCR = (unsigned int *)(0x40014004);
+    //マッチ制御レジスタアドレス
+    volatile unsigned int *TMR32B0MCR = (unsigned int *)(0x40014014);
+    //マッチレジスタ2アドレス
+    volatile unsigned int *TMR32B0MR2 = (unsigned int *)(0x40014020);
+    //マッチレジスタ3アドレス
+    volatile unsigned int *TMR32B0MR3 = (unsigned int *)(0x40014024);
+    //PWM制御レジスタアドレス
+    volatile unsigned int *TMR32B0PWMC = (unsigned int *)(0x40014074);
+
+    //PWM機能制御レジスタセット
+    //システムAHBクロック制御レジスタセット
+    *SYSAHBCLKCTRLLocal |= mask_SYSAHBCLKCTRL;
+    //IO設定レジスタセット
+    //*IOCON_PIO0_1Local |= mask_IOCON_PIO0_1;
+    //プリスケーラレジスタセット
+    *TMR32B0PRLocal = val_TMR32B0PR;
+    //PWM制御レジスタセット
+    *TMR32B0PWMC |= mask_TMR32B0PWMC;
+    //マッチレジスタセット
+    //デフォルト値設定操作
+    //MR3_周波数
+    *TMR32B0MR3 = val_TMR32B0MR3;
+    //MR2_LOWパルス長
+    *TMR32B0MR2 = val_TMR32B0MR2;
+    //マッチ制御レジスタセット
+    *TMR32B0MCR |= mask_TMR32B0MCR;
+    //タイマ制御レジスタセット
+    *TMR32B0TCR |= mask_TMR32B0TCR;
+}
+
+void CT32B0_MAT2_PWM_dutySet(unsigned int pwmFrequency , unsigned int duty){
+        //0~1023もらって0%~100%のpwm出力する
+        //CT32B0_MAT2に対応したマッチレジスタアドレス
+        volatile unsigned int *TMR32B0MR2 = (unsigned int *)(0x40014020);
+        //ゼロの時はレジスタへセットする値に+1してカウンタよりマッチレジスタが大きくなるようにする
+        if(duty == 0){
+            *TMR32B0MR2 = (((48000000 / pwmFrequency) / 1024)*(1024 - duty + 1));
+            return;
+            }
+        //デューティセット
+        *TMR32B0MR2 = (((48000000 / pwmFrequency) / 1024)*(1024 - duty));
+
+    
+    }
\ No newline at end of file
diff -r 000000000000 -r 04dd91d291e4 mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Thu May 07 07:48:13 2015 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/8ab26030e058
\ No newline at end of file