12-STM32定时器从模式

12-STM32定时器从模式

在这里插入图片描述

外部时钟模式1的功能时个定时器提供计数的信号

另外三种则是控制定时器的工作状态

具体如何控制呢?

在从模式控制器被占用时,触发控制器还可以从内部时钟源和ETR引入外部信号,这就是为什么ETR要独辟蹊径的原因

在这里插入图片描述

复位模式

对计数器的状态进行复位

在这里插入图片描述

时钟源为内部时钟信号,将定时器的从模式改为复位模式,且触发源为TI1FP1,即检测到TI1FP1的上升沿信号时,就会将计数器中的值直接置为0

如何区分时自动重装载寄存器触发的中断,还是从模式控制器触发的中断呢?

在这里插入图片描述

只需要看触发器中断中对应的标志位是否置为1即可区分

/* USER CODE BEGIN 0 */
char UpdateMessage[]= "自动重装载ing";
char TriggerMessage [] ="从模式触发ing";
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){

	if (htim == &htim2) {

		if (__HAL_TIM_GET_FLAG(htim,TIM_FLAG_TRIGGER)  == SET) {
			//清0从模式引起的触发器标志位
			__HAL_TIM_CLEAR_FLAG(htim,TIM_FLAG_TRIGGER);
			HAL_UART_Transmit(&huart2, (uint8_t *)TriggerMessage, strlen(TriggerMessage), 100);
		}else{

		HAL_UART_Transmit(&huart2, (uint8_t *)UpdateMessage, strlen(UpdateMessage), 100);
		}
	}

}
/* USER CODE END 0 */

门模式

当输入信号变为高电平时,门就打开(开始计数),当输入信号变为低电平时,门就关闭(停止计数)

在这里插入图片描述

/* USER CODE BEGIN 0 */
char UpdateMessage[]= "自动重装载ing";
char TriggerMessage [] ="从模式触发ing";
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){   //门模式不会触发次中断
	if (htim == &htim2) {
		HAL_UART_Transmit(&huart2, (uint8_t *)UpdateMessage, strlen(UpdateMessage), 100);
	}

}
/* USER CODE END 0 */
XXXXX
/* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start_IT(&htim2);
  int counter = 0;
  char massge[50] = "";
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

	  if (__HAL_TIM_GET_FLAG(&htim2,TIM_FLAG_TRIGGER)  == SET) {
	  			__HAL_TIM_CLEAR_FLAG(&htim2,TIM_FLAG_TRIGGER);
	  			HAL_UART_Transmit(&huart2, (uint8_t *)TriggerMessage, strlen(TriggerMessage), 100);
	  		}
	  counter = __HAL_TIM_GET_COUNTER(&htim2);
	  sprintf(massge,"counter:%d",counter);
	  HAL_UART_Transmit(&huart2, (uint8_t *)massge, strlen(massge), HAL_MAX_DELAY);
	  HAL_Delay(1000);

  }
  /* USER CODE END 3 */

只有检测到上升沿时,计数器才会计数,不然就停止计数。

触发模式

只有检测到上升沿或者下降沿时,才会开始计时,初始状态为0

但触发模式仅仅只能启动定时器并不能停止计时器。

所以有时,会配合单脉冲模式一起使用

在这里插入图片描述

勾选One Pulse Mode

即计时器不在循环计数,记数到自动重新装载后停止,且值为0;当再次触发时,开始计数。

在程序启动时,会触发自动重装载中断可在启动计时器前使用

__HAL_TIM_CLEAR_FLAG(&htim2,TIM_FLAG_UPDATE);
或者
__HAL_TIM_CLEAR_IT(&htim2,TIM_IT_UPDATE);

两个函数内部实现都一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值