历史上的今天
返回首页

历史上的今天

今天是:2024年12月10日(星期二)

正在发生

2018年12月10日 | stm32中定时器中断的套路

2018-12-10 来源:eefocus

首先要提到的是,在stm32中,定时器相关的库函数主要集中在固件库文件 stm32f10x_tim.h 和 stm32f10x_tim.c 文件中,所以在进行定时器方面的处理时,需要加载这两个文件进来。在进行定时器操作时,一般按如下步骤来进行:


       1、打开相关外设的时钟。以定时器TIM3为例,由stm32的时钟树可以看到,TIM3时钟挂接在APB1上面,所以打开TIM3时钟时使用RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE),如果其中还使用到了其他外设,如GPIO等,再打开相关的外设时钟就可以了。


       2、清除中断挂起位。由于各种不可知的因素作用,在程序运行前要操作的定时器的中断挂起位有可能会被置位,这样就会导致在程序一开始就会进入定时器中断的中断服务程序。为了消除这种影响,我们在程序的一开始就将中断挂起位清除。在固件库中使用:

void TIM_ClearITPendingBit(TIM_TypeDef*TIMx, u16 TIM_IT)来清除中断挂起位,该函数的具体使用参考固件库手册。


       3、定时器基本配置初始化。在这一步骤中主要确定定时器的预分频和设置自动重装载寄存器周期的值,并确定计数模式,这主要使用固件库中的 TIM_TimeBaseInit()函数进行操作,该函数的原型为:void TIM_TimeBaseInit(TIM_TypeDef* TIMx,TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)


第一个输入参数没啥说的,就是使用的哪个定时器,第二个输入参数是一个结构体,该结构体的定义如下:


typedef struct

{

u16 TIM_Period;// 自动重装载寄存器周期的值

u16 TIM_Prescaler;//预分频值

u8 TIM_ClockDivision;//分割系数,一般设置为0,不去分割

u16 TIM_CounterMode;//计数模式

} TIM_TimeBaseInitTypeDef;



         4、使能定时器TIMx。这个简单,直接函数TIM_Cmd()函数就可以了,比如使能定时器TIM3外设,则可用TIM_Cmd(TIM3,ENABLE)。


        5、使能TIMx中断。调用函数即可。因为我们要使用 TIM3 的更新中断, 寄存器的相应位便可使能更新中断。 在库函数里面定时器中断使能是通过 TIM_ITConfig 函数来实现的:void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);


第一个参数是选择定时器号,这个容易理解,取值为 TIM1~TIM17。


第二个参数非常关键,是用来指明我们使能的定时器中断的类型,定时器中断的类型有很多种,包括更新中断 TIM_IT_Update,触发中断 TIM_IT_Trigger,以及输入捕获中断等等。


第三个参数就很简单了, 就是失能还是使能。


例如我们要使能 TIM3 的更新中断,格式为:TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE );


       6、配置中断优先级,也就是配置嵌套向量终端控制器NVIC。进行本步骤首先需要配置优先级的分组,可以使用库函数NVIC_PriorityGroupConfig()进行,分组的编号就是抢占优先级的位数,然后再配置NVIC初始化,使用函数NVIC_Init()进行,这个函数的原型为void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct),其中输入参数的结构体的定义如下:


typedef struct

{

u8 NVIC_IRQChannel; //中断通道

u8 NVIC_IRQChannelPreemptionPriority;//抢占优先级

u8 NVIC_IRQChannelSubPriority;//响应优先级

FunctionalState NVIC_IRQChannelCmd;// 指定在成员 NVIC_IRQChannel 中定义的 IRQ 通道被使能还是失能

} NVIC_InitTypeDef;


7、编写中断服务程序。在这里,我们首先要清除中断挂起位,该函数同第2步中,自不必赘述,接着再编写中断处理内容即可。


完整的定时器中断初始化程序如下,该程序为普中科技所配的光盘中的定时器中断中的内容。


void timeInit()

{

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; //声明一个结构体变量,用来初始化 GPIO

NVIC_InitTypeDef NVIC_InitStructure;

/* 开启定时器 3 时钟 */

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);

TIM_ClearITPendingBit(TIM3,TIM_IT_Update);//清除 TIMx 的中断待处理位:TIM 中断源

TIM_TimeBaseInitStructure.TIM_Period = 2000;//设置自动重装载寄存器周期的值

TIM_TimeBaseInitStructure.TIM_Prescaler = 35999;//设置用来作为 TIMx时钟频率预分频值,100Khz 计数频率

TIM_TimeBaseInitStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim

TIM_TimeBaseInitStructure.TIM_CounterMode =TIM_CounterMode_Up;//TIM 向上计数模式

TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);

TIM_Cmd(TIM3,ENABLE); //使能或者失能 TIMx 外设

/* 设置中断参数,并打开中断 */

TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE ); //使能或者失能指定的TIM 中断

/* 设置 NVIC 参数 */

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //打开 TIM3_IRQn 的全局中断

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//抢占优先级为 0

NVIC_InitStructure.NVIC_IRQChannelSubPriority=1; //响应优先级为 1

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能

NVIC_Init(&NVIC_InitStructure);

}

推荐阅读

史海拾趣

雅特力(Artery)公司的发展小趣事

在发展过程中,雅特力积极寻求与其他企业的战略合作,以实现共赢发展。通过与上下游企业建立紧密的合作关系,雅特力不仅确保了供应链的稳定性和高效性,还获得了更多的技术支持和市场资源。同时,雅特力还注重与同行业企业的交流与合作,共同推动电子行业的进步与发展。这些战略合作不仅增强了雅特力的综合实力和市场竞争力,也为整个电子行业的繁荣做出了积极贡献。

