关于stm32f4上的Timer1的问题

2019-07-14 18:02发布

我在avr上进行了长时间的编程后尝试了STM32,我想使用计时器来处理冻结:
  1. <font size="4">HAL_tiM_Base_Start_IT(&htim1);
  2. while ((GPIOA->IDR  & GPIO_PIN_3) == 0x08)
  3. {
  4.         Clk_h
  5.     DWT_Delay(200);
  6.     Clk_l
  7.     DWT_Delay(200);
  8. }
  9. HAL_TIM_Base_Stop_IT(&htim1);</font>
复制代码
在上面的代码我等待GPIO_PIN_3将变为低状态。事情是它可能会永远保持高状态,所以我想启动timer1并在500ms之后启动触发中断。问题是while循环捕获0需要大约100us,而我的计时器配置为:


  1. static void MX_TIM1_Init(void)
  2. {

  3.   TIM_ClockConfigTypeDef sClockSourceConfig;
  4.   TIM_MasterConfigTypeDef sMasterConfig;

  5.   htim1.Instance = TIM1;
  6.   htim1.Init.Prescaler = 16799;
  7.   htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  8.   htim1.Init.Period = 4999;
  9.   htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  10.   htim1.Init.RepetitionCounter = 0;
  11.   if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
  12.   {
  13.     _Error_Handler(__FILE__, __LINE__);
  14.   }

  15.   sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  16.   if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)
  17.   {
  18.     _Error_Handler(__FILE__, __LINE__);
  19.   }

  20.   sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  21.   sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  22.   if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
  23.   {
  24.     _Error_Handler(__FILE__, __LINE__);
  25.   }

  26. }
复制代码
所以它远远超过100us,不知道为什么。正如我理解计时器,启动它后,它应该开始计数,当达到该值时,它将触发中断。但即使我立即开始和停止计时器,这里:
  1. HAL_TIM_Base_Start_IT(&htim1);
  2. HAL_TIM_Base_Stop_IT(&htim1);
复制代码
无论如何它会触发一次。我只需要在计数寄存器溢出时触发中断功能。这是我的溢出函数,它位于stm32f4xx_it.c:
  1. void TIM1_UP_TIM10_IRQHandler(void)
  2. {
  3.   /* USER CODE BEGIN TIM1_UP_TIM10_IRQn 0 */

  4.   /* USER CODE END TIM1_UP_TIM10_IRQn 0 */
  5.   HAL_TIM_IRQHandler(&htim1);
  6.   /* USER CODE BEGIN TIM1_UP_TIM10_IRQn 1 */
  7.     sprintf(str123,"<<FAIL>>");
  8.     CDC_Transmit_FS((uint8_t*)str123,strlen(str123));
  9.   /* USER CODE END TIM1_UP_TIM10_IRQn 1 */
  10. }
复制代码




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。