[KungFu32位 MCU] 还是请教一下之前那个通用定时器的问题?

[复制链接]
 楼主| 编号10086 发表于 2021-7-8 17:11 | 显示全部楼层 |阅读模式
我想把通用定时器,开四个通道的比较中断。。我看例程里面的写法,是不能开四个通道的中断吗?

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

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

  4.         CCP_CompareInitTypeDef CCP_Compare_InitStructure;
  5.         CCP_Compare_Struct_Init(&CCP_Compare_InitStructure);

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

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

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

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

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


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

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

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

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

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

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


  6.         if(CCP_Get_Channel_Trigger_INT_Flag(CCP0_SFR,CCP_CHANNEL_1) == 1)
  7.         {
  8.                 //CCP_Channel_INT_Config(CCP0_SFR,CCP_CHANNEL_1,FALSE);
  9.                 CCP_Clear_Channel_INT_Flag(CCP0_SFR,CCP_CHANNEL_1);
  10.                 GPIO_Toggle_Output_Data_Config (GPIOB_SFR,GPIO_PIN_MASK_8);                 //PB翻转
  11.         }

  12.         if(CCP_Get_Channel_Trigger_INT_Flag(CCP0_SFR,CCP_CHANNEL_2) == 1)
  13.         {
  14.                 CCP_Clear_Channel_INT_Flag(CCP0_SFR,CCP_CHANNEL_2);
  15.                 GPIO_Toggle_Output_Data_Config (GPIOB_SFR,GPIO_PIN_MASK_9);                 //PB翻转

  16.         }

  17.         if(CCP_Get_Channel_Trigger_INT_Flag(CCP0_SFR,CCP_CHANNEL_2) == 1)
  18.         {
  19.                 CCP_Clear_Channel_INT_Flag(CCP0_SFR,CCP_CHANNEL_2);
  20.         }

  21.         if(CCP_Get_Channel_Trigger_INT_Flag(CCP0_SFR,CCP_CHANNEL_3) == 1)
  22.         {
  23.                 CCP_Clear_Channel_INT_Flag(CCP0_SFR,CCP_CHANNEL_3);
  24.         }

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


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

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


所以问一下论坛里的大佬,这款单片机能不能开四个通道的比较中断。
我自己改的程序如下,大佬们帮我看看到底是怎么回事。
CCPx_Compare_Mode.zip (2.32 MB, 下载次数: 8)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

76

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

15

主题

76

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部