--- /dev/null
+/**\r
+ * LPCXPresso1769のPWMクラスを定義します。\r
+ class Pwm\r
+ PWMペリフェラルを操作するクラス\r
+ class AdcPin\r
+ PWMピンを操作するクラス\r
+ */\r
+(function(){\r
+var DEV=LPCXpresso1769;\r
+var BCF=DEV._BCF;\r
+var EE=DEV._EE;\r
+var isUndef=MiMicLib.isUndef;\r
+var cloneAssoc=MiMicLib.cloneAssoc;\r
+\r
+\r
+\r
+/**\r
+ * このクラスは、PWMペリフェラルを管理します。\r
+ @param i_opt\r
+ オプション値です。\r
+ {\r
+ freq:100,\r
+ phl:{power:1,clock:0}\r
+ }\r
+ */\r
+DEV.Pwm=function Pwm(i_mcu,i_opt)\r
+{\r
+ try{\r
+ this._mcu=i_mcu;\r
+ //PHL生成。\r
+ this._phl=new DEV.Peripheral(i_mcu,DEV.PHL.PWM1);\r
+ //設定値のロード\r
+ var opt=isUndef(i_opt)?{phl:{}}:\r
+ {//i_optある。\r
+ phl:isUndef(i_opt.phl)?{}:cloneAssoc(i_opt.phl),\r
+ freq:i_opt.freq\r
+ };\r
+ //デフォルト値設定\r
+ if(isUndef(opt.phl.power)){opt.phl.power=1;};\r
+ if(isUndef(opt.phl.clock)){opt.phl.clock=0;};\r
+ if(isUndef(opt.freq)){opt.freq=100;}\r
+ \r
+ var bc="";\r
+ var db=new Array();\r
+ //optionの設定\r
+ bc+=this.BCF_setOpt(opt,db);\r
+ bc+=BCF.setMem(this._PC,0x0,db);\r
+ //PCR\r
+ bc+=BCF.setMem(this._PCR,0x0,db);\r
+ //CTCR\r
+ bc+=BCF.setMem(this._CTCR,0x0,db);\r
+ //TCRに値設定(カウンタとPWMモードを無効化)\r
+ bc+=BCF.setMem(this._TCR,0x0,db);\r
+ bc+=BCF.setMem(this._TC,0x0,db);\r
+ //TCRに値設定(カウンタとPWMモードを有効化)\r
+ bc+=BCF.setMem(this._TCR,0x9,db);\r
+ //初期化\r
+ this._mcu.callMiMicWithCheck(bc+BCF.END,db);\r
+ //ペリフェラルをMCUに登録\r
+ this._mcu.registerPhl(this,"PWM");\r
+ }catch(e){\r
+ throw new MiMicException(e);\r
+ }\r
+\r
+}\r
+DEV.Pwm.prototype=\r
+{\r
+ _cache:{\r
+ mr0:0\r
+ },\r
+ _TCR:0x40018004,\r
+ _TC:0x40018008,\r
+ _PR:0x4001800C,\r
+ _PC:0x40018010,\r
+ _MCR:0x40018018,\r
+ _PCR:0x4001804C,\r
+ _LER:0x40018050,\r
+ _CTCR:0x40018070,\r
+ _MRn:[0x40018018,0x4001801C,0x40018020,0x40018024,0x40018040,0x40018044,0x40018048],\r
+ _phl:null,\r
+ _mcu:null,\r
+ /**\r
+ * {phl:{object},(freq:int|mr0:int)}
+ */\r
+ BCF_setOpt:function BCF_setOpt(i_opt,i_db)\r
+ {\r
+ try{\r
+ var bc="";\r
+ var phlopt;\r
+ var mr0;\r
+ //ペリフェラルの設定\r
+ if(!isUndef(i_opt.phl)){\r
+ bc+=this._phl.BCF_setOpt(i_opt.phl,i_db);\r
+ }\r
+ if(!isUndef(i_opt.freq)){\r
+ //サイクル(Hz)とペリフェラルのクロックから、MR0のサイクルを決定\r
+ mr0=Math.round(this._phl.getPCLK()/i_opt.freq);\r
+ if(mr0<=0){\r
+ //ペリフェラルクロック小さすぎワロタ\r
+ throw new MiMicException("The peripheral clock too small.");\r
+ }\r
+ //MR0に値設定\r
+ bc+=this.BCF_setMRn(0,mr0,i_db);\r
+ //LERにビットセット\r
+ bc+=this.BCF_setLER(0,i_db);\r
+ this._cache.mr0=mr0;\r
+ }\r
+ return bc;\r
+ }catch(e){\r
+ throw new MiMicException(e);\r
+ }\r
+ },\r
+ BCF_setLER:function BCF_setLER(i_ch,i_db)\r
+ {\r
+ //LERにビットをセット\r
+ return BCF.setBit(this._LER,0x01,0x01,i_ch,i_db);\r
+ },\r
+ \r
+ /**\r
+ * MRnに値を設定するBC\r
+ */\r
+ BCF_setMRn:function BCF_setMRn(i_ch,i_val,i_db)\r
+ {\r
+ try{\r
+ return BCF.setMem(this._MRn[i_ch],i_val,i_db);\r
+ }catch(e){\r
+ throw new MiMicException(e);\r
+ }\r
+ },\r
+ BCF_setMRnByDuty:function BCF_setMRnByDuty(i_ch,i_duty,i_db)\r
+ {\r
+ try{\r
+ return this.BCF_setMRn(i_ch,Math.round(i_duty*this._cache.mr0),i_db);\r
+ }catch(e){\r
+ throw new MiMicException(e);\r
+ }\r
+ },\r
+ /**\r
+ * PCRに値を設定するBC\r
+ i_ch=1の場合、エッジモードは無視します。\r
+ @param i_ch\r
+ 1-6\r
+ @param i_edge\r
+ エッジモード(1/0)\r
+ @param i_en\r
+ 有効/無効の選択\r
+ */\r
+ BCF_setPCRbit:function BCF_setPCR(i_ch,i_edge,i_en,i_db)\r
+ {\r
+ try{\r
+ var m,v;\r
+ m=v=0;\r
+ if(!isUndef(i_edge)){\r
+ v|=i_edge;\r
+ m|=0x00000001;\r
+ }\r
+ if(!isUndef(i_en)){\r
+ v|=(i_en<<8);\r
+ m|=0x00000100;\r
+ }\r
+ //ビットの設定\r
+ return BCF.setBit(this._PCR,m,v,i_ch,i_db);\r
+ }catch(e){\r
+ throw new MiMicException(e);\r
+ }\r
+ },\r
+ /**\r
+ * see API manual\r
+ */\r
+ getPin:function getPin(i_pin,i_opt)\r
+ {\r
+ try{\r
+ return new DEV.PwmPin(this,i_pin,i_opt);\r
+ }catch(e){\r
+ throw new MiMicException(e);\r
+ }\r
+ } \r
+}\r
+\r
+/**\r
+ * このクラスは、PwmペリフェラルとPwm識別子から、シングルエッジPwmピンを構成します。\r
+ @param i_PWM\r
+ Pwmペリフェラル\r
+ @param i_pwm\r
+ PWMを構成するピン番号\r
+ @param i_opt\r
+ ピンオプション。各値は省略できます。\r
+{duty:100,enable:1,pin{sel:auto,mode:undefined,od:undefined}}\r
+ */\r
+DEV.PwmPin=function PwmPin(i_pwm,i_pin,i_opt)\r
+{\r
+ try{\r
+ this._pwm=i_pwm;\r
+ //PINがPWM持ってるか確認\r
+ this._pin=new DEV.Pin(i_pwm._mcu,i_pin);\r
+ //PinNameからピン情報を得る。\r
+ this._pwminfo=function(i_pin){\r
+ //pinの完全な機能名を得る。(得られれば機能がある。)\r
+ var func_name=DEV.completePinFunctionName(i_pin,"PWM");\r
+ //portとbitを得る(AD0だけしか管理しないよ)\r
+ var a=func_name.substring(2).split(".");\r
+ var r={port:0,ch:parseInt(a[1]),pin_sel:DEV.getPinSelByFunctionName(i_pin,func_name)};\r
+ if(!isNaN(r.ch)){\r
+ return r;\r
+ }\r
+ throw new MiMicException(EE.INVALID_CFG,"The pin has not PWM fuction.");\r
+ }(i_pin);\r
+ //設定用のBCを作って実行\r
+ {\r
+ var opt=isUndef(i_opt)?{pin:{}}:\r
+ {\r
+ pin:isUndef(i_opt.pin)?{}:cloneAssoc(i_opt.pin),\r
+ duty:i_opt.duty,\r
+ enable:i_opt.enable\r
+ };\r
+ //デフォルト値のロード\r
+ if(isUndef(opt.pin.sel)){ opt.pin.sel=this._pwminfo.pin_sel;}\r
+ if(isUndef(opt.duty)){opt.duty=0;}\r
+ if(isUndef(opt.enable)){opt.enable=1;}\r
+ this.setOpt(opt);\r
+ }\r
+ }catch(e){\r
+ throw new MiMicException(e);\r
+ }\r
+}\r
+\r
+DEV.PwmPin.prototype=\r
+{\r
+ _pwm:null,\r
+ _pin:null,\r
+ _pwminfo:null,\r
+ /**\r
+ * @param i_opt\r
+ シングルエッジPWMのオプション値を設定する。\r
+ {pin:{ピン初期化パラメタ},enable:有効値,duty:デューティ比}}
+ */\r
+ BCF_setOpt:function BCF_setOpt(i_opt,i_db)\r
+ {\r
+ try{\r
+ var bc="";\r
+ //pinselの値\r
+ if(!isUndef(i_opt.pin)){\r
+ //PINSEL設定\r
+ bc+=this._pin.BCF_setOpt(i_opt.pin,i_db);\r
+ }\r
+ //PCRに値設定\r
+ if(!isUndef(i_opt.enable)){\r
+ bc+=this._pwm.BCF_setPCRbit(this._pwminfo.ch,0,i_opt.enable,i_db);\r
+ }\r
+ //MRnに値設定してLERにセット\r
+ if(!isUndef(i_opt.duty)){\r
+ bc+=this._pwm.BCF_setMRnByDuty(this._pwminfo.ch,i_opt.duty,i_db);\r
+ bc+=this._pwm.BCF_setLER(this._pwminfo.ch,i_db);\r
+ }\r
+ return bc;\r
+ }catch(e){\r
+ throw new MiMicException(e);\r
+ }\r
+ },\r
+ setOpt:function setOpt(i_opt)\r
+ {\r
+ try{\r
+ var db=new Array();\r
+ var bc=this.BCF_setOpt(i_opt,db);\r
+ this._pwm._mcu.callMiMicWithCheck(bc+BCF.END,db);\r
+ }catch(e){\r
+ throw new MiMicException(e);\r
+ }\r
+ },\r
+ \r
+ /**\r
+ * デューティ比を設定する。\r
+ @return\r
+ */\r
+ setDuty:function setDuty(i_duty)\r
+ {\r
+ try{\r
+ this.setOpt({duty:i_duty});\r
+ }catch(e){\r
+ throw new MiMicException(e);\r
+ }\r
+ }\r
+}\r
+ \r
+\r
+\r
+}());\r