|
測(cè)試單片機(jī):STC8H3K64S4
功能:1路高速脈沖輸出(計(jì)數(shù)脈沖) + 外部中斷檢測(cè)
出現(xiàn)的問(wèn)題:
使能PWM捕獲比較中斷后,外部中斷2或外部中斷3不響應(yīng)中斷。
關(guān)閉PWM捕獲比較中斷后,外部中斷2或外部中斷正常。
外部中斷0和外部中斷1一直正常。
#include "STC8Hxx.H"
#include "ADC.H"
#include "UART1.H"
#include "Delay.H"
#include "string.h"
#include "PWM.H"
#include "KEY.H"
#include "GPIO.H"
#include "LED.H"
sbit RXD=P3^0;
void INT3_Init()
{
GPIO_Init(GPIO3,GPIO_Pin_7,GPIO_Mode_IPU); //標(biāo)準(zhǔn)IO
P3|=1<<7;
AUXINTIF&=~(1<<5); //中斷標(biāo)志位清零
INTCLKO=0x20; //使能外部中斷3,下降沿
EA=1;
}
void main()
{
P_SW2|=0x80;
UART1_Init();
PWM_Init(2000,1000);
LED_Init();
KEY_Init();
INT3_Init();
while(1)
{
//printf("st=%u\r\n",st);
Key_Scan();
Delay_xms(1);
if(!RXD)
IAP_CONTR=0x60;
}
}
//Uart1中斷服務(wù)函數(shù)
void UART1_Routine() interrupt 4
{
u8 xdata dat;
if(RI) //接收完成
{
RI = 0;
dat=SBUF;
}
}
// PWM中斷服務(wù)函數(shù)
void PWMA_Routine() interrupt 26
{
if(PWM1_SR1 & 0X02)
{
PWM1_SR1 &=~0X02; //清標(biāo)志位
LED1=!LED1;
}
}
//INT3中斷服務(wù)函數(shù)
void INT3_Routine() interrupt 11
{
AUXINTIF&=~(1<<5); //清標(biāo)志位
LED2=!LED2;
}
/*------------------------------------------------------------------------------------------------------------------------------------------------------*/
#include "PWM.H"
//使能計(jì)數(shù)器
void PWM_Cmd(u8 NewState)
{
if(NewState)
{
PWM1_CNTRH=0; //計(jì)數(shù)器清零
PWM1_CNTRL=0;
PWM1_CR1|=1<<0;
}
else
{
PWM1_CR1&=~(1<<0);
}
}
//PWM輸出強(qiáng)制為低
void PWM_RESET()
{
PWM1_CCMR2=0x48;
}
//PWM輸出強(qiáng)制為高
void PWM_SET()
{
PWM1_CCMR2=0x58;
}
//PWM輸出為自動(dòng)模式(初始化模式)
void PWM_AUTO()
{
PWM1_CCMR2=0x68; //PWM輸出模式1
}
//P1.2 輸出
void PWM_Init(u16 ARR,u16 Duty)
{
P1M1&=~(1<<2); //01推挽輸出
P1M0|= 1<<2;
PWM1_ENO = 0x04; //關(guān)閉 PWM2P 輸出,0x04打開(kāi)輸出
PWM1_PS = 0x00; //端口切換至P1口
PWM1_PSCRH=0; //預(yù)分頻器,不分頻
PWM1_PSCRL=32; //33分頻
PWM1_CNTRH=0; //計(jì)數(shù)器清零
PWM1_CNTRL=0;
PWM1_ARRH =ARR/256; //自動(dòng)重裝值 2KHZ
PWM1_ARRL =ARR%256;
PWM1_CCR2H=Duty/256; //比較值(占空比) 50%
PWM1_CCR2L=Duty%256;
PWM1_CCMR2=0x68; //PWM輸出模式1,比較值越高,占空比越高
PWM1_SR1=0x00; //清零所有關(guān)于高級(jí)定時(shí)器中斷標(biāo)志位
PWM1_IER|=1<<2; //通道2中斷使能
PWM1_CCER1=0x10;
PWM1_BKR=0x80;
PWM1_CR1&=~(1<<0); //關(guān)閉PWM計(jì)數(shù)器
PWM_Cmd(ENABLE); //使能輸出
}
//設(shè)置脈沖周期
void PWM_SET_ARR(u16 ARR)
{
PWM1_ARRH =ARR/256; //自動(dòng)重裝值 2KHZ
PWM1_ARRL =ARR%256;
}
//設(shè)置占空比
void PWM_SET_Duty(u16 Duty)
{
PWM1_CCR2H=Duty/256; //比較值(占空比) 50%
PWM1_CCR2L=Duty%256;
}
//使能中斷
void PWM_ISR(u8 NewState)
{
if(NewState)
PWM1_IER |= 1<<2; //通道2中斷使能
else
PWM1_IER &=~(1<<2); //通道2中斷失能
}
1.png (403.54 KB, 下載次數(shù): 54)
下載附件
2022-5-18 14:58 上傳
2.png (27.42 KB, 下載次數(shù): 58)
下載附件
2022-5-18 14:58 上傳
3.png (44.63 KB, 下載次數(shù): 62)
下載附件
2022-5-18 14:58 上傳
|
|