小弟最近在熟悉这款单片机,公司打算用这款单片机代替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观察寄存器的功能是不灵的。(因为手头没示波器,看不出来占空比。)
|