HAL--高级定时器

本文详细介绍了STM32高级定时器TIM1/TIM8的功能特性,包括断路输入、输出比较、输入捕获等操作。阐述了16位定时器的上下计数模式,并解释了如何通过GPIO配置互补输出。同时,深入探讨了外部时钟模式1和2的配置方法,以及内部触发输入的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

高级定时器:TIM1/TIM8

断路输入 , 输出比较 , 输入捕获

16位,可上下计数

有四个GPIO其中通道1-3还有互补输出(实现一路正转,一路反转)GPIO

时钟来自PLCK2

外部时钟模式1(时钟捕获):

时钟信号输入引脚:

                  外部的GPIO TIx 对应TIMx_CH1/2/3/4

                 TIMx_CCMRx的位CCxS[1:0]配置,其中CCMR1控制TI1/2,CCMR2控制TI3/4

 

滤波器:

                  如果来自外部的时钟信号的频率过高或者混杂有高频干扰信号的话,就需要使用滤波器去对FTRP信号重新采样,来达到降频或去除高频干扰的目的

                  由TIMx_CCMx的位ICxF[3:0]配置

 

边沿检测:

                检测来自于滤波器的输出,在成为触发信号之前,需要进行边沿检测,决定是上升沿有效还是下降沿有效

                由TIMx_CCER的位CCxP 和 CCxN配置

 

触发选择:

                   当使用外部时钟模式1时,触发源有两个,一个是滤波后的定时器输入1(TI1FP1)和滤波后的定时器2(TI2FP2)

                    由TIMx_SMCR的位TS[2:0]配置

 

从模式选择:

                        选定了触发源信号后,最后需要把信号连接到TRGI引脚,让触发信号成为外部时钟模式1的输入,最终等于CK_PSC,然后驱动计数器CNT计数

                             具体的配置TIMx_SMCR的位SMS[2:0]为111即可选择外部时钟模式1

 

使能计数器:

               使能计数器开始计数

              TIMx_CR1的位CEN配置

 

外部时钟模式2(时钟捕获):

 

外部触发极性:

                     来自ETR引脚的信号可以选择上升沿、下降沿有效   TIMx_SMCR的位ETP配置

外部触发预分频器:

                     来自ETRP 的信号频率不可以超过TIMx_CLK(180M)的1/4,可能需要降频  TIMx_SMCR的位ETPS[1:0]配置

滤波器

从模式选择

                

                选定了触发源信号后,最后需要把信号连接到ETRF引脚,让触发信号成为外部时钟模式2的输入,最终等于CK_PSC,然后驱动计数器CNT计数

                 具体的配置TIMx_SMCR的位ECE为 1即可选择外部时钟模式2

使能计数器:

 

内部触发输入(时钟捕获):

                   内部输入是使用一个定时器作为另一个定时器的预分频器。硬件上高级控制定时器和通用控制定时器在内部连接在一起,可以实现定时器同步或级联

                    TIMx_SMCR的位TS[2:0]配置

输入捕获

输入滤波和边沿检测

通道捕获

预分频

捕获寄存器

 

 

输出比较

对外输出PWM波形

     作用

死区时间(用于2路PWM互补输出控制电机)

 

断路输出---监控互补信号无效状态,监控电机断路

输出比较

foc算法  控制交流电机

s

 

### STM32 HAL 高级定时器中断配置使用教程及错误排查 #### 1. 定时器初始化与中断使能 在使用STM32 HAL配置高级定时器(如TIM1或TIM8)的中断功能时,需注意其特殊性。高级定时器与其他通用定时器相比,在中断处理上存在差异。例如,对于通用定时器 TIM2 和 TIM3,通常只需启用 `TIMx_IRQn` 即可[^2]。然而,高级定时器(如TIM1和TIM8)则需要针对具体的中断类型分别配置相应的中断向量。 以下是典型的高级定时器中断配置流程: ```c // 初始化定时器结构体并配置参数 TIM_HandleTypeDef htim1; void MX_TIM1_Init(void) { __HAL_RCC_TIM1_CLK_ENABLE(); // 启用定时器时钟 htim1.Instance = TIM1; htim1.Init.Prescaler = 71; // 设置预分频器 htim1.Init.CounterMode = TIM_COUNTERMODE_UP; // 计数模式向上计数 htim1.Init.Period = 999; // 自动重装载值 htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; if (HAL_TIM_Base_Init(&htim1) != HAL_OK) { // 初始化基础定时器 Error_Handler(); } } ``` #### 2. 中断函数注册与启动 为了确保高级定时器能够正常触发中断,除了常规的初始化外,还需要调用特定的启动函数。例如,对于通用定时器 TIM3 的中断启动可以通过如下方式实现: ```c HAL_TIM_Base_Start_IT(&htim3); ``` 但对于高级定时器 TIM1 或 TIM8,则需要注意不同的中断源可能对应不同的服务函数名称。例如,更新事件中断的服务函数可能是 `TIM1_UP_IRQHandler` 而不是简单的 `TIM1_IRQHandler`。 因此,在编写代码时应特别留意所使用的具体型号及其手册中的说明文档。以下是一个完整的例子展示如何开启 TIM1 更新中断: ```c // 开启更新中断 __HAL_TIM_ENABLE_IT(&htim1, TIM_IT_UPDATE); // 注册回调函数(如果需要) HAL_TIM_RegisterCallback(&htim1, HAL_TIM_BASE_MSPINIT_CB_ID, MyCustomInitCallback); // 实际启动 IT 功能 if(HAL_TIM_Base_Start_IT(&htim1)!= HAL_OK){ Error_Handler(); } // 用户自定义回调函数模板 void MyCustomInitCallback(TIM_HandleTypeDef *htim){ // 处理逻辑... } ``` #### 3. NVIC 配置注意事项 另外一个重要环节是对嵌套矢量中断控制器(NVIC)进行适当设定以便接收来自指定定时器的请求信号。这一步骤同样不可忽视,因为即使正确设置了定时器本身以及关联的软件接口层APIs,但如果未激活相应IRQ通道的话依旧不会有任何响应发生。 ```c // 配置NVIC优先级组 HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4); // 设定TIM1 Update中断优先级 并使之处于活动状态 HAL_NVIC_SetPriority(TIM1_UP_IRQn, 0, 0); HAL_NVIC_EnableIRQ(TIM1_UP_IRQn); ``` 以上操作完成后,当满足条件时就会跳转至预先安排好的ISR入口地址处执行进一步的动作序列了。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值