stm32 关于定时器TIM的使用(两个定时器) |
您所在的位置:网站首页 › tim文件传输中断 › stm32 关于定时器TIM的使用(两个定时器) |
*STM32的定时器有着非常丰富的功能, 输入捕获/输出比较,PWM,中断等等。是我们学习STM32最频繁使用到的外设之一.楼主是用的是HAL来开发 记录一下。*
-一: 使用stm32cube 配置定时器。(我这里配置了两个定时器 TIM3 和tim4 这里不说cube的使用方法了)tim3 我配置了10ms的定时。 注意点一:定时器配置时间的时候 你要注意你程序的执行时间,不要小于你程序运行的时间。 注意点二:中断不要太频繁,太频繁了会出现很多奇怪的问题,也就是有部分程序没有时间运行。 注意点二:尽量不要在定时器中运用 for形成的的delay延时函数,最好HAL_Delay()也不要用, HAL_Delay()函数是使用中断的,for形成的delay是一种在运行 并且在计数。定时器内部花费太多时间,会影响你外部程序运行的,使用完后尽快释放。 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的时钟就好了) 选项: 可以选择二分频和四分频 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 |