当前位置:网站首页>第五篇,STM32系统定时器和通用定时器编程
第五篇,STM32系统定时器和通用定时器编程
2022-07-06 17:07:00 【车水码浓】
1.定时器概念
定时器本质上是一个计数器,从某个值开始计数,当计数值达到某个值时定时时间到。定时的时间由计数的范围(初始计数值)和计数的快慢(当前计数值)来决定。
用定时器做延时或者心跳时钟,主要步骤包括启动,确定参考时钟频率,确定初始计数值,查询超时标志,如下图所示。

———————————————————————————————————————————
2.systick ---------------------- 系统定时器
systick是一个简单定时器,属于ARM核,常用于精准延时,也可以用作系统心跳时钟。
(1)cortex-M4内核的系统定时器(参考权威指南9.5节)
systick是一个向下计数,24位(0xffffff),具有自动重装载功能(在一个定时时间结束后,自动写入一个初始计数值,不需要开发人员在重新初始化赋值)的简单定时器。时钟源由外部提供,可以选择8分频的AHB时钟(21MHz)或者HCLK(168MHz)。

Systick寄存器组织结构如下,通常需要配置的寄存器为控制和状态寄存器(CTRL),重装载值寄存器(LOAD),当前值寄存器(VAL)这三个。


———————————————————————————————————————————
3.使用systick实现精准延时
第一步,选择参考时钟(21MHzAHB时钟或者HLCK时钟);
第二步,设置初始计数值来决定定时器周期(延时时间);
第三步,使能定时器;
第四步,查询超时的标志等待延时时间到。
———————————————————————————————————————————
4.Sydtick定时器代码实现
void delay_init(void)
{
//选择21MAHB时钟作为时钟源
//SYSTICK控制和状态寄存器第二位置0
//SysTick->CTRL &= ~(0x01<<2);
//SysTick->CTRL &= ~SysTick_CTRL_CLKSOURCE_Msk;
//库函数写法
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
}
//选择21MHz, 1um=21, 1ms=21000
//毫秒延时 1ms = 21000 n<798 ------ (2^24)/21000
void delay_ms(unsigned int nms)
{
//计算初始值放入初始值寄存器,从初始值开始计算
SysTick->LOAD = 21000*nms-1;
SysTick->VAL = 0;//当前计数值为0
//启动systick开始计时
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
//等待计数值为0,控制寄存器的16位变1
while(!(SysTick->CTRL&SysTick_CTRL_COUNTFLAG_Msk));
//关闭systick
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}
——————————————————————————————————————————————————————————————————————————————————————5.通用定时器
(1)介绍
定时器的基本功能是定时,通用定时器属于外设,通常和其他硬件配合使用,比如周期性采集传感器数据,周期性ADC转换,周期性上报数据,将通用定时器和GPIO结合产生更多的功能(PWM,脉冲检测.....)。
stm32f407有14个外设定时器,TIM2~TIM5 TIM9~TIM14属于通用定时器,TIM1和TIM8属于高级定时器,TIM6和TIM7属于基本定时器。

以TIM2~TIM5为例,了解通用定时器的使用

三种计数模式:
向上计数(递增) 0 ~ 初始计数值
向下计数(递减) 初始计数值 ~ 0
双向计数(递增/递减) 初始计数值 ~ 0 ~ 初始计数值
通用定时器的原始时钟频率取决于所在总线和总线的分频系数

———————————————————————————————————————————
6.定时器(TIM2)的库函数编程实现
在工程中加入定时器的库函数源码

