[KungFu32位 MCU] 有大佬用过KF350的输出比较功能吗?

[复制链接]
 楼主| 编号10086 发表于 2021-7-7 13:08 | 显示全部楼层 |阅读模式
小弟最近在熟悉这款单片机,公司打算用这款单片机代替stm32。
看到CCPx_Compare_Mode这个例程,有点疑惑向大家请教一下。

我看例程的中断代码是这样写的。
  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.         if(CCP0_Flag)
  6.         {
  7.                 CCP0_Flag =0;
  8.                 CCP_Compare_Mode_Config(CCP0_SFR,CCP_CHANNEL_1,CCP_CMP_ACTIVE_LEVEL);                //比较模式,匹配时输出高电平
  9.                 CCP_Set_Compare_Result(CCP0_SFR,CCP_CHANNEL_1,0x8000);                                                //设置比较值,
  10.                 GPTIM_Set_Period(T0_SFR,0xF000);                                                                                        //更新周期值
  11.                 GPIO_Toggle_Output_Data_Config (GPIOB_SFR,GPIO_PIN_MASK_8);                 //PB翻转
  12.         }
  13.         else
  14.         {
  15.                 CCP0_Flag =1;
  16.                 CCP_Compare_Mode_Config(CCP0_SFR,CCP_CHANNEL_1,CCP_CMP_INACTIVE_LEVEL);        //比较模式,匹配时输出低电平
  17.                 CCP_Set_Compare_Result(CCP0_SFR,CCP_CHANNEL_1,0x8000);                                        //设置比较值
  18.                 GPTIM_Set_Period(T0_SFR,0xF000);                                                                                //更新周期值
  19.                 GPIO_Toggle_Output_Data_Config (GPIOB_SFR,GPIO_PIN_MASK_8);             //PB8翻转
  20.         }

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


  23. }
但是它没有判断具体是什么中断。
我在库函数里面找了一圈下来,找到了比较中断标志位判断,和清除的函数。
  1. CCP_Get_Channel_Trigger_INT_Flag(T0_SFR,CCP_CHANNEL_1)//标志位判断。CCPx_EGIF->CCxIF
  1. CCP_Clear_Channel_INT_Flag(T0_SFR,CCP_CHANNEL_1);//标志位清除。CCPx_SRIC->CCxIC
我还找到了通道失能的函数。
  1. CCP_Channel_INT_Config(T0_SFR,CCP_CHANNEL_1,FALSE);



于是我自己写了一个it.c。在CH1比较中断中翻转PB8,然后失能这个通道。但是实际跑下来这个失能的函数没有效果(表现为板子的灯一直是亮的。)
  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.         if(CCP_Get_Channel_Trigger_INT_Flag(T0_SFR,CCP_CHANNEL_1) == 1)
  6.         {
  7.                 CCP_Clear_Channel_INT_Flag(T0_SFR,CCP_CHANNEL_1);
  8.                 CCP_Channel_INT_Config(T0_SFR,CCP_CHANNEL_1,FALSE);
  9.                 GPIO_Toggle_Output_Data_Config(GPIOB_SFR,GPIO_PIN_MASK_8);
  10.         }

  11.         if(CCP_Get_Channel_Trigger_INT_Flag(T0_SFR,CCP_CHANNEL_2) == 1)
  12.         {
  13.                 CCP_Clear_Channel_INT_Flag(T0_SFR,CCP_CHANNEL_2);
  14.         }

  15.         if(CCP_Get_Channel_Trigger_INT_Flag(T0_SFR,CCP_CHANNEL_2) == 1)
  16.         {
  17.                 CCP_Clear_Channel_INT_Flag(T0_SFR,CCP_CHANNEL_2);
  18.         }

  19.         if(CCP_Get_Channel_Trigger_INT_Flag(T0_SFR,CCP_CHANNEL_2) == 1)
  20.         {
  21.                 CCP_Clear_Channel_INT_Flag(T0_SFR,CCP_CHANNEL_2);
  22.         }
  23.         GPTIM_Updata_Immediately_Config(T0_SFR,FALSE);                        //禁止立即更新控制位
  24.         GPTIM_Updata_Immediately_Config(T0_SFR,TRUE);           //允许立即更新控制位
  25. }
