[KungFu8位 MCU] KF8F2320中断函数中无法关闭外设?

[复制链接]
1098|2
手机看帖
扫描二维码
随时随地手机跟帖
jamesyuen|  楼主 | 2022-3-29 22:01 | 显示全部楼层 |阅读模式
有没有使用8位MCU的朋友,遇到过如题情况吗?还是我使用有问题,请教一下。
比如在比较器中断中关闭比较器

// 比较器中断
        if(C1IF)
        {
        C1IF = 0;
        C1IE = 0;    //第一句
        C1EN = 0;   //第二句
                P0LR3 = 1;
                _data_ = C1OUT;
                P0LR3 = 0;
        gu8test = 1;
        }

第一二句放在这里还会进比较器中断,拿出来放到外面主函数就可以关闭比较器。

使用特权

评论回复
jamesyuen|  楼主 | 2022-3-31 13:56 | 显示全部楼层
本帖最后由 jamesyuen 于 2022-3-31 13:59 编辑

写了个demo代码,各位高手指点一下

#include"stdint.h"
#include<KF8F2320.h>

#define UARTOUT        P0LR5
#define CompareEnable() C1IF = 0;C1IE = 1;C1EN = 1;
#define DELAY_40US() _NOP();_NOP();_NOP();_NOP();_NOP();

volatile uint8_t gu8test = 0;

/*
* 延时
*/
void Delay_120us()
{
        DELAY_40US();
        DELAY_40US();
        DELAY_40US();
}

/*
* 延时1mS
*/
void Delay_1ms()
{
    uint8_t i;

    for(i=0;i<5;i++)
    {
            DELAY_40US();
            DELAY_40US();
            DELAY_40US();
            DELAY_40US();
    }
}

/*
* 延时NmS
*/
void Delay_ms(uint16_t _time_)
{
    uint16_t i;

    for(i=0;i<_time_;i++)
    {
        Delay_1ms();
    }
}

/*
* IO初始化
*/
void IO_Init()
{
        TR02 = 0;//未使用引脚
        TR03 = 0;//未使用引脚
        TR1 = 0;//未使用引脚
        TR12 = 1;//
        TR01 = 0;//
        TR04 = 0;//
        TR05 = 0;//
}

/*
* 比较器初始化
*/
void CMP1_Init()
{
        TR00 = 1;//比较器1的正向输入端——P00配置为输入模式
        ANS0 = 1;//打开P00的模拟通道
        VREEN = 1;//使能内部参考电压
        CM1CTL0 = 0x32;//比较器1的负端输入选择内部参考电压、不输出到引脚、反相、比较器禁止
}

/*
* MCU初始化
*/
void SysInitialize()
{
        OSCCTL = 0x30;                                                        //设置为500K
        IO_Init();
        CMP1_Init();
        PUIE = 1;
        AIE = 1;                                                                //总中断
}

/*
* 中断处理
*/
void int_fun() __interrupt (0)
{
//  比较器中断
        if(C1IF)
        {
                C1IF = 0;
                C1IE = 0;                                //关键的这句,不知道是不是不起作用,一直IO翻转输出
                //C1EN = 0;                                //这句同C1IE也一样
                gu8test = 1;
        }
}

/*
* 主函数
*/
void main()
{
    SysInitialize();
    UARTOUT = 0;
    Delay_ms(3000);
    CompareEnable();
    while(1)
    {
            if(gu8test)
            {
                    gu8test = 0;
                    //C1IE = 0;                //这句打开,再把中断中这句注释,就不会一直IO翻转输出
                    //C1EN = 0;                //这句同C1IE一样现象
                    UARTOUT = 1;
                    Delay_ms(500);
                    UARTOUT = 0;
                    Delay_ms(500);
                    C1IE = 1;
                C1EN = 1;        
            }
    }
}


使用特权

评论回复
cyclefly| | 2022-4-6 17:28 | 显示全部楼层
逻辑问题

使用特权

评论回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则