定时器实现|学习笔记

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

开发者学堂课程【嵌入式之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);

}

}

相关文章
|
人工智能 Windows
基于语雀的windows解决小问题知识库
基于语雀的windows解决小问题知识库
238 0
|
存储 缓存 Linux
Linux内核学习(九):linux内核的特殊文件系统-debugfs、ftrace、sys
Linux内核学习(九):linux内核的特殊文件系统-debugfs、ftrace、sys
662 0
|
移动开发 Java API
HTML 插件详解
HTML中的插件如Flash、Java applets和ActiveX控件曾广泛用于扩展网页功能,但因安全性问题和跨浏览器兼容性不佳而逐渐被淘汰。现代替代方案包括HTML5的`<audio>`、`<video>`、`<canvas>`和SVG等,以及WebAssembly和各种JavaScript API(如WebRTC和WebGL),这些新技术不仅提升了网页性能和安全性,还改善了用户体验。建议开发者优先采用HTML5和相关API。
|
10月前
|
存储
如何在Flutter中动态申请权限?
如何在Flutter中动态申请权限?
824 66
|
API
表情包-API盒子官方资源库版免费API接口教程
该API用于访问API盒子官方资源库中的数十万表情包,支持快速搜索。通过POST或GET请求,用户可按随机或关键词搜索表情包,返回表情包的图片地址等信息。请求需提供用户ID、KEY及搜索类型等参数。示例与详情参见官方文档。
957 3
|
供应链 算法 定位技术
运筹优化技术在供应链领域应用介绍
运筹优化技术在供应链领域应用介绍
1561 0
|
分布式计算 安全 Hadoop
聊聊 hadoop 与 sasl 安全框架
聊聊 hadoop 与 sasl 安全框架
番茄工作方法以及番茄工作表
番茄工作方法以及番茄工作表
492 0
|
算法 Python
程序解码错误-由python的requests.post 请求结果乱码引起的思考
最近,在使用python的requests.post的时候,不论结果如何处理,得到的都是乱码。乱码的原因是什么?Accept-Encoding和Content-Encoding的本质是什么?
702 0
|
安全 Devops 虚拟化
【专栏】虚拟化技术与云计算平台 OpenStack:硬件虚拟化、操作系统级虚拟化和容器化
【4月更文挑战第28天】本文探讨虚拟化技术原理,如硬件虚拟化、操作系统级虚拟化和容器化,以及开源云计算平台OpenStack如何利用这些技术提供优势。OpenStack支持多种虚拟化技术,具备开源灵活性、多租户架构、可扩展性、插件式设计和成本效益。未来,OpenStack将在容器化、DevOps、跨云策略和安全合规性方面发挥更大作用,助力企业数字化转型。
1089 4