|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
中斷問題,想不通。。!是不是中斷復(fù)位問題啊??? |
| 作者:win2000_li 欄目:ARM技術(shù) |
請教各位大俠,這個(gè)中斷計(jì)數(shù)我明明是只讓PWM2中斷輸出,為什么計(jì)數(shù)的確是PWM4,但是是PWM2輸出。按道理說應(yīng)該是PWM2計(jì)數(shù)(脈沖個(gè)數(shù)。) void __irq PWM_Handler(void) { if(PWMIR&0x01 == 0x01)//判斷中斷0是否中斷 { d++; PWMIR |= 0x01; //復(fù)位中斷0 } if(PWMIR&0x04 == 0x04)//判斷中斷2是否中斷 { d2++; PWMIR |= 0x04; //復(fù)位中斷2 } if(PWMIR&0x100 == 0x100)//判斷中斷4是否中斷 { d4++; PWMIR |= 0x100; //復(fù)位中斷4 } if(PWMIR&0x400 == 0x400)//判斷中斷6是否中斷 { d6++; PWMIR |= 0x400; //復(fù)位中斷6 } VICVectAddr = 0x00; // 通知VIC中斷處理結(jié)束 } int main (void) { IRQEnable(); PWMPR=0; PINSEL0 = 0x00008000; //連接到PWM2 PWMPCR |= 0x0400; //設(shè)置PWM2輸出,并為單邊沿控制模式 PWMMR0 = PwmSize; PWMMR2 = PwmStartSize; PWMLER = 0x05; PWMMCR=(1<<0)|(1<<6); //PWMMR2與PWMTC匹配時(shí)產(chǎn)生中斷 //PWMMR0與PWMTC匹配時(shí)產(chǎn)生中斷 // PWMIR=0x03; PWMTCR = 0x02; PWMTCR = 0x09; VICIntSelect =0x00; // 所有中斷通道設(shè)置為IRQ中斷 VICVectCntl0 = (0x20|8); //PWM優(yōu)先級最高 VICVectAddr0 = (int)PWM_Handler; //VICDefVectAddr改為VICVectAddr0就可以進(jìn)入中斷 VICIntEnable = (1<<8); //使能PWM中斷請求 while(1) { if(d2 == 20) ClosePwm(0) ; } return 0; } |
| 2樓: | >>參與討論 |
| 作者: win2000_li 于 2006/7/6 13:35:00 發(fā)布:
自已頂!!怎么沒有人。 |
|
| 3樓: | >>參與討論 |
| 作者: win2000_li 于 2006/7/6 15:32:00 發(fā)布:
老師,我按照你的方法調(diào)了一下。 結(jié)果是這樣的: 首先,我把中斷 PWMMCR=(1<<0)|(1<<6); //PWMMR2與PWMTC匹配時(shí)產(chǎn)生中斷 //PWMMR0與PWMTC匹配時(shí)產(chǎn)生中斷 改為PWMMCR = (1《 6); 程序進(jìn)入中斷了一次,而且PWMIR的值為0x04,但是在程序走到 if(PWMIR&0x04 == 0x04)時(shí),判斷結(jié)果是假,直接跳過,直到函 中斷函數(shù)結(jié)束,好像是跑飛了。 |
|
| 4樓: | >>參與討論 |
| 作者: zlgarm 于 2006/7/6 16:51:00 發(fā)布:
中斷函數(shù)中的條件判斷上有語法錯(cuò)誤。 正確的程序如下:(注意if語句條件判斷多了一對()號) void __irq PWM_Handler(void) { if((PWMIR&0x01) == 0x01)//判斷中斷0是否中斷 { d++; PWMIR = 0x01; //復(fù)位中斷0 } if((PWMIR&0x04) == 0x04)//判斷中斷2是否中斷 { d2++; PWMIR = 0x04; //復(fù)位中斷2 } if((PWMIR&0x100) == 0x100)//判斷中斷4是否中斷 { d4++; PWMIR = 0x100; //復(fù)位中斷4 } if((PWMIR&0x400) == 0x400)//判斷中斷6是否中斷 { d6++; PWMIR = 0x400; //復(fù)位中斷6 } VICVectAddr = 0x00; // 通知VIC中斷處理結(jié)束 } int main (void) { IRQEnable(); PWMPR=0; PINSEL0 = 0x00008000; //連接到PWM2 PWMPCR |= 0x0400; //設(shè)置PWM2輸出,并為單邊沿控制模式 PWMMR0 = 10000.html">10000; PWMMR2 = 1000; PWMLER = 0x05; PWMMCR=(1<<0)|(1<<6); //PWMMR2與PWMTC匹配時(shí)產(chǎn)生中斷 //PWMMR0與PWMTC匹配時(shí)產(chǎn)生中斷 // PWMIR=0x03; PWMTCR = 0x02; PWMTCR = 0x09; VICIntSelect =0x00; // 所有中斷通道設(shè)置為IRQ中斷 VICVectCntl0 = (0x20|8); //PWM優(yōu)先級最高 VICVectAddr0 = (int)PWM_Handler; //VICDefVectAddr改為VICVectAddr0就可以進(jìn)入中斷 VICIntEnable = (1<<8); //使能PWM中斷請求 while(1) { if(d2 == 20) ClosePwm(0); } return 0; } |
|
| 5樓: | >>參與討論 |
| 作者: win2000_li 于 2006/7/6 17:00:00 發(fā)布:
這個(gè)東東會(huì)不會(huì)影響進(jìn)入中斷計(jì)數(shù)問題?? uint32 PwmSize = Fpclk; uint32 PwmStartSize = Fpclk/2; uint32 d = 0, d2 = 0, d4 = 0, d6 = 0; ........... PWMMR0 = PwmSize; PWMMR2 = PwmStartSize; .......... 還有,老師,我用的精振是:11.0592M.html">11.0592M,那么它的Fpclk=11.0592啊??? 我的主頻是44.2368M 那么我的每一條指令為:1/44.2368M=22.6056ns 從此推出:11.0592M.html">11.0592M*22.6056ns = 24.9999ms 頻率:1/25ms = 40HZ 我的計(jì)算是不是正確?????? |
|
| 6樓: | >>參與討論 |
| 作者: win2000_li 于 2006/7/7 8:34:00 發(fā)布:
re:zlgarm老師,謝謝你的幫助,現(xiàn)在可以正常工作了。 老師,你看一下,這個(gè)周期與頻率計(jì)算的正確嗎???? 因?yàn)槲椰F(xiàn)在手上沒有示波器,所以不能測量。 再次謝謝您,老師 |
|
| 免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |