stm32 关于定时器TIM的使用(两个定时器)

您所在的位置:网站首页 tim文件传输中断 stm32 关于定时器TIM的使用(两个定时器)

stm32 关于定时器TIM的使用(两个定时器)

2024-01-21 13:42| 来源: 网络整理| 查看: 265

*STM32的定时器有着非常丰富的功能, 输入捕获/输出比较,PWM,中断等等。是我们学习STM32最频繁使用到的外设之一.楼主是用的是HAL来开发 记录一下。*

-一: 使用stm32cube 配置定时器。(我这里配置了两个定时器 TIM3 和tim4 这里不说cube的使用方法了)tim3 我配置了10ms的定时。

注意点一:定时器配置时间的时候 你要注意你程序的执行时间,不要小于你程序运行的时间。

注意点二:中断不要太频繁,太频繁了会出现很多奇怪的问题,也就是有部分程序没有时间运行。

注意点二:尽量不要在定时器中运用 for形成的的delay延时函数,最好HAL_Delay()也不要用, HAL_Delay()函数是使用中断的,for形成的delay是一种在运行 并且在计数。定时器内部花费太多时间,会影响你外部程序运行的,使用完后尽快释放。 在这里插入图片描述 考虑下萌新 讲解一下基础知识吧, 1.1 Count Settings 1.1.1 Prescaler:分频 何为分频:把时钟频率减小,时钟的频率太大了,我要减小,为什么?例如我传送串口数据1MBPS 你给我50M的刷新,是不是太大了?计算机也反应不过来。 在介绍下倍频吧:我们使用的是8m 外部晶振,我们的程序在运行的时候,是一个时钟走一行代码的(一个指令更合理), 所以说 时钟越大我们的系统运行的就越快,所以我们需要把频率翻倍,8M的输入 主程序运行的是72M 就是9倍,本人这里使用的是72M 时钟, 我这边是720分频 ,给tim3的是100k的时钟

1.2 counter mode 定时器计数模式 通用定时器可以向上计数、向下计数、向上向下双向计数模式。

向上计数模式:计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数并且产生一个计数器溢出事件。 向下计数模式:计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。 中央对齐模式(向上/向下计数):计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。 简单地理解三种计数模式,可以通过下面的图形: 在这里插入图片描述

1.3 Counter Period(自动重装载值) : 1000

计数到指定值的时候 就会触发一个中断,我这里设定是1000,每100K的时间 计数一次,1000次后触发中断,执行中断函数中的内容。

二:配置好时钟后 生成代码。(看APB1 Timer的时钟就好了) 在这里插入图片描述 CKD(时钟分频因子) : No Division 不分频

选项: 可以选择二分频和四分频

auto-reload-preload(自动重装载) : Enable 使能 TRGO Parameters 触发输出 (TRGO) TRGO: 定时器的触发信号输出 在定时器的定时时间到达的时候输出一个信号(如:定时器更新产生TRGO信号来触发ADC的同步转换,使定时器按照一个固定的频率进行转换)

三: keil中编写代码 1 :基础知识(基础不牢 地动山摇) 首先进入.TIM.C 和.h 中查看一下基本的HAL函数,以后不记得库函数了也容易在里面查找。 2:都是应用工程师 我不装逼了 直接使用函数。 经常使用的几个函数讲解: 2.1 HAL_TIM_IRQHandler(&htim3); // 这个一看就知道是中断吧? 这个函数的具体作用是判断中断是否正常,然后判断产生的是哪一类定时器中断(溢出中断/PWM中断…),然后进入相应的中断回调函数 2.2 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) // 中断回调函数 中断发生后 进入这个函数,很多搞c的 经常不用回调函数 忘了回调函数的作用,我是说我,我那会搞esp8266 sdk的时候才去搞明白的。 在HAL库中,每进行完一个中断,并不会立刻退出,而是会进入到中断回调函数中,

这里我们是使用定时器溢出中断回调函数 void TIM3_IRQHandler(void) 首先进入中断函数 HAL_TIM_IRQHandler(&htim3);之后进入定时器中断处理函数 判断产生的是哪一类定时器中断(溢出中断/PWM中断…) 和定时器通道 void HAL_TIM_PeriodElapsedCallback(&htim3); 进入相对应中断回调函数 在中断回调函数中添加用户代码

void HAL_TIM_PeriodElapsedCallback(&htim); 在stm32f1xx_it.c中找到

在main.c主函数上方初始化使能定时器2 /* USER CODE BEGIN 2 */ /使能定时器1中断/

HAL_TIM_Base_Start_IT(&htim3); HAL_TIM_Base_Start_IT(&htim4);

/* USER CODE END 2 */ 在main.c主函数下方添加中断回调函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == htim3.Instance) // if (htim == (&htim3)) { HAL_GPIO_TogglePin( GPIOA, GPIO_PIN_1); // usb_printf("%c%c%c%c",AD_Value[8],AD_Value[9],AD_Value[10],AD_Value[11]); } if (htim->Instance == htim4.Instance) //if (htim == (&htim4)) { HAL_GPIO_TogglePin( GPIOA, GPIO_PIN_2); } }

还有一点要注意的,配置定时器的时候 一定要把中断选上咯,我最开始使用cube配置的时候 按照网上的例子 没有配置中断 折腾了好一会。 在这里插入图片描述

有问题再留言



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3