打印
[KungFu32位 MCU]

有大佬用过KF350的输出比较功能吗?

[复制链接]
10446|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小弟最近在熟悉这款单片机,公司打算用这款单片机代替stm32。
看到CCPx_Compare_Mode这个例程,有点疑惑向大家请教一下。

我看例程的中断代码是这样写的。
void __attribute__((interrupt))_T0_exception (void)
{
        GPTIM_Clear_Updata_INT_Flag(T0_SFR);                                                                                //清更新时间标志位
        GPTIM_Clear_Overflow_INT_Flag (T0_SFR);                                                                                //清T0溢出中断标志位

        if(CCP0_Flag)
        {
                CCP0_Flag =0;
                CCP_Compare_Mode_Config(CCP0_SFR,CCP_CHANNEL_1,CCP_CMP_ACTIVE_LEVEL);                //比较模式,匹配时输出高电平
                CCP_Set_Compare_Result(CCP0_SFR,CCP_CHANNEL_1,0x8000);                                                //设置比较值,
                GPTIM_Set_Period(T0_SFR,0xF000);                                                                                        //更新周期值
                GPIO_Toggle_Output_Data_Config (GPIOB_SFR,GPIO_PIN_MASK_8);                 //PB翻转
        }
        else
        {
                CCP0_Flag =1;
                CCP_Compare_Mode_Config(CCP0_SFR,CCP_CHANNEL_1,CCP_CMP_INACTIVE_LEVEL);        //比较模式,匹配时输出低电平
                CCP_Set_Compare_Result(CCP0_SFR,CCP_CHANNEL_1,0x8000);                                        //设置比较值
                GPTIM_Set_Period(T0_SFR,0xF000);                                                                                //更新周期值
                GPIO_Toggle_Output_Data_Config (GPIOB_SFR,GPIO_PIN_MASK_8);             //PB8翻转
        }

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


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



于是我自己写了一个it.c。在CH1比较中断中翻转PB8,然后失能这个通道。但是实际跑下来这个失能的函数没有效果(表现为板子的灯一直是亮的。)
void __attribute__((interrupt))_T0_exception (void)
{
        GPTIM_Clear_Updata_INT_Flag(T0_SFR);                                                                                //清更新时间标志位
        GPTIM_Clear_Overflow_INT_Flag (T0_SFR);                                                                                //清T0溢出中断标志位


        if(CCP_Get_Channel_Trigger_INT_Flag(T0_SFR,CCP_CHANNEL_1) == 1)
        {
                CCP_Clear_Channel_INT_Flag(T0_SFR,CCP_CHANNEL_1);
                CCP_Channel_INT_Config(T0_SFR,CCP_CHANNEL_1,FALSE);
                GPIO_Toggle_Output_Data_Config(GPIOB_SFR,GPIO_PIN_MASK_8);
        }

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

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

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


使用特权

评论回复
沙发
yangxiaor520| | 2021-7-7 21:30 | 只看该作者
原理上都一样的

使用特权

评论回复
板凳
编号10086|  楼主 | 2021-7-8 11:21 | 只看该作者

我现在就是两个地方没搞明辨,一个是改不了CCPXRY,另外一个是明明没有使能比较中断,中断还是会进去。

使用特权

评论回复
地板
编号10086|  楼主 | 2021-7-8 14:23 | 只看该作者
我使用下来发现了几个问题。
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);



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

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



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

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

使用特权

评论回复
5
编号10086|  楼主 | 2021-7-8 17:22 | 只看该作者

大哥,你有试过一个通用定时器开四个通道比较中断吗?能给个例程吗?

使用特权

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

本版积分规则

15

主题

76

帖子

0

粉丝