找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3458|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

STC8H單片機(jī)高速脈沖輸出與外部中斷程序的幾個(gè)疑問(wèn)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
測(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中斷失能
}





分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:301191 發(fā)表于 2022-5-19 05:36 | 只看該作者
頂一下
回復(fù)

使用道具 舉報(bào)

板凳
ID:123289 發(fā)表于 2022-5-20 11:33 | 只看該作者
某中斷不能響應(yīng):同級(jí)或更高級(jí)的中斷服務(wù)程序,在運(yùn)行中。
想想看,是不是這樣的呢。
即使高級(jí)中斷執(zhí)行完了,可是又來(lái)了。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表