综上所述,雅特力公司通过技术创新、全球市场布局、企业社会责任、人才培养和战略合作等多个方面的努力,实现了从初创企业到行业领军者的华丽转身。这些故事不仅展现了雅特力的发展历程和成就,也揭示了其在电子行业中的重要地位和影响力。

广东爱晟电子(exsense)公司的发展小趣事

随着业务的不断拓展,爱晟电子意识到品质是品牌的核心。公司引进了先进的生产设备和管理体系,严格按照ISO9001质量体系运作,确保产品质量的稳定性和可靠性。同时,公司还加强了对原材料的质量控制,与国内外优质供应商建立了长期稳定的合作关系。这些举措使得爱晟电子的产品在市场上赢得了良好的口碑,品牌影响力逐渐增强。

Global Components & Controls公司的发展小趣事
将RP2调到最小值,并用纸挡住光线,使光敏电阻R4不受灯光照射。
FlexiPanel公司的发展小趣事

随着全球化进程的加速,FlexiPanel意识到构建稳定的全球供应链体系对于企业的长远发展至关重要。公司积极寻求与国内外知名芯片制造商、天线供应商等合作伙伴建立战略合作关系,共同推动RF模块技术的进步和产业化应用。通过整合全球资源,FlexiPanel不仅提升了自身的产品研发和生产能力,还确保了产品质量的稳定性和可靠性,赢得了客户的广泛信赖。

Epitex Inc公司的发展小趣事

随着技术的不断进步,Epitex不断加大对研发的投入。XXXX年,他们成功研发出了一种具有更高导热性能的电子材料,这种材料在高性能计算机和服务器等高端电子产品中得到了广泛应用。这一技术突破不仅提升了Epitex的市场竞争力,也为其带来了可观的经济效益。

在技术突破的基础上,Epitex开始积极拓展国际市场。他们通过与全球知名的电子制造商建立合作关系,将产品推向了更广阔的舞台。同时,Epitex还积极参与国际技术交流和展览,提升了公司在国际市场的知名度。

冠图电子(GTL-POWER)公司的发展小趣事

随着技术的不断进步,Epitex不断加大对研发的投入。XXXX年,他们成功研发出了一种具有更高导热性能的电子材料,这种材料在高性能计算机和服务器等高端电子产品中得到了广泛应用。这一技术突破不仅提升了Epitex的市场竞争力,也为其带来了可观的经济效益。

在技术突破的基础上,Epitex开始积极拓展国际市场。他们通过与全球知名的电子制造商建立合作关系,将产品推向了更广阔的舞台。同时,Epitex还积极参与国际技术交流和展览,提升了公司在国际市场的知名度。

问答坊 | AI 解惑

PIC 8位单片机的电源和时钟

单片机是一种超大规模集成电路,在该集成电路内有成千上万个晶体管或场效应管,因此,要单片机正常运行,就必须为其提供能量,即为片内的晶体管或场效应管供给电源,使其能工作在相应的状态。  PIC16F84单片机需要一个5V电源(实际工作电压为4?0V ...…

查看全部问答>

51单片机驱动电动机

本帖最后由 paulhyde 于 2014-9-15 09:39 编辑 51单片机控制四相步进电机 作者:易劲松 QQ:371719025 Email:yijingsong@hotmail.com   接触单片机快两年了,不过只是非常业余的兴趣,实践却不多,到现在还算是个初学者吧。这几天给自己的任 ...…

查看全部问答>

两个RtlInitUnicodeString()有什么区别

创建设备名称    UNICODE_STRING devName;    RtlInitUnicodeString(&devName,L\"\\\\Device\\\\MyDDKDevice\"); 创建符号链接    UNICODE_STRING symLinkName;    RtlInitUnicodeString(&symLinkNam ...…

查看全部问答>

WDM驱动的3个初级问题

各位大虾,小弟有以下几个问题需要向大家求助: 1、设备管理器中显示出的设备,是根据什么显示出来的,为什么有时候我插入一个设备,里面会多出两个对应设备,以下有3个例子: (1)比如我插入我的USB接口的移动硬盘,会在\"通用串行总线控制器\" ...…

查看全部问答>

WinCE 定制 explorer 资源管理器是如何把各个资源加载进去的呢

WinCE 定制  explorer 资源管理器是如何把各个资源加载进去的呢? 看了下代码,不知道explorer 资源管理器是如何把任务栏,图片,菜单,等等加载进去的。…

查看全部问答>

本人想购买一套EKK-LM3S8962用于学习,价格希望在300以内!

今晚几乎把TI M3的帖子都翻了一遍,心情澎湃啊!如果那位前辈有要转手的,请加QQ:316950354,谢谢! [ 本帖最后由 artcam 于 2011-8-30 01:08 编辑 ]…

查看全部问答>

FRAM_GUI.exe无法运行

刚在试试买回来的板子 FRAM_GUI.exe双击没反应?   另MSP-EXP430FR5739的例程是用ccs打开还是IAR?…

查看全部问答>

单色位图动画制作

在制作界面时我们需要使用到一些开机界面或动画效果,如果使用图片通过图片转换软件生成的彩色图片太大,以宝马开发板开机动画“宝马奔跑”为例,若使用120*80的照片转换成16为彩色数组需要使用到120*80*16/2=19200字节,动画使用5帧图片组成,即需 ...…

查看全部问答>

转让一些全新ST 新唐的ARM Cortex®-M4, M0 开发板 有买有送

本帖最后由 fesns 于 2015-3-5 20:01 编辑 帮同事转让一些全新的ARM Cortex®-M4, M0 开发板 全新的STM32F103VCT6 步进电机驱动板. 有步进电机驱动程序 STM32F103VCT6+2.8TFT + 二轴步进电机+驱动L6205 最大电流2.8A 270 不还价 全新的新唐 ...…

查看全部问答>