测试单片机: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中断失能
}
|