STM32F7xx —— Timer

STM32F7xx  —— Timer

 

目录

STM32F7xx  —— Timer

一、基础定时器配置

二、带回调定时器


 

 

作用:输出PWM,测量脉冲长度,定时等。

一、基础定时器配置

// 基本定时器
#define TIMER_CHANNEL             TIM3
#define TIMER_PREEMPT_PRIO        TIM_PRIORITY
#define TIMER_RCC_FUNC            __HAL_RCC_TIM3_CLK_ENABLE
#define TIMER_IRQ                 TIM3_IRQn
#define TIMER_IRQ_FUNC            TIM3_IRQHandler
#define TIMER_DIV                 (10800 - 1)
#define TIMER_PERIOD              (100 - 1)static TIM_HandleTypeDef timer_handler;     // 定时器操作句柄// Period:自动重装值。 Prescaler:时钟预分频数
// 定时器溢出时间计算方法:Tout=((Period+1)*(Prescaler+1))/Ft us.
// Ft=定时器工作频率,单位:Mhz
void TimerInit(void)
{timer_handler.Instance = TIMER_CHANNEL;timer_handler.Init.Prescaler = TIMER_DIV;timer_handler.Init.CounterMode = TIM_COUNTERMODE_UP;timer_handler.Init.Period = TIMER_PERIOD;timer_handler.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;HAL_TIM_Base_Init(&timer_handler);HAL_TIM_Base_Start_IT(&timer_handler);
}// 定时器底层驱动 开启时钟 设置中断优先级
// 此函数会被 HAL_TIM_Base_Init()函数调用
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *timer)
{TIMER_RCC_FUNC();HAL_NVIC_SetPriority(TIMER_IRQ, TIM_PRIORITY, 1);HAL_NVIC_EnableIRQ(TIMER_IRQ);
}void TIMER_IRQ_FUNC(void)
{HAL_TIM_IRQHandler(&timer_handler);
}// 中断服务函数调用
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *timer)
{if(timer == (&timer_handler)){// do something}
}

 

二、带回调定时器

使用回调函数,以链表的方式管理所有的定时器。检测时间到,执行回调函数。TimerRun定时运行,TimerCreate创建一个定时器,TimerStart开启定时器。这里只是写了一个比较简单的定时器,操作系统里面也有类似的定时接口。

#define TIMER_CHANNEL             TIM3
#define TIMER_PREEMPT_PRIO        TIM_PRIORITY
#define TIMER_RCC_FUNC            __HAL_RCC_TIM3_CLK_ENABLE
#define TIMER_IRQ                 TIM3_IRQn
#define TIMER_IRQ_FUNC            TIM3_IRQHandler
#define TIMER_DIV                 (10800 - 1)
#define TIMER_PERIOD              (100 - 1)static struct
{timer_t *next;
} timer_run;static volatile uint32_t timer_ticks;
static uint32_t timer_ticks_run;static TIM_HandleTypeDef timer_handler;     // 定时器操作句柄// Period:自动重装值。 Prescaler:时钟预分频数
// 定时器溢出时间计算方法:Tout=((Period+1)*(Prescaler+1))/Ft us.
// Ft=定时器工作频率,单位:Mhz
void TimerInit(void)
{timer_run.next = NULL;timer_handler.Instance = TIMER_CHANNEL;timer_handler.Init.Prescaler = TIMER_DIV;timer_handler.Init.CounterMode = TIM_COUNTERMODE_UP;timer_handler.Init.Period = TIMER_PERIOD;timer_handler.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;HAL_TIM_Base_Init(&timer_handler);HAL_TIM_Base_Start_IT(&timer_handler);
}// 定时器底层驱动 开启时钟 设置中断优先级
// 此函数会被 HAL_TIM_Base_Init()函数调用
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *timer)
{TIMER_RCC_FUNC();HAL_NVIC_SetPriority(TIMER_IRQ, TIM_PRIORITY, 1);HAL_NVIC_EnableIRQ(TIMER_IRQ);
}void TIMER_IRQ_FUNC(void)
{HAL_TIM_IRQHandler(&timer_handler);
}// 中断服务函数调用
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *timer)
{if(timer == (&timer_handler)){++timer_ticks;}
}//======================================================================================================
void TimerRun(void)
{timer_t *timer;timer_t *timer_done;timer_done = NULL;while(timer_ticks_run != timer_ticks){timer = timer_run.next;if(timer){if(timer->ticks){++timer_ticks_run;timer->ticks--;}// 将后续超时的定时器都移除while(timer && (0 == timer->ticks)){timer_run.next = timer->next;timer->next = timer_done;timer_done = timer;timer = timer_run.next;}}else{++timer_ticks_run;}}while(timer_done){timer = timer_done;timer_done = timer->next;timer->next = NULL;timer->handler(timer->param);}
}void TimerCreate(timer_t *timer, timer_cb_t handler, void *param)
{timer->handler = handler;timer->param = param;
}void TimerStart(timer_t *timer, uint32_t timeout)
{timer_t *p;uint32_t ticks = (timeout + 9) / 10;TimerCancel(timer);p = (timer_t *)&timer_run;while(p->next){if(ticks <= p->next->ticks){p->next->ticks -= ticks;break;}else{ticks -= p->next->ticks;  // ticks 有可能为 0}p = p->next;}timer->ticks = ticks;timer->next = p->next;p->next = timer;
}void TimerCancel(timer_t *timer)
{timer_t *p;if(NULL == timer){return;}p = (timer_t *)&timer_run;while(p->next){if(p->next == timer){if(timer->next){timer->next->ticks += timer->ticks;}p->next = timer->next;timer->next = NULL;break;}p = p->next;}
}
static timer_t timer;
static void handler(void *param)
{TimerStart(&timer, 1000);printf("TimerStart\r\n"); 
}TimerCreate(&timer, handler, NULL);TimerStart(&timer, 1000);TimerRun(); // 放在10ms任务中运行

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/465617.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jquery-autocomplete学习(转)

jquery-autocomplete学习 一、用前必备官方网站&#xff1a;http://bassistance.de/jquery-plugins/jquery-plugin-autocomplete/当前版本&#xff1a;1.0.2需要JQuery版本&#xff1a;1.2.6 二、使用<script src"./jquery-1.3.2.js" type"text/javascript&q…

时间同步绝对是一个大问题

上图是加班看到的夜景假设A电脑时间和B电脑时间不同&#xff0c;当他们两个电脑的用户在使用电脑的时候就会存在问题&#xff0c;比如A电脑的用户说&#xff0c;我们下午5&#xff1a;00 去打球&#xff0c;然后A电脑到了5&#xff1a;00就去打球了&#xff0c;但是可能这个时候…

Window10彻底卸载应用商店

Window10如何彻底卸载应用商店&#xff1f;Window10应用商店就是一个应用下载平台&#xff0c;我们可以在应用商店中下载各种应用&#xff0c;但是很多用户并不喜欢在Window10应用商店中下载应用&#xff0c;觉得应用商店浪费内存&#xff0c;因此想将应用商店卸载掉&#xff0…

STM32F7xx —— QSPI

STM32F7xx —— QSPI 目录 STM32F7xx —— QSPI 一、QSPI 二、几个重要的函数 三、几个重要的结构 四、QSPI接口设计&#xff08;仅供参考&#xff09; 五、QSPI驱动W25Q256 一、QSPI SPI 是 Queued SPI 的简写&#xff0c;是 Motorola公司推出的 SPI 接口的扩展&#xf…

嵌入式、物联网常见通信协议

本文介绍一些常见的嵌入式、物联网通信协议&#xff0c;它们具有不同的性能、通信速率、覆盖范围、功率和内存&#xff0c;而且每一种协议都有各自的优点和或多或少的缺点。其中一些通信协议只适合小型家用电器&#xff0c;而其他一些通信协议则可以用于大型智慧城市项目。物联…

解决T400死机的问题!

终于解决这几天突然出现的t400 vista假死问题! 原来罪魁祸首是 ThinkPad -- Intel Matrix Storage Manager驱动程序(Windows XP/vista 32bit) 此更新在su自动更新里也有 千万别更新 如果不小心更新并出现偶尔假死(现象&#xff1a;鼠标能动&#xff0c;但是不能打开程序所有应用…

cas-client登录后报INVALID_PROXY_CALLBACK

服务器部署cas&#xff0c;登录后页面提示INVALID_PROXY_CALLBACK 然后查看cas的日志&#xff0c;日志报以下错误&#xff1a; 2018-06-29 11:36:06,251 ERROR [org.jasig.cas.util.http.SimpleHttpClient] - java.lang.RuntimeException: Unexpected error: java.security.Inv…

OpenNMS全接触-事件及通知(九)

在上一篇文章OpenNMS全接触-事件及通知&#xff08;八&#xff09;中&#xff0c;介绍了OpenNMS在收到受管设备发出的SNMP Trap之后&#xff0c;如何将收到的SNMP Trap与eventconf.xml文件中定义的事件(event)进行匹配&#xff0c;从而触发该事件的发生。主要是引入了<mask&…

STM32F7xx —— 看门狗

STM32F7xx —— 看门狗 看门狗&#xff1a;指定时间内不喂狗&#xff0c;就重启系统。 最简单的看门狗设计&#xff08;喂狗就是指定时间内给寄存器写一个固定值&#xff09; // 初始化独立看门狗 // prer:分频数:0~7(只有低 3 位有效!) // rlr:自动重装载值,0~0XFFF. // 分频…

网络中路由器的工作原理

大家好&#xff0c;我是情报小哥&#xff01;01路由器

C++学习(10)

1 //设计运算符重载的复数类2 #include<iostream.h>3 4 class Complex{5 private:6 double real;//实部7 double image;//虚部8 public:9 Complex(){ 10 real0; 11 image0; 12 } 13 Complex(do…

嵌入式真的没前途?

-上图是我的朋友邓总最近在互联网&#xff0c;然后从侧面了解了嵌入式的行业发展&#xff0c;嵌入式是离不开硬件的&#xff0c;但是硬件的话&#xff0c;又不只是靠硬件赚钱&#xff0c;如果硬件做不成一个产品&#xff0c;很难卖一个好价钱&#xff0c;就好比一个好的食材&am…

STM32F7xx —— 内存管理

STM32F7xx —— 内存管理 目的&#xff1a;高效、快速的分配&#xff0c;并在适当的时候回收内存资源。最终就是实现malloc和free函数。&#xff08;实现方法参考原子哥&#xff09; #define CONFIG_SRAM_OUT_ENABLE 0typedef enum {SRAM_TYPE_IN, // 内部内存池 #if(CO…

js for in 遍历对象与数组

遍历对象 let obj {q:9,w:5,e:2,t:7,c:3}//for in 遍历对象 key为对象的属性名称,遍历属性值时用[]操作符访问//通过[]操作符为对象添加属性或访问属性时&#xff0c;属性名称可以是任何字符串。for (let key in obj) {console.log(obj的key:,key, obj的value:,obj[key]);} …

前凸后翘的步进电机调速算法~

[导读] 大家好&#xff0c;我是逸珺。今天想分享一种超级实用的步进电机调速算法&#xff0c;这种算法在步进电机调速方案中可以说是一种非常优异的方案。梯形调速算法 为啥需要设计一个调速算法呢&#xff1f;步进电机不是给多少脉冲就动多少步吗&#xff1f;但是带上负载了就…

[转帖]关于win7共享的问题和解答

转自 活动目录SEO 的博客&#xff0c;转载请保留原出处 原文路径 http://gnaw0725.blogbus.com/logs/49380146.html 问题 1、请问现在Win7共享后怎么没有出现共享图标显示&#xff0c;都不知道这个文件夹已经共享过。 2、点击右键取消共享后&#xff0c;文件夹会出现一个锁的标…

STM32F7xx —— FatFS(W25QXX)

STM32F7xx —— FatFS&#xff08;W25QXX&#xff09; 看本章之前请务必先食用&#xff1a;动态内存管理 W25QXX读写 使用经典的fatfs1.4.1&#xff0c;下载源码&#xff0c;和我们用户相关的式diskio.c&#xff0c;实现里面的初始化读写和ioctl。ffconf.h用来配置&#xf…

CentOS 7.3 系统安装配置图解教程

一、安装CentOS 7.3 CentOS 7.x系列只有64位系统&#xff0c;没有32位。生产服务器建议安装CentOS-7-x86_64-Minimal-1611.iso版本 成功引导系统后&#xff0c;会出现下面的界面 界面说明&#xff1a; Install CentOS 7 # 安装CentOS 7 Test this media & install CentOS …

朝花夕拾-不务正业的大学生做了什么比赛?

朝花夕拾&#xff0c;旧事重提之意。恰逢CSDN年终征文&#xff0c;所以写作本文为年终总结&#xff0c;实为大学四年的总结&#xff0c;和CSDN一起成长参与各类竞赛的回忆。四年里和小伙伴们一起辛苦奋斗做了那么多比赛&#xff0c;当比赛结束&#xff0c;那些作品便无人问津了…

虚拟化技术--服务器虚拟化

1、 数据中心服务器的运行现状<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />IT技术日新月异&#xff0c;各项管理、业务与IT的联系日益密切&#xff0c;政府、企事业单位的大型数据中心承担的功能越来越强大&#xff0…