怎么屏蔽启动TIMx瞬间产生的更新中断?

2020-01-01 17:54发布

可能是我把问题描述的太复杂了,大家没耐心看吧,简化一下就是这样的:

按下一个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)
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
2nd090215
1楼-- · 2020-01-01 21:20
用得万利的板子  IAR4.42
2nd090215
2楼-- · 2020-01-01 23:22
int main(void)
{
#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)
  {
  }            
}
2nd090215
3楼-- · 2020-01-02 01:52
u8 readvalue=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);
    }
  
}
2nd090215
4楼-- · 2020-01-02 05:13
 精彩回答 2  元偷偷看……
jpjavr
5楼-- · 2020-01-02 07:09
这些东西例程里边应该是有例子的,但是不怎么详细
yaoyaoxiaotuzi
6楼-- · 2020-01-02 08:41
mark

一周热门 更多>