历史上的今天
返回首页

历史上的今天

今天是: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 );        //清除中断标志


推荐阅读

史海拾趣

联智(Celfras)公司的发展小趣事

为了更好地推动快充技术的发展和应用,联智加入了终端快充行业协会。作为该协会的成员,联智积极贡献自身在快充协议、电源管理无线充电芯片和方案研发方面的经验和技术,与协会其他成员共同推动充电技术的标准化、产业化应用和推广。这一举措不仅有助于提升联智在快充行业的知名度和影响力,还将促进整个行业的健康发展。

AXTAL公司的发展小趣事

近年来,电子行业面临着诸多市场挑战与机遇。在这场全球供应链的博弈中,AXTAL公司展现出了敏锐的市场洞察力和应变能力。面对中国发布的镓锗禁令,AXTAL巧妙地抓住了第一个漏洞,通过在中国设立的子公司申请出口镓锗的许可证,成功绕过了禁令的限制。这一睿智之举不仅为公司打开了新的市场窗口,也彰显了公司在应对市场挑战时的灵活性和创造力。

GE Oil & Gas Digital Solutions公司的发展小趣事
在电子技术教学实验中,作为演示电阻测量原理的教具。
上海国芯(Gcore)公司的发展小趣事
用于赛车、滑冰等体育项目的速度监测和超速报警。
Components Corporation公司的发展小趣事
检查电路中的电阻、电容、晶体管等元件是否连接正确,有无断路或短路现象。
埃派克森微电子(Apexone)公司的发展小趣事

作为一家具有社会责任感的企业,埃派克森微电子在发展过程中始终关注社会公益事业。在四川汶川地震发生后,公司积极发起救援捐赠活动,通过中国扶贫基金会为灾区捐款10万元,帮助受灾民众度过难关。这一行动体现了埃派克森的社会责任感和人文关怀精神,也为公司在社会中树立了良好的形象。

这五个故事展示了埃派克森微电子在电子行业中的发展历程和取得的成就。从创新起步到专利技术的突破与商用,再到业绩的连续增长和国际化步伐的加快,以及积极履行社会责任的公益行动,都充分展现了埃派克森微电子的实力和担当。未来,随着科技的不断进步和市场需求的不断变化,埃派克森微电子将继续保持创新精神,不断提升产品性能和市场竞争力,为电子行业的发展做出更大的贡献。

问答坊 | AI 解惑

NIOS II 常见问题总结

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了,应用程序是用 ...…

查看全部问答>

LM3s8962体验之三……KEY&LED 超简单,不用库

                  GPIO口测试      当单片机用,没有用库,全是对寄存的理解。   [ 本帖最后由 sdjntl 于 2010-11-1 ...…

查看全部问答>

【我给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能更加有效的对 ...…

查看全部问答>

ucos-ii求助

在创建任务时调用OSTaskStkInit(),在有的处理器移植中将堆栈指针寄存器压入该任务栈中(此时的堆栈指针寄存器的值是什么呢?)。当系统开始多任务时OSStart()会调用OSStartHighRdy(),将最高优先级的任务栈指针赋给SP,最后将该任务栈的内容 ...…

查看全部问答>

omap138的一些杂谈

omapl138是一款集成arm926ejs和c6000dsp的集成gpp,功耗不高,而且接口也很齐全。前些时间用它和cyclone4做运算平台。用到了fpp来boot fpga,非常好用的接口,在没有做过多优化的情况下boot速度能达到30MBps,(好像是这个速度,记不清楚了,反正比 ...…

查看全部问答>

国嵌6410实验手册

各位:在下刚从网上收集全了   国嵌2440的实验手册,不知打到6410和2440的差别大不大??所以求助各位能够分享一个 6410的,或者我出钱买一套也无所谓。。另外我有国嵌2440培训的全套视频。。私信我跟你分享…

查看全部问答>

基于MSP430 LaunchPad 和2.4G RF Module 的聊天室

本贴是在其他地方看到转过来了,觉得很有创意 前段時間在論壇的活動中拿了MSP430 LaunchPad,總要起點作用吧。 就做了這個史上最無聊,最無用的聊天工具。辦公室的工程師每人分一塊LaunchPad,接上我們公司常用的2.4G RF Module 用VB寫了個上位 ...…

查看全部问答>