dp24をregisterを直接叩いてpwm

Dependencies:   mbed

Committer:
maxonK
Date:
Thu May 07 07:48:13 2015 +0000
Revision:
0:04dd91d291e4
dp24pin???????????pwm????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
maxonK 0:04dd91d291e4 1 #include "mbed.h"
maxonK 0:04dd91d291e4 2
maxonK 0:04dd91d291e4 3 // Reuse initialization code from the mbed library
maxonK 0:04dd91d291e4 4 DigitalOut PIO0_8(dp1); // P1_18
maxonK 0:04dd91d291e4 5 //dp24pwm初期化関数プロトタイプ宣言
maxonK 0:04dd91d291e4 6 void CT32B0_MAT2_PWM_registerSet(unsigned int );
maxonK 0:04dd91d291e4 7 //dp24pwmdutyセット関数プロトタイプ宣言
maxonK 0:04dd91d291e4 8 void CT32B0_MAT2_PWM_dutySet(unsigned int , unsigned int);
maxonK 0:04dd91d291e4 9
maxonK 0:04dd91d291e4 10 int main()
maxonK 0:04dd91d291e4 11 {
maxonK 0:04dd91d291e4 12 //LEDチカチカ
maxonK 0:04dd91d291e4 13 //後ろから8bit目まで1を送る(たぶんそこがp0_8のビット位置)
maxonK 0:04dd91d291e4 14 unsigned int mask_pin8 = 1 << 8;
maxonK 0:04dd91d291e4 15 //レジスタ位置。メモリ上にあるのでポインタでアクセスできるぽい
maxonK 0:04dd91d291e4 16 volatile unsigned int *GPIO0DATA = (unsigned int *)(0x50000000 + 0x3FFC );
maxonK 0:04dd91d291e4 17
maxonK 0:04dd91d291e4 18 //PWM周波数
maxonK 0:04dd91d291e4 19 unsigned int pwmFrequency = 4;
maxonK 0:04dd91d291e4 20 //dp24pwm初期化
maxonK 0:04dd91d291e4 21 CT32B0_MAT2_PWM_registerSet(pwmFrequency);
maxonK 0:04dd91d291e4 22
maxonK 0:04dd91d291e4 23
maxonK 0:04dd91d291e4 24 while (true) {
maxonK 0:04dd91d291e4 25 //ビット和でセットする
maxonK 0:04dd91d291e4 26 //他のビットに影響を与えずに操作できる
maxonK 0:04dd91d291e4 27 *GPIO0DATA |= mask_pin8;
maxonK 0:04dd91d291e4 28 //dp24pwm出力を10%に
maxonK 0:04dd91d291e4 29 CT32B0_MAT2_PWM_dutySet(pwmFrequency,(1024/10));
maxonK 0:04dd91d291e4 30 wait(5);
maxonK 0:04dd91d291e4 31 //マスクのビット反転
maxonK 0:04dd91d291e4 32 mask_pin8 = ~mask_pin8;
maxonK 0:04dd91d291e4 33
maxonK 0:04dd91d291e4 34 //LOWにしたいビットだけ入れたのを反転したものをビット積でセット
maxonK 0:04dd91d291e4 35 *GPIO0DATA &= mask_pin8;
maxonK 0:04dd91d291e4 36 //マスクのビット反転
maxonK 0:04dd91d291e4 37 mask_pin8 = ~mask_pin8;
maxonK 0:04dd91d291e4 38 //dp24pwm出力を0%に
maxonK 0:04dd91d291e4 39 CT32B0_MAT2_PWM_dutySet(pwmFrequency,0);
maxonK 0:04dd91d291e4 40 wait(5);
maxonK 0:04dd91d291e4 41
maxonK 0:04dd91d291e4 42 }
maxonK 0:04dd91d291e4 43 }
maxonK 0:04dd91d291e4 44
maxonK 0:04dd91d291e4 45 void CT32B0_MAT2_PWM_registerSet(unsigned int pwmFrequency)
maxonK 0:04dd91d291e4 46 {
maxonK 0:04dd91d291e4 47 //PWM機能設定用
maxonK 0:04dd91d291e4 48 //pwmピンのピン機能選択をmbedで行う
maxonK 0:04dd91d291e4 49 PwmOut MAT2(dp24);//CT32B0_MAT2
maxonK 0:04dd91d291e4 50 //PWM周波数
maxonK 0:04dd91d291e4 51 //unsigned int pwmFrequency = 4;
maxonK 0:04dd91d291e4 52 //各種レジスタ設定用ビットマスク
maxonK 0:04dd91d291e4 53 //システムAHBクロック制御レジスタマスク
maxonK 0:04dd91d291e4 54 unsigned int mask_SYSAHBCLKCTRL = 0x3 << 9;
maxonK 0:04dd91d291e4 55 //IO設定レジスタレジスタマスク
maxonK 0:04dd91d291e4 56 //unsigned int mask_IOCON_PIO0_1 = 1 << 1;
maxonK 0:04dd91d291e4 57 //タイマ制御レジスタマスク
maxonK 0:04dd91d291e4 58 //0ビット目を1にしてタイマ、プリスケールカウンタをイネーブルへ
maxonK 0:04dd91d291e4 59 unsigned int mask_TMR32B0TCR = 1;
maxonK 0:04dd91d291e4 60 //プリスケールレジスタマスク
maxonK 0:04dd91d291e4 61 unsigned int val_TMR32B0PR = 0;
maxonK 0:04dd91d291e4 62 //マッチ制御レジスタマスク
maxonK 0:04dd91d291e4 63 //0~3番のマッチレジスタの、PWM出力ピンにしたい番号以外のどれか1つをタイマ・カウンタ(TC)リセット用に設定する
maxonK 0:04dd91d291e4 64 //残りのマッチレジスタはディスエーブルにする
maxonK 0:04dd91d291e4 65 //mbedのピン配列ではタイマ0は3番をTCリセットに使うといいかも
maxonK 0:04dd91d291e4 66 unsigned int mask_TMR32B0MCR = 1 << 10;
maxonK 0:04dd91d291e4 67 //PWM制御レジスタマスク
maxonK 0:04dd91d291e4 68 //1つのタイマブロックで同時に、異なるデューティで動作できるPWMは3つまで
maxonK 0:04dd91d291e4 69 //CT32Bn_MATxピンの、TCリセットに使っていない番号のどれをPWMピンにするか選択して、ビットを1にする
maxonK 0:04dd91d291e4 70 //mbedではMAT2がpwmOutになってる
maxonK 0:04dd91d291e4 71 unsigned int mask_TMR32B0PWMC = 1 << 2;
maxonK 0:04dd91d291e4 72 //マッチレジスタ値
maxonK 0:04dd91d291e4 73 //・マッチ制御レジスタでTCリセット用に設定したマッチレジスタに、周期を設定する
maxonK 0:04dd91d291e4 74 // ((48*10^6)/nHz)で任意の周波数になる、はずである
maxonK 0:04dd91d291e4 75 //・マッチ制御レジスタでTCリセット用に設定しなかったマッチレジスタで、PWM出力ピンにする番号のマッチレジスタにパルス長を設定する
maxonK 0:04dd91d291e4 76 // ここでいうパルス長は、LOWレベルの長さになる。 0で常にHIGH,TCリセット値より大きいと常にLOW,TCリセット値と等しい場合は完全にはLOWにならない
maxonK 0:04dd91d291e4 77 unsigned int val_TMR32B0MR3 = /*10;*/((48000000) / (pwmFrequency));
maxonK 0:04dd91d291e4 78 unsigned int val_TMR32B0MR2 = /*8;*/((48000000) / (pwmFrequency)) + 1;
maxonK 0:04dd91d291e4 79
maxonK 0:04dd91d291e4 80 //システムAHBクロック制御レジスタアドレス
maxonK 0:04dd91d291e4 81 volatile unsigned int *SYSAHBCLKCTRLLocal = (unsigned int *)0x40048080;
maxonK 0:04dd91d291e4 82 //IO設定レジスタアドレス
maxonK 0:04dd91d291e4 83 //volatile unsigned int *IOCON_PIO0_1Local = (unsigned int *)0x40044010;
maxonK 0:04dd91d291e4 84 //プリスケールレジスタアドレス
maxonK 0:04dd91d291e4 85 volatile unsigned int *TMR32B0PRLocal = (unsigned int *)0x4001400C;
maxonK 0:04dd91d291e4 86 //タイマ制御レジスタアドレス
maxonK 0:04dd91d291e4 87 volatile unsigned int *TMR32B0TCR = (unsigned int *)(0x40014004);
maxonK 0:04dd91d291e4 88 //マッチ制御レジスタアドレス
maxonK 0:04dd91d291e4 89 volatile unsigned int *TMR32B0MCR = (unsigned int *)(0x40014014);
maxonK 0:04dd91d291e4 90 //マッチレジスタ2アドレス
maxonK 0:04dd91d291e4 91 volatile unsigned int *TMR32B0MR2 = (unsigned int *)(0x40014020);
maxonK 0:04dd91d291e4 92 //マッチレジスタ3アドレス
maxonK 0:04dd91d291e4 93 volatile unsigned int *TMR32B0MR3 = (unsigned int *)(0x40014024);
maxonK 0:04dd91d291e4 94 //PWM制御レジスタアドレス
maxonK 0:04dd91d291e4 95 volatile unsigned int *TMR32B0PWMC = (unsigned int *)(0x40014074);
maxonK 0:04dd91d291e4 96
maxonK 0:04dd91d291e4 97 //PWM機能制御レジスタセット
maxonK 0:04dd91d291e4 98 //システムAHBクロック制御レジスタセット
maxonK 0:04dd91d291e4 99 *SYSAHBCLKCTRLLocal |= mask_SYSAHBCLKCTRL;
maxonK 0:04dd91d291e4 100 //IO設定レジスタセット
maxonK 0:04dd91d291e4 101 //*IOCON_PIO0_1Local |= mask_IOCON_PIO0_1;
maxonK 0:04dd91d291e4 102 //プリスケーラレジスタセット
maxonK 0:04dd91d291e4 103 *TMR32B0PRLocal = val_TMR32B0PR;
maxonK 0:04dd91d291e4 104 //PWM制御レジスタセット
maxonK 0:04dd91d291e4 105 *TMR32B0PWMC |= mask_TMR32B0PWMC;
maxonK 0:04dd91d291e4 106 //マッチレジスタセット
maxonK 0:04dd91d291e4 107 //デフォルト値設定操作
maxonK 0:04dd91d291e4 108 //MR3_周波数
maxonK 0:04dd91d291e4 109 *TMR32B0MR3 = val_TMR32B0MR3;
maxonK 0:04dd91d291e4 110 //MR2_LOWパルス長
maxonK 0:04dd91d291e4 111 *TMR32B0MR2 = val_TMR32B0MR2;
maxonK 0:04dd91d291e4 112 //マッチ制御レジスタセット
maxonK 0:04dd91d291e4 113 *TMR32B0MCR |= mask_TMR32B0MCR;
maxonK 0:04dd91d291e4 114 //タイマ制御レジスタセット
maxonK 0:04dd91d291e4 115 *TMR32B0TCR |= mask_TMR32B0TCR;
maxonK 0:04dd91d291e4 116 }
maxonK 0:04dd91d291e4 117
maxonK 0:04dd91d291e4 118 void CT32B0_MAT2_PWM_dutySet(unsigned int pwmFrequency , unsigned int duty){
maxonK 0:04dd91d291e4 119 //0~1023もらって0%~100%のpwm出力する
maxonK 0:04dd91d291e4 120 //CT32B0_MAT2に対応したマッチレジスタアドレス
maxonK 0:04dd91d291e4 121 volatile unsigned int *TMR32B0MR2 = (unsigned int *)(0x40014020);
maxonK 0:04dd91d291e4 122 //ゼロの時はレジスタへセットする値に+1してカウンタよりマッチレジスタが大きくなるようにする
maxonK 0:04dd91d291e4 123 if(duty == 0){
maxonK 0:04dd91d291e4 124 *TMR32B0MR2 = (((48000000 / pwmFrequency) / 1024)*(1024 - duty + 1));
maxonK 0:04dd91d291e4 125 return;
maxonK 0:04dd91d291e4 126 }
maxonK 0:04dd91d291e4 127 //デューティセット
maxonK 0:04dd91d291e4 128 *TMR32B0MR2 = (((48000000 / pwmFrequency) / 1024)*(1024 - duty));
maxonK 0:04dd91d291e4 129
maxonK 0:04dd91d291e4 130
maxonK 0:04dd91d291e4 131 }