历史上的今天
今天是:2025年06月18日(星期三)
2018年06月18日 | STM32F4定时器 -- 定时中断
2018-06-18 来源:eefocus
1. 定时器简介
STM32F4的定时器分布如下:
- 其中基本定时器包括TIM6、TIM7,其结构最简单,也具有最基本的定时功能,一是用于基本定时、产生时基、二是用于驱动DAC数模转换器。
- 其中通用定时器包括TIME2-TIME5,TIME9-TIME14共10个;通用定时器除了包含基本定时器的功能外还有输入捕获、输出比较和PWM功能等。
- 其中高级定时器包括TIM1、TIM8;
定时器的相关常用寄存器功能如下:
1.1 时钟源选择寄存器(TIMx_SMCR)
定时器的时钟源有4个:
- 内部时钟(CK_INT)
- 外部时钟模式1:外部输入脚(TIx)
- 外部时钟模式2:外部触发输入(ETR),仅适用于TIM2、TIM3、TIM4
- 内部触发输入(ITRx):使得A定时器作为B定时器的预分频器(A为B提供时钟)
这是通过设置TIMx_SMCR的相关位来选择的。其中内部时钟(CK_INT)来自于APB1或APB2总线。
1.2 预分频寄存器(TIMx_PSC)
该寄存器用于对时钟进行分频,然后提供给计数器,作为计数器的时钟。
其中16位空间存储分频系数。
1.3 定时器计数寄存器(TIMx_CNT)
它存储了定时器当前的计数值。
1.4 自动重装载寄存器(TIMx_ARR)
该寄存器在物理结构上对应着2个寄存器,一个是程序员可以操作的,另一个是看不到且不能操作的ARM把它叫做影子寄存器。实际上真正起作用的是影子寄存器。
根据 TIMx_CR1 寄存器中 APRE 位的设置: APRE=0 时,预装载寄存器的内容可以随时传送到影子寄存器,此时 2 者是连通的;而 APRE=1 时,在每一次更新事件(UEV)时,才把预装载寄存器( ARR) 的内容传送到影子寄存器。
1.5 DMA/中断使能寄存器(TIMx_DIER)
这里我们只用最后一位:更新中断使能(UIE:update interrupt enable),改为置1用来允许由更新事件产生的中断。
1.6 控制寄存器1(TIMx_CR1)
简单应用中,我们只需要使用最后一位:计数器使能位(CEN:counter enable),改为必须置1才能使计数器开始计数。
1.7 状态寄存器(TIMx_SR)
该寄存器用来标记当前定时器相关的各种事件/中断是否发生。
2. 库函数操作实例
接下来我们使用定时器产生定时中断,根据配置定时器的实际步骤,以TIM3为例解析配置过程。
定时器相关的库函数主要集中在固件库文件 stm32f4xx_tim.h 和 stm32f4xx_tim.c 文件中。 定时器配置步骤如下:
2.1 定时器时钟使能
TIM3挂载在APB1下,所以要通过使能APB1总线的使能函数来使能TIM3的时钟源。
2.2 初始化定时器参数
配置定时器相关参数。
void TIM_TimeBaseInit(
TIM_TypeDef *TIMx,
TIM_TimeBaseInitTypeDef *TIM_TimeBaseInitStruct
);
第一个参数是指定哪个定时器;
第二个参数是定时器配置参数结构体;
typedef struct{
uint16_t TIM_Prescaler; //分频系数
uint16_t TIM_CounterMode; //计数方式(向上、向下、中央对其)
uint16_t TIM_Period; //自动重载计数值(即定时时间)
uint16_t TIM_ClockDivision; //时钟分频因子????
uint8_t TIM_RepetitionCounter;
} TIM_TimeBaseInitTypeDef;
实际的:
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //声明初始化参数结构体变量
TIM_TimeBaseStructure.TIM_Period = 5000; //以下开始填充
TIM_TimeBaseStructure.TIM_Prescaler =7199;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //执行初始化
2.3 设置TIM3_DIER允许更新中断
库函数TIM_ITConfig用来设置打开中断
void TIM_ITConfig(TIM_TypeDef* TIMx, //指定哪个定时器
uint16_t TIM_IT, //指定中断类型(更新中断、触发中断等等)
FunctionalState NewState); //使能还是失能
实际的:
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能更新中断
2.4 设置中断优先级
既然使用中断,就必须设置NVIC,使用NVIC_Init 函数设置。这里就不多讲了,很常用。
2.5 使能定时器
配置好后要使能定时器,使其开始工作,使用TIM_Cmd函数:
void TIM_Cmd(TIM_TypeDef* TIMx, //指定定时器
FunctionalState NewState); //指定状态
实际的:
TIM_Cmd(TIM3, ENABLE); //使能 TIM3 外设
2.6 编写中断函数
最后还是要编写中断函数来处理定时器产生的相关中断。流程为:
在中断产生后:通过状态寄存器的值来判断此次中断属于什么类型->执行相关操作->清除SR寄存器的中断标志。
读取中断状态的函数:
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t);
清除中断状态标志位的函数:
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);
另外,固件库中还提供了两个函数用来判断定时器的状态和清除定时器状态标志函数:TIM_GetFlagStatus 和 TIM_ClearFlag,它们的作用和上面两个相似,不过它们要先判断中断是否使能,然后再判断中断标志位,而TIM_GetITStatus直接判断中断标志位。
实际的:
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //判断中断状态
{
//
//do sth here. //执行操作
//
}
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除中断标志
上一篇:用定时器控制Led灯闪烁
史海拾趣
|
1. 怎样在TCL脚本分配管脚 source .tcl 有点问题: # source stratix_pin_assign.tcl couldn\'t read file \"stratix_pin_assign.tcl\": no such file or directory 答: From the Tools menu select Tcl s, and then from the project folder ...… 查看全部问答> |
|
进电机作为执行元件,是机电一体化的关键产品之一, 广泛应用在各种自动化控制系统中。随着微电子和计算机技术的发展,步进电机的需求量与日俱增,在各个国民经济领域都有应用。 步进电机是一种将电脉冲转化为角位移的执行机构。当步进驱动器接收 ...… 查看全部问答> |
|
关于自定制的WinCE操作系统上不能运行C#编写的应用程序的问题 我自己定制的WinCE操作系统上不能运行C#编写的应用程序,现象是双击应用程序图标,光标显示“运行”状态,之后就什么也没出现(我做的应用程序的用户界面压根就没显示),另外:在定制操作系统时,我添加上.NET Compact Framwork 1.0了,应用程序是用 ...… 查看全部问答> |
|
【我给XILINX资源中心做贡献】关于i2c-slave端程序(附源码) 关于i2c-slave端程序(附源码)这段程序想要实现的功能是:i2c slave端(地址7位)由主控制器读或写一个字节的数据(word_r_address,word_w_address)… 查看全部问答> |
|
记忆体回流炉温度测试仪 型号:RCP-600(MALCOM) 记忆体回流炉温度测试仪 型号:RCP-600(MALCOM)记忆体回流炉温度测试仪RCP-600 *PC is not included能更加有效的对 ...… 查看全部问答> |
|
omapl138是一款集成arm926ejs和c6000dsp的集成gpp,功耗不高,而且接口也很齐全。前些时间用它和cyclone4做运算平台。用到了fpp来boot fpga,非常好用的接口,在没有做过多优化的情况下boot速度能达到30MBps,(好像是这个速度,记不清楚了,反正比 ...… 查看全部问答> |
|
各位:在下刚从网上收集全了 国嵌2440的实验手册,不知打到6410和2440的差别大不大??所以求助各位能够分享一个 6410的,或者我出钱买一套也无所谓。。另外我有国嵌2440培训的全套视频。。私信我跟你分享… 查看全部问答> |
|
基于MSP430 LaunchPad 和2.4G RF Module 的聊天室 本贴是在其他地方看到转过来了,觉得很有创意 前段時間在論壇的活動中拿了MSP430 LaunchPad,總要起點作用吧。 就做了這個史上最無聊,最無用的聊天工具。辦公室的工程師每人分一塊LaunchPad,接上我們公司常用的2.4G RF Module 用VB寫了個上位 ...… 查看全部问答> |




