在线时间276 小时
UID2086952
注册时间2015-8-9
NXP金币253
TA的每日心情 | 开心 2023-6-2 13:32 |
---|
签到天数: 272 天 连续签到: 1 天 [LV.8]以坛为家I
金牌会员
 
- 积分
- 4413
- 最后登录
- 2023-6-2
|
之前发了个点灯程序,一行初始化,一行操作,简单易用有木有?
下面,来个进阶的,
输出的是三角波,不是正弦波,正弦波应该更漂亮吧.
下面是代码,自己剪切下应该就能用了的.
- void Sct_init(void){
- LPC_SYSCON->SYSAHBCLKCTRL|=SYSCON_SYSAHBCLKCTRL_SCT;
- LPC_SYSCON->PRESETCTRL&=~SYSCON_PRESETCTRL_SCTRST_N;
- LPC_SYSCON->PRESETCTRL|=SYSCON_PRESETCTRL_SCTRST_N;
-
- LPC_SCT->CONFIG&=~SCT_CONFIG_UNIFY; /* 2 16-bits timer.*/
- LPC_SCT->CONFIG|=SCT_CONFIG_AUTOLIMIT_L; /* auto limit.*/
-
- LPC_SYSCON->SYSAHBCLKCTRL|=SYSCON_SYSAHBCLKCTRL_SWM;
- Swm_set(SCT_OUT0,15);
- Swm_set(SCT_OUT1,16);
- Swm_set(SCT_OUT2,17);
- LPC_SYSCON->SYSAHBCLKCTRL&=~SYSCON_SYSAHBCLKCTRL_SWM;
-
- LPC_SCT->MATCHREL_L[0]=5999; /* match 0 @.*/
- LPC_SCT->MATCH_L[0]=5999;
- LPC_SCT->MATCH_L[1]=0;
- LPC_SCT->MATCH_L[2]=3999;
- LPC_SCT->MATCH_L[3]=3999;
-
- LPC_SCT->EVENT[0].STATE=0xFF; /* event 0 happens in all state.*/
- LPC_SCT->EVENT[0].CTRL=(1<<SCT_EVENT_CTRL_COMBMODE_SHIFT)|(0<<SCT_EVENT_CTRL_MATCHSEL_SHIFT); /* match 0 condition only.*/
-
- LPC_SCT->EVENT[1].STATE=0xFF; /* event1 happens in all state.*/
- LPC_SCT->EVENT[1].CTRL=(1<<SCT_EVENT_CTRL_COMBMODE_SHIFT)|(1<<SCT_EVENT_CTRL_MATCHSEL_SHIFT); /* match 1 condition only.*/
-
- LPC_SCT->EVENT[2].STATE=0xFF; /* event2 happens in all state.*/
- LPC_SCT->EVENT[2].CTRL=(1<<SCT_EVENT_CTRL_COMBMODE_SHIFT)|(2<<SCT_EVENT_CTRL_MATCHSEL_SHIFT); /* match 2 condition only.*/
-
- LPC_SCT->EVENT[3].STATE=0xFF; /* event2 happens in all state.*/
- LPC_SCT->EVENT[3].CTRL=(1<<SCT_EVENT_CTRL_COMBMODE_SHIFT)|(3<<SCT_EVENT_CTRL_MATCHSEL_SHIFT); /* match 3 condition only.*/
-
- LPC_SCT->CTRL_L|=SCT_CTRL_CLRCTR; /* clears the L counter.*/
- LPC_SCT->CTRL_L|=0<<SCT_CTRL_PRE_SHIFT; /* 60M/1 =60M. 1/60us.*/
-
- LPC_SCT->OUT[0].SET=(1<<0);
- LPC_SCT->OUT[0].CLR=(1<<1);
-
- LPC_SCT->OUT[1].SET=(1<<0);
- LPC_SCT->OUT[1].CLR=(1<<2);
-
- LPC_SCT->OUT[2].SET=(1<<0);
- LPC_SCT->OUT[2].CLR=(1<<3);
-
- LPC_SCT->OUTPUT|=(1<<0)|(1<<1)|(1<<2);
- }
- void Sct_start(void){
- LPC_SCT->CTRL_L&=~SCT_CTRL_HALT;/* unhalt by clearing bit 2.*/
- }
- void Sct_stop(void){
- while((LPC_SCT->COUNT_L<LPC_SCT->MATCH_L[1])&&(LPC_SCT->COUNT_L<LPC_SCT->MATCH_L[2])&&(LPC_SCT->COUNT_L<LPC_SCT->MATCH_L[3]));
- LPC_SCT->CTRL_L|=SCT_CTRL_HALT;
- LPC_SCT->OUTPUT|=(1<<0)|(1<<1)|(1<<2);
- }
- if(light){
- if(dir==3000){
- dir=0;
- }
- switch(dir/500){
- case 0:{
- LPC_SCT->MATCHREL_L[1]=dir*STEP;
- LPC_SCT->MATCHREL_L[2]=3999-dir*STEP;
- LPC_SCT->MATCHREL_L[3]=3999+dir*STEP;
- }break;
- case 1:{
- LPC_SCT->MATCHREL_L[1]=dir*STEP;
- LPC_SCT->MATCHREL_L[2]=3999-dir*STEP;
- LPC_SCT->MATCHREL_L[3]=7999-dir*STEP;
- }break;
- case 2:{
- LPC_SCT->MATCHREL_L[1]=dir*STEP;
- LPC_SCT->MATCHREL_L[2]=dir*STEP-4000;
- LPC_SCT->MATCHREL_L[3]=7999-dir*STEP;
- }break;
- case 3:{
- LPC_SCT->MATCHREL_L[1]=11999-dir*STEP;
- LPC_SCT->MATCHREL_L[2]=dir*STEP-4000;
- LPC_SCT->MATCHREL_L[3]=7999-dir*STEP;
- }break;
- case 4:{
- LPC_SCT->MATCHREL_L[1]=11999-dir*STEP;
- LPC_SCT->MATCHREL_L[2]=dir*STEP-4000;
- LPC_SCT->MATCHREL_L[3]=dir*STEP-8000;
- }break;
- case 5:{
- LPC_SCT->MATCHREL_L[1]=11999-dir*STEP;
- LPC_SCT->MATCHREL_L[2]=15999-dir*STEP;
- LPC_SCT->MATCHREL_L[3]=dir*STEP-8000;
- }break;
- default:{
- }break;
- }
- dir++;
- }
复制代码 SCT的功能还是十分强大的,不过,既然有8个L,8个H,为啥不搞16个event来,
不过那也是简单的堆砌了.对于SCT来说,目的已经达到.

|
|