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

    *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配置的时候 按照网上的例子 没有配置中断 折腾了好一会。
在这里插入图片描述

有问题再留言

  • 12
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七 六 伍

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值