定时器实现|学习笔记

简介: 快速学习定时器实现

开发者学堂课程【嵌入式之RFID开发与应用2020版:定时器实现】学习笔记与课程紧密联系,让用户快速学习知识

课程地址https://developer.aliyun.com/learning/course/665/detail/11162


定时器实现

 

内容介绍:

一、拷入代码,添加文件

二、定时器实现讲解

三、知识点补充

 

一、拷入代码,添加文件

首先拷入代码,并将增加的文件添加进来,并且编译的时候也一定要注意,提前把它添加进来,在APP里面增加定时器代码timer其他的都没变

image.png

在library里面现在因为增加定时器,应该把定时器的库也加进来 tim就是定时器其他基本上不变

 

二、定时器实现讲解

1定时器三代码

然后接下来在这里增加了一个time定时器三,所以刚才图是不准确的。这个图里面他把定时器三把它画到APB2里面。

image.png

当然这个地方看的也不一定准确,这是dma这一块,所以不要看这个图,去看它的代码是最靠谱的

d timer3_Init(void)//10ms定时器初始化,随便找个文件写

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

NVIC_InitTypeDef NVIC_Initstructure;

RCC_APB1PeriphClockCmd(RCC_APB1PeriphT3,ENABLE);

TIM_TimeBaseStructure. TIM_Period = 1000-1;//自动重装计数值(x00-0xFFFFTIM_TimeBaseStructure.TIM_Prescaler =(720-1);//预分频除数值

