我在avr上进行了长时间的编程后尝试了STM32,我想使用计时器来处理冻结:
- <font size="4">HAL_tiM_Base_Start_IT(&htim1);
- while ((GPIOA->IDR & GPIO_PIN_3) == 0x08)
- {
- Clk_h
- DWT_Delay(200);
- Clk_l
- DWT_Delay(200);
- }
- HAL_TIM_Base_Stop_IT(&htim1);</font>
复制代码
在上面的代码我等待GPIO_PIN_3将变为低状态。事情是它可能会永远保持高状态,所以我想启动timer1并在500ms之后启动触发中断。问题是while循环捕获0需要大约100us,而我的计时器配置为:
- static void MX_TIM1_Init(void)
- {
- TIM_ClockConfigTypeDef sClockSourceConfig;
- TIM_MasterConfigTypeDef sMasterConfig;
- htim1.Instance = TIM1;
- htim1.Init.Prescaler = 16799;
- htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
- htim1.Init.Period = 4999;
- htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
- htim1.Init.RepetitionCounter = 0;
- if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
- {
- _Error_Handler(__FILE__, __LINE__);
- }
- sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
- if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)
- {
- _Error_Handler(__FILE__, __LINE__);
- }
- sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
- sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
- if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
- {
- _Error_Handler(__FILE__, __LINE__);
- }
- }
复制代码
所以它远远超过100us,不知道为什么。正如我理解计时器,启动它后,它应该开始计数,当达到该值时,它将触发中断。但即使我立即开始和停止计时器,这里:- HAL_TIM_Base_Start_IT(&htim1);
- HAL_TIM_Base_Stop_IT(&htim1);
复制代码
无论如何它会触发一次。我只需要在计数寄存器溢出时触发中断功能。这是我的溢出函数,它位于stm32f4xx_it.c:- void TIM1_UP_TIM10_IRQHandler(void)
- {
- /* USER CODE BEGIN TIM1_UP_TIM10_IRQn 0 */
- /* USER CODE END TIM1_UP_TIM10_IRQn 0 */
- HAL_TIM_IRQHandler(&htim1);
- /* USER CODE BEGIN TIM1_UP_TIM10_IRQn 1 */
- sprintf(str123,"<<FAIL>>");
- CDC_Transmit_FS((uint8_t*)str123,strlen(str123));
- /* USER CODE END TIM1_UP_TIM10_IRQn 1 */
- }
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
// SETUP STUFF:
// Enable the timer clock. I use the HAL for this
// as it adds the required startup delay. The code
// is pretty simple though.
__HAL_RCC_TIM1_CLK_ENABLE();
// Reset the control register. This gives us the
// default operation which is counting up with no
// divider.
TIM1->CR1 = 0;
// Set prescaler
TIM1->PSC = 16799;
// Will generate interrupt when this value is reached
TIM1->ARR = 4999;
// The PSC and ARR values are currently in the preload
// registers. To load them into the active registers we
// need an update event. We can do this manually as
// follows (or we could wait for the timer to expire).
TIM1->EGR |= TIM_EGR_UG;
// Timer is now ready to use.
// POLLING OPERATION:
// Next we setup the interrupts. We should first clear
// the update interrupt flag in case it has already been
// set.
TIM1->SR = ~TIM_SR_UIF;
// Then we can enable the update interrupt source
TIM1->DIER |= TIM_DIER_UIE;
// Note: we also need to setup the interrupt channel on
// the NVIC. Once that is done the isr will fire
// when the timer reaches 5000.
// We can now start the timer running...
TIM1->CR1 |= TIM_CR_CEN;
while ((GPIOA->IDR & GPIO_PIN_3) == 0x08)
{
Clk_h
DWT_Delay(200);
Clk_l
DWT_Delay(200);
}
// ...and stop the timer when we're done
TIM1->CR1 &= ~TIM_CR_CEN;
// Note if we want to repeat the polling loop again we should
// issue another TIM1->EGR |= TIM_EGR_UG event as this
// resets the timer to zero.
一周热门 更多>