(1)开启定时器2的时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
(2)初始化定时器
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct); 参数: TIMx - 哪个定时器 TIM_TimeBaseInitStruct - 初始化结构 typedef struct { uint16_t TIM_Prescaler; /*!< 预分频系数 0x0000 and 0xFFFF */ uint16_t TIM_CounterMode; /*!< 计数模式 @ref TIM_Counter_Mode */ uint32_t TIM_Period; /*!< 初始计数值 0x0000 and 0xFFFF. */ uint16_t TIM_ClockDivision; /*!< 时钟因子 @ref TIM_Clock_Division_CKD */ uint8_t TIM_RepetitionCounter; /*!< 高级定时器功能,忽略 */ } TIM_TimeBaseInitTypeDef;
(3)初始化NVIC
NVIC_Init(...);
(4)开启定时器中断使能
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState); 参数: TIMx - 哪个定时器 TIM_IT - 哪个中断 TIM_IT_Update NewState - 使能/禁止 ENABLE
(5)实现定时器中断处理函数
void TIM2_IRQHandler(void) { if(TIM_GetITStatus(TIM2, TIM_IT_Update)==SET){ //...... //清除中断标志 TIM_ClearITPendingBit(TIM2, TIM_IT_Update); } }
(6)启动定时器
TIM_Cmd(TIM2,ENABLE);
————————————————
版权声明:本文为CSDN博主「车水码浓」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44651073/article/details/125576286
边栏推荐
- C9高校,博士生一作发Nature!
- 如何判断一个数组中的元素包含一个对象的所有属性值
- Basic information of mujoco
- If the college entrance examination goes well, I'm already graying out at the construction site at the moment
- 英雄联盟|王者|穿越火线 bgm AI配乐大赛分享
- 2021 SASE integration strategic roadmap (I)
- Are you ready to automate continuous deployment in ci/cd?
- [Niuke classic question 01] bit operation
- 接口(接口相关含义,区别抽象类,接口回调)
- 新手如何入门学习PostgreSQL?
猜你喜欢

Learn self 3D representation like ray tracing ego3rt
![[software reverse automation] complete collection of reverse tools](/img/72/d3e46a820796a48b458cd2d0a18f8f.png)
[software reverse automation] complete collection of reverse tools

C9 colleges and universities, doctoral students make a statement of nature!

Trace tool for MySQL further implementation plan

ZYNQ移植uCOSIII

Zynq transplant ucosiii
![[software reverse - solve flag] memory acquisition, inverse transformation operation, linear transformation, constraint solving](/img/16/71692f4cf89b7dc0fe62946e59ecd1.png)
[software reverse - solve flag] memory acquisition, inverse transformation operation, linear transformation, constraint solving

学习光线跟踪一样的自3D表征Ego3RT

The difference between redirectto and navigateto in uniapp

基於GO語言實現的X.509證書
随机推荐
String comparison in batch file - string comparison in batch file
Three methods to realize JS asynchronous loading
深度学习之数据处理
Attention SLAM:一种从人类注意中学习的视觉单目SLAM
深度学习之线性代数
uniapp实现从本地上传头像并显示,同时将头像转化为base64格式存储在mysql数据库中
一行代码实现地址信息解析
工程师如何对待开源 --- 一个老工程师的肺腑之言
Slam d'attention: un slam visuel monoculaire appris de l'attention humaine
Lombok 同时使⽤ @Data 和 @Builder 的坑,你中招没?
新手如何入门学习PostgreSQL?
build. How to configure the dependent version number in the gradle file
Zabbix 5.0:通过LLD方式自动化监控阿里云RDS
AI超清修复出黄家驹眼里的光、LeCun大佬《深度学习》课程生还报告、绝美画作只需一行代码、AI最新论文 | ShowMeAI资讯日报 #07.06
The way of intelligent operation and maintenance application, bid farewell to the crisis of enterprise digital transformation
智能运维应用之道,告别企业数字化转型危机
【批处理DOS-CMD命令-汇总和小结】-跳转、循环、条件命令(goto、errorlevel、if、for[读取、切分、提取字符串]、)cmd命令错误汇总,cmd错误
Data analysis course notes (III) array shape and calculation, numpy storage / reading data, indexing, slicing and splicing
[force buckle]41 Missing first positive number
Alexnet experiment encounters: loss Nan, train ACC 0.100, test ACC 0.100