Keiju Nakano
/
mbed1114_PWM_DirectRegister
dp24をregisterを直接叩いてpwm
main.cpp@0:04dd91d291e4, 2015-05-07 (annotated)
- Committer:
- maxonK
- Date:
- Thu May 07 07:48:13 2015 +0000
- Revision:
- 0:04dd91d291e4
dp24pin???????????pwm????????
Who changed what in which revision?
User | Revision | Line number | New 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 | } |