zoukankan      html  css  js  c++  java
  • 定时器中断

    STM32中一共有11个定时器,其中2个高级控制定时器,4个普通定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。

    TIM1和TIM8是能够产生3对PWM互补输出的高级定时器,常用于三相电机的驱动,时钟由APB2的输出产生;TIM2-TIM5是普通定时器,TIM6和TIM7是基本定时器,其时钟由APB1输出产生。

    通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成。

    通用TIMx定时器特性包括:
    ●16位向上,向下,向上/向下自动装载计数器
    ● 16位可编程预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值
    ●4个独立通道:(定时器通道是什么意思?在PWM一节中有提到...
      − 输入捕获
      − 输出比较
      − PWM生成(边缘或中间对齐模式)
      − 单脉冲模式输出
    ● 使用外部信号控制定时器和定时器互连的同步电路
    ● 如下事件发生时产生中断/DMA:
      − 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
      − 触发事件(计数器启动,停止,初始化或者由内部/外部触发计数)
      − 输入捕获
      − 输出比较

    定时器的RCC时钟部分:

    APB1和APB2所连的外设如下:

    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------->

    定时器中断的一般步骤:(以TIM2为例)

    1.定时器时钟使能    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

    2.中断配置  定义结构体、清空定时器2的中断位、设置初始值、设置预分频、时钟分割、计数方式、使能、打开中断、打开定时器外设资源。

    3.中断优先级配置   定义结构体、确定分组、设置IRQ通道、设置抢占优先级、设置从优先级、通道使能、使能。

    4.中断服务程序

    测试用例:(以TIM2为定时器控制LED发光状态)

     1 #include "pbdata.h"
     2 #include "misc.h"
     3 #include "stm32f10x_exti.h"
     4 #include "stm32f10x_tim.h"
     5 
     6 void RCC_Configration(void)
     7 {
     8      SystemInit();
     9      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    10      RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);      //定时器时钟使能
    11 }
    12 
    13 void GPIO_Configration(void)
    14 {
    15     GPIO_InitTypeDef GPIO_InitStructure;
    16     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
    17     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    18     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    19     GPIO_Init(GPIO_LED,&GPIO_InitStructure);
    20 }
    21 
    22 /*
    23   *中断配置*
    24             */
    25 void TIM_Configuration(void)
    26 {
    27     TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;    
    28     TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//清空定时器3的中断位
    29 
    30     TIM_TimeBaseStructure.TIM_Period = 2000;            //设置初始值,定时1s
    31     TIM_TimeBaseStructure.TIM_Prescaler = 35999;   //设置预分频
    32     TIM_TimeBaseStructure.TIM_ClockDivision = 0; //时钟分割
    33     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   //向上计数
    34     TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
    35 
    36     TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);  //打开中断
    37     TIM_Cmd(TIM2,ENABLE);                 //定时器外设打开
    38 }
    39 
    40 void NVIC_Configuration(void)         //设置优先级
    41 {
    42        NVIC_InitTypeDef NVIC_InitStructure; 
    43     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);                                                      
    44     NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;       //使能指定的IRQ通道
    45     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //指定成员NVIC_IRQChannel的抢占优先级
    46     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;            //指定成员NVIC_IRQChannel的从优先级
    47     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
    48     NVIC_Init(&NVIC_InitStructure);//初始化外设NVIC寄存器
    49 }
    50    
    51 int main(void)
    52 {
    53         RCC_Configration();
    54         GPIO_Configration();
    55         TIM_Configuration();
    56         NVIC_Configuration();
    57         while(1);
    58 }
    当你坚持做一件完全正确的事情,有可能在很长一段时间内,你的价值都是零。
  • 相关阅读:
    最佳内存缓存框架Caffeine
    18个Java8日期处理的实践,太有用了
    windows 2003 IIS FTP 530 home directory inaccessible
    关闭应用程序(主程序)(WPF)
    解决Win8.1 IE11兼容性问题的方法
    Web页面性能测试工具浅析
    JS模板引擎handlebars.js的简单使用
    mvc4+entityFramework5 发布时遇到的纠结问题
    sqlserver 导入数据出现 无法创建 OLE DB 取值函数。请查看列元数据是否有效
    正则基础之——贪婪与非贪婪模式
  • 原文地址:https://www.cnblogs.com/lweleven/p/tim2.html
Copyright © 2011-2022 走看看