測試單片機:STC8H3K64S4
功能:1路高速脈沖輸出(計數脈沖) + 外部中斷檢測
出現的問題:
使能PWM捕獲比較中斷后,外部中斷2或外部中斷3不響應中斷。
關閉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); //標準IO
P3|=1<<7;
AUXINTIF&=~(1<<5); //中斷標志位清零
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中斷服務函數
void UART1_Routine() interrupt 4
{
u8 xdata dat;
if(RI) //接收完成
{
RI = 0;
dat=SBUF;
}
}
// PWM中斷服務函數
void PWMA_Routine() interrupt 26
{
if(PWM1_SR1 & 0X02)
{
PWM1_SR1 &=~0X02; //清標志位
LED1=!LED1;
}
}
//INT3中斷服務函數
void INT3_Routine() interrupt 11
{
AUXINTIF&=~(1<<5); //清標志位
LED2=!LED2;
}
/*------------------------------------------------------------------------------------------------------------------------------------------------------*/
#include "PWM.H"
//使能計數器
void PWM_Cmd(u8 NewState)
{
if(NewState)
{
PWM1_CNTRH=0; //計數器清零
PWM1_CNTRL=0;
PWM1_CR1|=1<<0;
}
else
{
PWM1_CR1&=~(1<<0);
}
}
//PWM輸出強制為低
void PWM_RESET()
{
PWM1_CCMR2=0x48;
}
//PWM輸出強制為高
void PWM_SET()
{
PWM1_CCMR2=0x58;
}
//PWM輸出為自動模式(初始化模式)
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; //關閉 PWM2P 輸出,0x04打開輸出
PWM1_PS = 0x00; //端口切換至P1口
PWM1_PSCRH=0; //預分頻器,不分頻
PWM1_PSCRL=32; //33分頻
PWM1_CNTRH=0; //計數器清零
PWM1_CNTRL=0;
PWM1_ARRH =ARR/256; //自動重裝值 2KHZ
PWM1_ARRL =ARR%256;
PWM1_CCR2H=Duty/256; //比較值(占空比) 50%
PWM1_CCR2L=Duty%256;
PWM1_CCMR2=0x68; //PWM輸出模式1,比較值越高,占空比越高
PWM1_SR1=0x00; //清零所有關于高級定時器中斷標志位
PWM1_IER|=1<<2; //通道2中斷使能
PWM1_CCER1=0x10;
PWM1_BKR=0x80;
PWM1_CR1&=~(1<<0); //關閉PWM計數器
PWM_Cmd(ENABLE); //使能輸出
}
//設置脈沖周期
void PWM_SET_ARR(u16 ARR)
{
PWM1_ARRH =ARR/256; //自動重裝值 2KHZ
PWM1_ARRL =ARR%256;
}
//設置占空比
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, 下載次數: 54)
下載附件
2022-5-18 14:58 上傳
2.png (27.42 KB, 下載次數: 58)
下載附件
2022-5-18 14:58 上傳
3.png (44.63 KB, 下載次數: 62)
下載附件
2022-5-18 14:58 上傳
|