我想把通用定时器,开四个通道的比较中断。。我看例程里面的写法,是不能开四个通道的中断吗?
我自己昨天看了一上午,今天看了一下午,整整一天了还没搞明白怎么开四个比较中断。
主要遇到了一个问题,就是四个通道的比较中断标志无法清除。。我单步调试的时候,把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)
|