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);
两个函数内部实现都一样。