STM32学习-定时器中断实验
2016-07-24 15:02
260 查看
——————————————————————————————————————————————————————————
无论是谁,你的一天也只有二十四小时。
你可以玩,也能可以睡大觉,可以去学习,也可以去探索那片从未到达的那片海。
时间不会为任何人停留,你可以选择原地踏步,当然你也可以选择勇攀高峰。
—————————————————————————————————————————————————————————————
通过定时器中断配置,每500ms中断一次,然后中断服务函数中控制LED实现LED1状态取反(闪烁)。
时钟选择是默认的时钟,72MHz。 Tout(溢出时间)=(ARR+1)(PSC+1)/Tclk(72x10^6)。因此,psc选择7199,arr选择4999。这样配置的溢出时间刚好是500ms。
程序配置过程
第一步 TIM3时钟的初始化。TM3时钟是挂载在APB1的总线上,所以我们调用APB1总线的使能函数来使能TIM3
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
第二步 初始化定时器参 数, 设置 自动重装值 , 分频系数 ,计数方式 等
voidTIM_TimeBaseInit(TIM_TypeDef*TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
第三步 定时时间到了,我们要进入中断,使能中断,使能中断的参数是更新中断(计数器溢出的产生的中断)。
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);
第四步 中断优先级配置
在定时器中断使能之后,因为要产生中断,必不可少的要设置 NVIC 相关寄存器,设置中断优先级,用到 NVIC_Init ()函数实现中断优先级的设置。
第五步 使能 TIM3
我们在配置完后要开启定时器,使能定时器的函数是通过 TIM_Cmd 函数来实现的:
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)
第六步 中断服务函数
中断服务函数一定要做两种事情,第一判断是不是更新中断,第二清除定时器 TIMx 的中断 TIM_IT 标志位。
判断是否发生更新中断有两种函数
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t)
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
清除中断标志位,方法是:
TIM_ClearITPendingBit(TIM3, TIM_IT_Update );
这里需要说明一下,固件库还提供了两个函数用来判断定时器状态以及清除定时器状态标志位的函数 TIM_GetFlagStatus 和 TIM_ClearFlag,他们的作用和前面两个函数的作用类似。只是在 TIM_GetITStatus 函数中会先判断这种中断是否使能,使能了才去判断中断标志位,而TIM_GetFlagStatus 直接用来判断状态标志位。
无论是谁,你的一天也只有二十四小时。
你可以玩,也能可以睡大觉,可以去学习,也可以去探索那片从未到达的那片海。
时间不会为任何人停留,你可以选择原地踏步,当然你也可以选择勇攀高峰。
—————————————————————————————————————————————————————————————
通过定时器中断配置,每500ms中断一次,然后中断服务函数中控制LED实现LED1状态取反(闪烁)。
时钟选择是默认的时钟,72MHz。 Tout(溢出时间)=(ARR+1)(PSC+1)/Tclk(72x10^6)。因此,psc选择7199,arr选择4999。这样配置的溢出时间刚好是500ms。
程序配置过程
第一步 TIM3时钟的初始化。TM3时钟是挂载在APB1的总线上,所以我们调用APB1总线的使能函数来使能TIM3
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
第二步 初始化定时器参 数, 设置 自动重装值 , 分频系数 ,计数方式 等
voidTIM_TimeBaseInit(TIM_TypeDef*TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
第三步 定时时间到了,我们要进入中断,使能中断,使能中断的参数是更新中断(计数器溢出的产生的中断)。
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);
第四步 中断优先级配置
在定时器中断使能之后,因为要产生中断,必不可少的要设置 NVIC 相关寄存器,设置中断优先级,用到 NVIC_Init ()函数实现中断优先级的设置。
第五步 使能 TIM3
我们在配置完后要开启定时器,使能定时器的函数是通过 TIM_Cmd 函数来实现的:
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)
第六步 中断服务函数
中断服务函数一定要做两种事情,第一判断是不是更新中断,第二清除定时器 TIMx 的中断 TIM_IT 标志位。
判断是否发生更新中断有两种函数
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t)
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
清除中断标志位,方法是:
TIM_ClearITPendingBit(TIM3, TIM_IT_Update );
这里需要说明一下,固件库还提供了两个函数用来判断定时器状态以及清除定时器状态标志位的函数 TIM_GetFlagStatus 和 TIM_ClearFlag,他们的作用和前面两个函数的作用类似。只是在 TIM_GetITStatus 函数中会先判断这种中断是否使能,使能了才去判断中断标志位,而TIM_GetFlagStatus 直接用来判断状态标志位。
相关文章推荐
- 解决windows,linux启动问题
- 共享的未来:Pydio 与 ownCloud 的联合
- 基于v4l2的视频监控
- Power of Three
- MPAndroidChart使用一之圆饼图
- Linux学习方法论
- C语言+EasyX实现数字雨
- HDU1459 非常可乐(BFS)
- Delphi如何实现多国语言
- eclipse新建maven项目(2)
- EventBus原理详解
- poj1182 带权并查集 NOI 2001 食物链(eat) P1531
- gdb调试core时打印出当时变量的内容------有时可以主动制造core来看变量值
- 查看手册man命令后面的参数选择
- Eclipse中自动补全功能的设置
- SpringBoot开发实践-web组件
- STL中容器大小的计算
- 理解Java垃圾回收
- ArcEngine错误提示
- UVA11374_Airport Express