打印
[KungFu32位 MCU]

还是请教一下之前那个通用定时器的问题?

[复制链接]
6706|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
编号10086|  楼主 | 2021-7-8 17:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我想把通用定时器,开四个通道的比较中断。。我看例程里面的写法,是不能开四个通道的中断吗?

我自己昨天看了一上午,今天看了一下午,整整一天了还没搞明白怎么开四个比较中断。
主要遇到了一个问题,就是四个通道的比较中断标志无法清除。。我单步调试的时候,把SRIC置1的时候,CCXIF的确被置0了,但是当我把SRIC置0之后,这个标志位又被置1了。

我自己改的程序如下:
我在这里启用了T0CH1的比较中断。
void CCPx_Compare_Config(CCP_SFRmap* CCPx,InterruptIndex Peripheral)
{
///配置CCPx的比较功能,并设置比较匹配后四个通道输出电平,初始化CCPx周期为0XFFFF,预分频为16,并使能中断

        CCP_CompareInitTypeDef CCP_Compare_InitStructure;
        CCP_Compare_Struct_Init(&CCP_Compare_InitStructure);

        TIM_Reset(CCPx);//定时器外设复位,使能外设时钟

         // 通道编号,     取值范围满足“CCP通道”的宏。
        CCP_Compare_InitStructure.m_Channel=CCP_CHANNEL_1;
        CCP_Compare_InitStructure.m_CompareMode=CCP_CMP_SOFT_INT;     //捕捉/比较器模式选择,  取值满足宏CHECK_CCP_CMP_MODE的约定条件。
        CCP_Compare_InitStructure.m_CompareValue=0X0FFF;                  //设置与TX比较的值,     取值范围为16位数据。
        CCP_Compare_Configuration(CCPx,&CCP_Compare_InitStructure);/*这个函数貌似没起到作用哈*/

        CCP_Compare_InitStructure.m_CompareValue=0X7FFF;
        CCP_Compare_InitStructure.m_Channel=CCP_CHANNEL_2;
        CCP_Compare_Configuration(CCPx,&CCP_Compare_InitStructure);

        CCP_Compare_InitStructure.m_CompareValue=0X7FFF;
        CCP_Compare_InitStructure.m_Channel=CCP_CHANNEL_3;
        CCP_Compare_Configuration(CCPx,&CCP_Compare_InitStructure);

        CCP_Compare_InitStructure.m_CompareValue=0X7FFF;
        CCP_Compare_InitStructure.m_Channel=CCP_CHANNEL_4;
        CCP_Compare_Configuration(CCPx,&CCP_Compare_InitStructure);


        GPTIM_Updata_Immediately_Config(CCPx,TRUE);                                                            //立即更新控制
        GPTIM_Updata_Enable(CCPx,TRUE);                                                                                    //配置更新使能

        GPTIM_Work_Mode_Config(CCPx,GPTIM_TIMER_MODE);                                                    //定时模式选择
        GPTIM_Set_Counter(CCPx,0);                                                                                            //定时器计数值
        GPTIM_Set_Period(CCPx,0XFFFF);                                                                                    //定时器周期值
        GPTIM_Set_Prescaler(CCPx,15);                                                                                    //定时器预分频值
        GPTIM_Counter_Mode_Config(CCPx,GPTIM_COUNT_UP_OF);                                            //向上-向下计数,上溢和下溢产生中断标志
        GPTIM_Clock_Config(CCPx,GPTIM_SCLK);                                                                    //选用SCLK时钟
        //GPTIM_Overflow_INT_Enable(CCPx,TRUE);                                                                    //计数溢出中断使能

        CCP_Channel_INT_Config(CCPx,CCP_CHANNEL_1,TRUE);//开启通道1比较中断
        //CCP_Channel_INT_Config(CCPx,CCP_CHANNEL_2,TRUE);
        //CCP_Channel_INT_Config(CCPx,CCP_CHANNEL_3,TRUE);
        //CCP_Channel_INT_Config(CCPx,CCP_CHANNEL_4,TRUE);
        INT_Interrupt_Enable(Peripheral,TRUE);                                                                    //外设中断使能
        INT_Clear_Interrupt_Flag(Peripheral);                                                                    //清中断标志

        GPTIM_Cmd(CCPx,TRUE);                                                                                                    //定时器启动控制使能
        INT_All_Enable(TRUE);                                                                                                    //全局中断使能

}
然后it.c是这样子写的
void __attribute__((interrupt))_T0_exception (void)
{
        //GPTIM_Clear_Updata_INT_Flag(T0_SFR);                                                                                //清更新事件标志位
        GPTIM_Clear_Overflow_INT_Flag (T0_SFR);                                                                                //清T0溢出中断标志位

        GPTIM_Updata_Immediately_Config(T0_SFR,TRUE);                        //禁止立即更新控制位


        if(CCP_Get_Channel_Trigger_INT_Flag(CCP0_SFR,CCP_CHANNEL_1) == 1)
        {
                //CCP_Channel_INT_Config(CCP0_SFR,CCP_CHANNEL_1,FALSE);
                CCP_Clear_Channel_INT_Flag(CCP0_SFR,CCP_CHANNEL_1);
                GPIO_Toggle_Output_Data_Config (GPIOB_SFR,GPIO_PIN_MASK_8);                 //PB翻转
        }

        if(CCP_Get_Channel_Trigger_INT_Flag(CCP0_SFR,CCP_CHANNEL_2) == 1)
        {
                CCP_Clear_Channel_INT_Flag(CCP0_SFR,CCP_CHANNEL_2);
                GPIO_Toggle_Output_Data_Config (GPIOB_SFR,GPIO_PIN_MASK_9);                 //PB翻转

        }

        if(CCP_Get_Channel_Trigger_INT_Flag(CCP0_SFR,CCP_CHANNEL_2) == 1)
        {
                CCP_Clear_Channel_INT_Flag(CCP0_SFR,CCP_CHANNEL_2);
        }

        if(CCP_Get_Channel_Trigger_INT_Flag(CCP0_SFR,CCP_CHANNEL_3) == 1)
        {
                CCP_Clear_Channel_INT_Flag(CCP0_SFR,CCP_CHANNEL_3);
        }

        GPTIM_Updata_Immediately_Config(T0_SFR,FALSE);                        //禁止立即更新控制位
        GPTIM_Updata_Immediately_Config(T0_SFR,TRUE);           //允许立即更新控制位


}
我理解里面
CCP_Get_Channel_Trigger_INT_Flag(CCP0_SFR,CCP_CHANNEL_1) == 1
应该这个能够判断具体是哪个通道产生了中断。
所以程序的效果应该是亮PB8这个灯。
但是实际的结果是,两个灯都会亮。

我看寄存器里面四个通道的比较标志位都被置1了。而且用下面这个函数清不了标志位。
CCP_Clear_Channel_INT_Flag(CCP0_SFR,CCP_CHANNEL_1);


所以问一下论坛里的大佬,这款单片机能不能开四个通道的比较中断。
我自己改的程序如下,大佬们帮我看看到底是怎么回事。
CCPx_Compare_Mode.zip (2.32 MB)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

76

帖子

0

粉丝