这个定时器是倒数的,数字大的,功能少。
我找到了一段比我形象的解读。
不管多复杂,都是这三个寄存器
可以看到是和TIM1的中断重叠的,需要程序里面判断
在NVIC里面确实是这样的
这个是使能
Bit0就是管这个的
输入模式是使用这个内置的这个时钟
参数没几个,下面是时钟进来太快,会分频一下
其实就是配置这个结构体
GUI选好的
就把这个htim9传给这个函数来启动
这些是TIM可以传入的定时器源,在这里
时钟也OK
有着丰富的中断事件
也就是这个图里面最小的定时器部分,进来以后到CK_PSC,往后:
就是要这些事件
注意,HAL库里面这个定时器的中断没有写,需要自己写上
开始运行以后,有事件产生,然后就可以编程控制了。
这些就是我们感兴趣的中断事件
在HAL库
所有的回调函数,在这里都是弱定义
需要复制一个函数头过来重新写
每个回调函数在特定的定时器事件发生时被调用。
HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef htim)
就是这里
HAL_TIM_PeriodElapsedHalfCpltCallback(TIM_HandleTypeDef htim)
HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef htim)
HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef htim)
HAL_TIM_IC_CaptureHalfCpltCallback(TIM_HandleTypeDef htim)
HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef htim)
HAL_TIM_PWM_PulseFinishedHalfCpltCallback(TIM_HandleTypeDef htim)
HAL_TIM_TriggerCallback(TIM_HandleTypeDef htim)
HAL_TIM_TriggerHalfCpltCallback(TIM_HandleTypeDef htim)
HAL_TIM_ErrorCallback(TIM_HandleTypeDef htim)
因为我们上面写了,TIM1的中断和9的在一起,所以要判断
有点像Python里面的self的感觉
通过定时器 TIM9 的溢出事件,每 500ms 切换一次 GPIO 引脚的状态。
如果写程序的话,其实已经完美了。但是我们靠这个东西吃饭,那就需要继续挖。
寄存器这些都没有看见,怎么做到的?
这个函数
上面函数的返回值是这个的时候才证明可以继续执行
确定上面OK,就是用一个宏打开我们感兴趣的中断
正是我们感兴趣的
使用宏的效率更高
继续看看这个初始化的函数
如果启用了回调机制(USE_HAL_TIM_REGISTER_CALLBACKS == 1),则会使用回调函数来初始化硬件。
否则,直接调用 HAL_TIM_Base_MspInit 函数进行硬件初始化。
State = HAL_TIM_STATE_BUSY;
在初始化过程中,定时器的状态设置为 BUSY,表示当前正在执行初始化操作。
这行代码是核心操作,它调用 TIM_Base_SetConfig 函数来配置定时器的基本设置,传入定时器实例和定时器初始化参数(包括计数模式、周期、时钟分频等)。
检查定时器句柄和配置参数的有效性。 如果定时器还未初始化,进行硬件和回调函数的初始化。 配置定时器的基本设置(如计数模式、时钟分频等)。 初始化 DMA 和通道状态。 设置定时器为就绪状态,表示定时器已经准备好进行工作。
以上就是初始化过程。
其实说了这么多,中断的寄存器这部分还是没有摸到。
在这里
函数核心在此
HAL_TIM_IRQHandler 是一个通用的中断处理函数,处理与定时器相关的所有中断事件。
它会根据不同的中断标志来调用对应的回调函数,从而完成特定的任务,例如捕获比较(input capture)、输出比较(output compare)、PWM脉冲完成等。
itsource 表示定时器的中断使能寄存器(DIER),它包含了各个中断源的使能位。 itflag 表示定时器的状态寄存器(SR),它包含了各个中断的标志位,指示哪种事件发生了。
如果定时器溢出或达到了自动重载值(即定时器周期),则会触发更新事件,调用 PeriodElapsedCallback。
上面是回调,下面是非常细节的细节。
用于处理中断标志 TIM_FLAG_UPDATE,它检查是否发生了定时器的 更新事件(比如定时器溢出或者达到自动重载值)。当这种事件发生时,代码会清除该中断标志,并调用一个回调函数 PeriodElapsedCallback。
检查定时器是否发生了 更新事件(如溢出或计数器到达自动重载值)。
确保 更新中断 被使能(即相关的中断被允许触发)。
清除中断标志,防止中断重复触发。
htim 是定时器句柄,包含定时器的配置和状态。回调函数通过句柄传递,以便访问和操作相关的定时器信息。
void (*PeriodElapsedCallback)(struct __TIM_HandleTypeDef *htim);
在这里
大概就是这样了。