找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2551|回复: 2
打印 上一主题 下一主题
收起左侧

STC8H单片机高速脉冲输出与外部中断程序的几个疑问

[复制链接]
跳转到指定楼层
楼主
测试单片机: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中断失能
}





分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:301191 发表于 2022-5-19 05:36 | 只看该作者
顶一下
回复

使用道具 举报

板凳
ID:123289 发表于 2022-5-20 11:33 | 只看该作者
某中断不能响应:同级或更高级的中断服务程序,在运行中。
想想看,是不是这样的呢。
即使高级中断执行完了,可是又来了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表