- 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, 下载次数: 8)