另外,在IDE中观察功能寄存器,我发现CCPXRY的值没有改变,不知道是为什么。是不是这个IDE观察寄存器的功能是不灵的。(因为手头没示波器,看不出来占空比。)

7666060e5365798b0a.png
yangxiaor520 发表于 2021-7-7 21:30 来自手机 | 显示全部楼层
原理上都一样的
 楼主| 编号10086 发表于 2021-7-8 11:21 | 显示全部楼层

我现在就是两个地方没搞明辨,一个是改不了CCPXRY,另外一个是明明没有使能比较中断,中断还是会进去。
 楼主| 编号10086 发表于 2021-7-8 14:23 | 显示全部楼层
我使用下来发现了几个问题。
  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.          // 通道编号,     取值范围满足“CCP通道”的宏。
  7.         CCP_Compare_InitStructure.m_Channel=CCP_CHANNEL_1|CCP_CHANNEL_2|CCP_CHANNEL_3|CCP_CHANNEL_4;
  8.         CCP_Compare_InitStructure.m_CompareMode=CCP_CMP_SOFT_INT;     //捕捉/比较器模式选择,  取值满足宏CHECK_CCP_CMP_MODE的约定条件。
  9.         CCP_Compare_InitStructure.m_CompareValue=0X7FFF;                  //设置与TX比较的值,     取值范围为16位数据。
  10.         CCP_Compare_Configuration(CCPx,&CCP_Compare_InitStructure);/*这个函数貌似没起到作用哈*/

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



  12.         CCP_Compare_Mode_Config(CCPx,CCP_CHANNEL_1,CCP_CMP_TOGGLE_LEVEL);                //匹配时电平翻转                                        //CCP PWM功能通道模式
  13.         CCP_Compare_Mode_Config(CCPx,CCP_CHANNEL_2,CCP_CMP_TOGGLE_LEVEL);                //匹配时电平翻转                                                //CCP PWM功能通道模式
  14.         CCP_Compare_Mode_Config(CCPx,CCP_CHANNEL_3,CCP_CMP_ACTIVE_LEVEL);                //输出高电平                                                        //CCP PWM功能通道模式
  15.         CCP_Compare_Mode_Config(CCPx,CCP_CHANNEL_4,CCP_CMP_INACTIVE_LEVEL);                //输出低电平                                                        //CCP PWM功能通道模式
这个官方例程的代码。
但是实际上这段程序没有起到作用。
  1. // 通道编号, 取值范围满足“CCP通道”的宏。
  2. CCP_Compare_InitStructure.m_Channel=CCP_CHANNEL_1|CCP_CHANNEL_2|CCP_CHANNEL_3|CCP_CHANNEL_4;
  3. CCP_Compare_InitStructure.m_CompareMode=CCP_CMP_SOFT_INT; //捕捉/比较器模式选择, 取值满足宏CHECK_CCP_CMP_MODE的约定条件。
  4. CCP_Compare_InitStructure.m_CompareValue=0X7FFF; //设置与TX比较的值, 取值范围为16位数据。
  5. CCP_Compare_Configuration(CCPx,&CCP_Compare_InitStructure);/*这个函数貌似没起到作用哈*/

  6. TIM_Reset(CCPx);//定时器外设复位,使能外设时钟
经过我的测试得出两个结论:
  1. CCP_Compare_Configuration
这个函数是不能用“或”的
  1. CCP_Compare_InitStructure.m_Channel=CCP_CHANNEL_1|CCP_CHANNEL_2|CCP_CHANNEL_3|CCP_CHANNEL_4;
这样子用或写起来,实际上只有最后的CHANNEL_4被配置了。
另外
  1. TIM_Reset(CCPx);//定时器外设复位,使能外设时钟
这个会把上面配置的通道4给复位掉。。
也就是说实际上,TIM_Reset(CCPx)  之前的代码都没起到作用。
 楼主| 编号10086 发表于 2021-7-8 17:22 | 显示全部楼层

大哥,你有试过一个通用定时器开四个通道比较中断吗?能给个例程吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

76

帖子

0

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