谷动谷力

标题: STM32F103RCT6开发板M3单片机教程06--定时器中断 [打印本页]

作者: sunsili    时间: 2021-12-21 23:57
标题: STM32F103RCT6开发板M3单片机教程06--定时器中断
本帖最后由 sunsili 于 2022-1-5 15:27 编辑

STM32F103RCT6开发板M3单片机教程06--定时器中断

除非特别说明,本章节描述的模块应用于整个STM32F103xx微控制器系列,因为我们使用是STM32F103RCT6开发板是mini最小系统板。
本教程使用是(光明谷SUN_STM32mini开发板



首先了解一下是STM32F10X定时器(Timer)


注:

小容量产品是指闪存存储器容量在16K32K字节之间的STM32F101xxSTM32F102xxSTM32F103xx微控制器。
中容量产品是指闪存存储器容量在
64K128K字节之间的STM32F101xxSTM32F102xxSTM32F103xx微控制器。
大容量产品是指闪存存储器容量在
256K512K字节之间的STM32F101xxSTM32F103xx微控制器。


大容量的STM32F103xx增强型系列产品包含最多2个高级控制定时器、 4个普通定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。
下表比较了高级控制定时器、普通定时器和基本定时器的功能:



高级控制定时器(TIM1和TIM8)
两个高级控制定时器(TIM1TIM8)可以被看成是分配到6个通道的三相PWM发生器,它具有带死区插入的互补PWM输出,还可以被当成完整的通用定时器。四个独立的通道可以用于:
● 输入捕获
● 输出比较
● 产生
PWM(边缘或中心对齐模式)
● 单脉冲输出
配置为
16位标准定时器时,它与TIMx定时器具有相同的功能。配置为16PWM发生器时,它具有全调制能力(0~100%)
在调试模式下,计数器可以被冻结,同时
PWM输出被禁止,从而切断由这些输出所控制的开关。
很多功能都与标准的
TIM定时器相同,内部结构也相同,因此高级控制定时器可以通过定时器链接功能与TIM定时器协同操作,提供同步或事件链接功能。

通用定时器(TIMx)
STM32F103xCSTM32F103xDSTM32F103xE增强型系列产品中,内置了多达4个可同步运行的标准定时器(TIM2TIM3TIM4TIM5)。每个定时器都有一个16位的自动加载递加/递减计数器、一个16位的预分频器和4个独立的通道,每个通道都可用于输入捕获、输出比较、 PWM和单脉冲模式输出,在最大的封装配置中可提供最多16个输入捕获、输出比较或PWM通道。
它们还能通过定时器链接功能与高级控制定时器共同工作,提供同步或事件链接功能。在调试模式下,计数器可以被冻结。任一标准定时器都能用于产生
PWM输出。每个定时器都有独立的DMA请求机制。
这些定时器还能够处理增量编码器的信号,也能处理
13个霍尔传感器的数字输出。

基本定时器-TIM6和TIM7
2个定时器主要是用于产生DAC触发信号,也可当成通用的16位时基计数器。

独立看门狗
独立的看门狗是基于一个12位的递减计数器和一个8位的预分频器,它由一个内部独立的40kHzRC振荡器提供时钟;因为这个RC振荡器独立于主时钟,所以它可运行于停机和待机模式。它可以被当成看门狗用于在发生问题时复位整个系统,或作为一个自由定时器为应用程序提供超时管理。通过选项字节可以配置成是软件或硬件启动看门狗。在调试模式下,计数器可以被冻结。

窗口看门狗
窗口看门狗内有一个7位的递减计数器,并可以设置成自由运行。它可以被当成看门狗用于在发生问题时复位整个系统。它由主时钟驱动,具有早期预警中断功能;在调试模式下,计数器可以被冻结。

系统时基定时器
这个定时器是专用于实时操作系统,也可当成一个标准的递减计数器。它具有下述特性:
24位的递减计数器
● 自动重加载功能
● 当计数器为
0时能产生一个可屏蔽系统中断
● 可编程时钟源



高级控制定时器框图



了解基本概念后,今天用通用定时器(TIM2), 写一个定时中断的程序


复制上节工程文件夹打开(这个方法比较方便)


工程源码

06STM32F103RCT6_TIM2_INT.zip (318.44 KB, 下载次数: 2)

关注谷动谷力公众号:






TIMER.png (154.55 KB, 下载次数: 114)

TIMER.png

作者: 鸣涧    时间: 2022-4-22 00:11

新建函数void LED_Task(void), 把LED 相关代码,整合在一起,这就慢慢,向多任务靠近了

  1. void LED_Task(void)
  2. {
  3.     if(flag)
  4.     {
  5.         LED4_ON();
  6.         flag=0;
  7.     }
  8.     else
  9.     {
  10.         LED4_OFF();
  11.         flag=1;
  12.     }
  13.     if(flag)
  14.     {
  15.         printf("LED ON\n");
  16.         
  17.     }
  18.     else
  19.     {
  20.         printf("LED OFF\n");
  21.     }
  22. }
复制代码


main函数精减, 就精减主我循环里的内容.

  1. .....
  2. while (1)
  3.         {
  4.         if(tim2_tick)
  5.         {
  6.             tim2_tick = 0;
  7.             LED_Task();
  8.         }
  9.         }
  10. .....
复制代码




TIM2中断服务函数精减,一般写程序原则:
中断服务函数尽量少指令,尽快跳出/TIM2中断服务函数,以便其他任务执行到


精减如下:

  1. void TIM2_IRQHandler(void)   //TIM2中断服务函数
  2. {
  3.     tim2_tick = 1;
  4.         if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否
  5.         {
  6.                 TIM_ClearITPendingBit(TIM2, TIM_IT_Update  );  //清除TIMx更新中断标志
  7.                
  8.         }
  9. }
复制代码









欢迎光临 谷动谷力 (http://bbs.sunsili.com/) Powered by Discuz! X3.2