(0x0000-0xFFFTIM_TimeBasestructure.TIM_ClockDivision

= TIM_CKD_DIV1;//时钟分割用于滤波TIM_TimeBaseStructure.TIM CounterMode = TIM_CounterMode_Up;//向上计数模式TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);TIM_ClearITPendingBit(TIM3,TIM_IT_Update);//清除未处理的中断标志位TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//开关中断TIM_Cmd(TIM3,ENABLE);//使能定时器

/* Enable the TIM5 gloabal Interrupt */

NVIC_Initstructure.NVIC_IRQChannel = TIM3_IRQn;

NVIC_Initstructure.NVIC_IRQChannelPreemptionPriority =0;//可打断底优先级中

NVIC Initstructure.NVIC IROChannelSubPrioritv1:

应该找到time3,其实应该把这个直接写下来,先写2,没有移交。这个就是它属于ApB1的,大部分都属于APB1

(2)定时器配置

定时器的配置,定时器通常要用中断来支持,因为不知道什么时候到时间,所以最好是通过定时器来完成这个异步事件的通知。

首先第一个,对于定时器的配置,这个是它的计数周期,也就是自动重装的值。按照一赫兹的频率在计数。

比如记了100个数这个时候的时间就是100秒,一赫兹的频率积累100个速度就是100秒这个参数指的是100,要按照一个频率去计数,到底记多少个数。那么由于这个计数周期里面,他在计算时,是从0开始算的,所以最好是0~999,最好这里要100应该是100-1。 这个地方的频率的话并不是一赫兹,也做不到一赫兹,这个频率设的是10毫秒

在做一个定时器的时候,重点是要知道两个参数

第一个是是所谓的计数频率。第二个就是计数周期,或者是计数个数,计数的个数再乘以计数的频率,那么其实最后就得到多少时间,所以这两个很重要。 TIM_Period计数的个数。TIM_Prescaler是去设置它的计数率,

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

TIM_TimeBaseStructure.TIM_Period = 1000-1;//自动重装计数值(0x0000-0xFFFF)

TIM_TimeBaseStructure.TIM_Prescaler = (720 - 1);//预分频除数值(0x0000-0xFFFF)

TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//时钟分割用于滤波

TIM_TimeBaseStructure.TIM_CounterMode =

TIM_CounterHode_Up;//向上计数模式
TIM_TimeBaseInit(TIM3,&TIM_TimeBasestructure);
TIM_clearITPendingBit(TIM3,TIM_Ir_update);//清除未处理的中断标志位
TIM_ITconfig(TIH3,TIM_IT_update,ENABLE);//开关中断
TIM_Cmd(TIM3,ENABLE);//使能定时器

4修改时钟

来自于时钟APB1。那么APB1这个时钟的话,,APB2它是来自于高速时钟,它的频率是72兆而APB1是36兆,一般情况是36兆。

image.png

但是这个地方说明一下,在这个地方做一个处理,在启动代码里面,它的叫做systm init,就是在裸机复位之后,进行设置系统的时钟

在设置系统时钟时在里面调用一个设置系统时钟。 在这个地方本来按照正常情况下使用36兆,但是用的是这个Freq-72,所以他就会把时钟全部把它修改成72的。当前这个系统修改完之后,它的时钟全部变成了72兆

不管是APB1还是APB2,就是为了方便它的固件库,把整个系统的时钟源全部规定为72兆,当然频率越高肯定是越好,用起来的可选择空间越大。

所以如果说输入时钟频率是72兆,那么如果这个分屏值设成一,表示不对其进行分屏分屏72肯定太高。那这里让它除以720,就是将这个频率再次分屏,不要那么大。72兆除以720,得到的频率就是10毫秒计数,当记1000个数的时候,则为一秒钟 所以说这个定时器就是一秒钟处罚一次,按照10毫秒的计数频率,千个数,也就是频率是10毫秒,周期是12秒,计数个数是1000个,,后面的这个参数是用滤波的。保持默认就行。这个是向上计数。往上加到最大值,再次替换重装为1000,从0加了1000又再重装,重装成0

/*Enable

the TIN5 gloabal Interrupt*/NVIc_Initstructure.NVIC_IRQChannel = TIM3_IRQn;

NVIc_Initstructure.NVIC_IRochannelPreemptionPriority = 0;//可打断底优先级中断

NVIC Initstructure.NVIC IROChannelSubPriority = 1;

NVIC Initstructure.NVIC IROChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

(5)写入函数

那么接下来使用函数写入计算器,并且清除终端标之位,然后中断,包括定时器的通道,后面是开启定时器的第三个通道,这个定时器是 可以进行查询属于哪个通道然后这个优先级也是随便设,基本上如果不涉及到优先级可以随意设置

然后接下来初始化定时器中断服务函数还是一样,汇编已经写好,只需要实现它的函数体,主要核心首先判断是不是定时器三出发了,如果是清除终端标志,并且将这个计数器给它加加,这个是全局变量, 从0开始加,这个地方没有初始化,一般全局变量不初始化它的默认默认就是0。那么一直加加完之后他还调用这个计数的一个处理函数dispose callback。就是调用了这个函数。那在这个函数里面可以看到刚好就是让记的数去除以100再除以60,再对60取模其实就是以时间的方式进行打印,就定时打印。记得数的值。

void dispose_callbak(u16 count)

{

if(count%100==0){//定时1000ms

debug("%02d:%82d\n",(count/100)/60,(count/100)%60);

}

然后再回到主程序,这个系统什么事情都不干,启动完定时器之后,那么也不按键,也不去输入任何值。 那么正常情况下,它应该是在不断的打印

(6)编译程序

接下来先编译,有一个警告,是没有进行明,原因缺少头文件,那么把它编译下载,观察串口的打印信息,同样先复位,看到打印说明这个定时器器就在一秒一秒的往后走。

image.png

如果这个时候按键按一次键会滴滴滴,其实也是因为定时器对的案件按键做了一个处理FLICKER_FREQ,也就是它会对的按键进行一个判断,如果的计数值为非零值,那么他就会去每隔一段时间让的蜂鸣一下,LED灯闪一闪,和蜂鸣器响一响,这个其实是附带的功能,相当于这个做报警的一个状态提示的一个功能。借助定时器,更加友好的去完成提示或者是闪一闪。

 

三、知识点补充

后面会有更多的应用。比如说对于做这个小车这个码盘的数据采集,就后面再进阶的时候再去讲,基础部分,会用它来作为定时器,核心的功能就是定时的这个功能,之前案件去抖依然用的是软件延时,那如果这个地方定时器来延时,时间就会更加准确,因为这个不见得是毫秒,所以用定时器能够让的时间变得更加精确

Void EXTI1_IRQHandler(void)

{

If(EXTI_GetITStatus(GPIO_XXX_KEY_LINE)!=RESET)

{

delay_ms(KEY_SHAKE);//去抖

if(XX_KEY_STATUS_GET==1){

key_status = 1;

SET_BUZZER_FLICKER(5);

}

EXTI_ClearITPendingBit(GPIO_XXX_KEY_LINE);

}

}

相关文章
|
2月前
|
前端开发 JavaScript
前端基础(十三)_定时器(间歇定时器、延迟定时器)
本文介绍了JavaScript中定时器的使用,包括`setTimeout`和`setInterval`两种类型。`setTimeout`是实现延迟执行,即等待一定时间后执行一次指定的函数;而`setInterval`是实现间歇执行,即每隔一定时间就执行一次指定的函数。文章还介绍了如何使用`clearTimeout`和`clearInterval`来取消定时器的执行,并通过示例代码展示了定时器的创建和取消。
81 4
前端基础(十三)_定时器(间歇定时器、延迟定时器)
|
4月前
|
存储 前端开发 JavaScript
前端如何优雅的使用定时器?
前端如何优雅的使用定时器?
47 1
用555定时器接成的多谐振荡电路的介绍
用555定时器构建的多谐振荡电路 一、引言 多谐振荡电路是一种能够产生多个频率的振荡信号的电路结构。它在音乐合成器、电子琴等设备中有着广泛的应用。本文将介绍一种使用555定时器构建的多谐振荡电路。 二、555定时器简介 555定时器是一种经典的集成电路,由三个功能单元组成:比较器、RS触发器和放大器。它可以用作脉冲发生器、频率分频器、定时器等。在多谐振荡电路中,我们将利用555定时器的单稳态多谐振荡特性来实现多个频率的振荡。 三、电路设计 1. 电路原理 多谐振荡电路的基本原理是利用555定时器的单稳态多谐振荡特性。单稳态多谐振荡是指当555定时器处于单稳态时,输出信号的频率会随着电容和
354 0
|
6月前
定时器
定时器
57 0
|
6月前
|
存储 NoSQL 应用服务中间件
定时器笔记
定时器笔记
52 0
|
6月前
|
C#
[C#] 定时器的使用
[C#] 定时器的使用
44 0
实现定时器(基于标准库提供的定时器、基于优先级队列自实现的定时器)
实现定时器(基于标准库提供的定时器、基于优先级队列自实现的定时器)
|
编解码 物联网 开发者
定时器介绍|学习笔记
快速学习定时器介绍
定时器介绍|学习笔记
|
监控 物联网 芯片
看门狗定时器原理|学习笔记
快速学习看门狗定时器原理
看门狗定时器原理|学习笔记