可能是我把问题描述的太复杂了,大家没耐心看吧,简化一下就是这样的:
按下一个KEY启动TIM4开始计数,怎么屏蔽掉启动TIM4时产生的那次更新中断(从模式控制更新中断,SMS=110)???因为我只想要溢出更新中断。
按寄存器上写的是要置位URS,我也确确实实置位了,但是怎么屏蔽不掉?
-----------------------------------------------------------------------------------------------
前面有一位仁兄发帖询问怎么用TIM检测USB的复位信号(注:下降沿信号并持续Xms),并通过中断方式通知系统。
我对STM32也非常感兴趣,就顺便想帮这位仁兄实验一下:
我的想法是:用USB复位信号的下降沿启动TIMx,计数Xms后溢出,在更新中断中检测复位信号的状态,如果该信号依然为低则认为USB复位了(点亮LED1);TIMx启动设置为触发模式,计数设置为单脉冲模式(后来因该句导致CNT无法启动就屏蔽此句),即在发生下一次更新的时候停止计数。
我用万利199的板子,我发现TIM4有2个通道的重映射管脚正好落在摇杆按键的LEFT和RIGHT上,所以我想用摇杆按键来模拟USB的复位信号。
现在的症状:我每次按键立即进入更新中断。
如果程序中我没有把CR1寄存器的URS位置一,这是合理的,但是因为我只希望让溢出的时候进更新中断,所以我自己写了几行代码把URS这一位置1。程序运行的时候,URS这一位也确确实实置1了,但是怎么不起作用?
下面我依次贴上 一直没有按键,停止运行后 各个寄存器的配置情况图;
按下按键, 再停止运行 各个寄存器的值图
还有我的部分代码
(原文件名:keyno截图00.png)
(原文件名:keyyes(KeyDownStop)截图01.png)
{
#ifdef DEBUG
debug();
#endif
/* System Clocks Configuration */
RCC_Configuration();
/* NVIC configuration */
NVIC_Configuration();
/* Configure the GPIO ports */
GPIO_Configuration();
// TIM_DeInit (TIM4 );
/* Time base configuration */
// TIM_TimeBaseStructure.TIM_Period = 65535;
// TIM_TimeBaseStructure.TIM_Prescaler = 1;
TIM_TimeBaseStructure.TIM_Period = 6000;
TIM_TimeBaseStructure.TIM_Prescaler = 65535;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
/* TIM4 configuration in Input Capture Mode */
TIM_ICStructInit(&TIM_ICInitStructure);
TIM_ICInitStructure.TIM_ICMode = TIM_ICMode_ICAP;
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0;
TIM_ICInit(TIM4, &TIM_ICInitStructure);
/* One Pulse Mode selection */
// TIM_SelectOnePulseMode(TIM4, TIM_OPMode_Single);
TIM_ITConfig(TIM4, TIM_IT_Update , ENABLE);
TIM_ITConfig(TIM4, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4 | TIM_IT_Trigger , DISABLE);
MySetBitUrs(TIM4);
/* Input Trigger selection */
TIM_SelectInputTrigger(TIM4, TIM_TS_TI1FP1);
/* Slave Mode selection: Trigger Mode */
TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_Trigger);
while (1)
{
}
}
void TIM4_IRQHandler(void)
{
if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM4, TIM_IT_Update );
readvalue = GPIO_ReadInputDataBit( GPIOD, GPIO_Pin_12 );
if(readvalue==0)
{
GPIO_SetBits(GPIOC, GPIO_Pin_7);
}
else
GPIO_SetBits(GPIOC, GPIO_Pin_6);
}
}
一周热门 更多>