• 嵌入式02 STM32 实验10 定时器中断


     优秀文章

    https://blog.csdn.net/qq_38351824/article/details/82619734

    一、STM32通用定时器TIM2、TIM3、TIM4和TIM5共四个通用定时器,它们之间完全独立,不共享任何资源)

      STM32F1系列的通用定时器是一个通过可编程预分频器(PSC)驱动的16位自动重装载计数器(CNT)构成。

      STM32的通用计时器可用于:

        测量输入信号的脉冲长度(输入捕获)

        产生输出波形(输出比较和PWM)

      使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。

      通用定时器TIMx功能:

        1、16位向上、向下、向上/向下自动装载计数器(TIMx_CNT)。

        2、16位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟的分频系数为1~65535之间的任意值(2^16=65535)。

        3、每个通用定时器有4个独立通道(TIMx_CH1~4),可以用作

          A、输入捕获

          B、输出比较

          C、PWM生成(边缘或中间对齐模式)

          D、单脉冲模式输出

        4、可使用外部信号(TIMx_ETR)控制定时器和定时器互连(用一个定时器控制另外一个定时器)的同步电路。

        5、产生中断/DMA的触发来源:

          A、更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者外部/内部触发)

          B、触发事件(计数器启动、停止、初始化或者由内部/外部触发)

          C、输入捕获

          D、输出比较

          E、支持针对定位的增量(正交)编码器和霍尔传感器电路

          F、触发输入作为外部时钟或者按周期的电流管理

    二、定时器的计数模式

      1、向上计数模式:计数器从0计数到自动重装载值(TIMx_ARR),然后重新从0开始计数并且产生一个计数器溢出事件。

      2、向下计数模式:计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。

      3、中央对齐模式(向上/向下计数):计数器从0开始计数到重装载值-1,产生一个计数器溢出事件,然后向下计数到1并产生一个计数器溢出事件,然后再从0开始重新计数。

    三、定时器溢出时间

      Tout(溢出时间)= (ARR+1)(PSC+1)/Tclk                    

      ARR:自动重装值

      PSC:预分频系数

      Tclk:APB1倍频得到的(APB1的分频系数为1,Tclk等于APB1,不等于1时,则Tclk等于APB1的两倍)

    四、软件设计

      使用定时器中断3控制LED1和LED2闪烁

      子函数

     1 #include "timer.h"
     2 #include "led.h"
     3 
     4 void TIM3_Int_Init(u16 arr, u16 psc)                  //定时器3初始化,
     5 {
     6     TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;        //
     7     NVIC_InitTypeDef NVIC_Init_Structure;                    //
     8     
     9     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);    //使能定时器3时钟
    10     
    11     TIM_TimeBaseInitStructure.TIM_Period = arr;                //自动重装载值
    12     TIM_TimeBaseInitStructure.TIM_Prescaler = psc;            //预分频系数
    13     TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;        //向上计数
    14     TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;            //
    15     TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);                    //
    16     
    17     TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);        //开启定时器中断,更新中断
    18     
    19     
    20     //中断优先级
    21     NVIC_Init_Structure.NVIC_IRQChannel = TIM3_IRQn;            //TIM3中断
    22     NVIC_Init_Structure.NVIC_IRQChannelCmd = ENABLE;            //IRQ通道使能
    23     NVIC_Init_Structure.NVIC_IRQChannelPreemptionPriority = 0;    //先占优先级0级
    24     NVIC_Init_Structure.NVIC_IRQChannelSubPriority = 3;            //从优先级3级
    25     NVIC_Init(&NVIC_Init_Structure);                //初始化NVIC寄存器NVIC
    26     
    27     TIM_Cmd(TIM3, ENABLE);                            //使能定时器
    28 }
    29 
    30 void TIM3_IRQHandler(void)
    31 {
    32     if(TIM_GetITStatus(TIM3, TIM_IT_Update)!=RESET)        //状态标志位获取
    33     {
    34         LED1 = !LED1;
    35         TIM_ClearITPendingBit(TIM3, TIM_IT_Update);        //状态标志位清除
    36     }
    37 }

      主函数

     1 #include "stm32f10x.h"
     2 #include "led.h"
     3 #include "delay.h"
     4 #include "wdg.h"
     5 #include "key.h"
     6 #include "beep.h"
     7 #include "timer.h"
     8 
     9 int main(void)
    10 {
    11     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);            //中断优先级分组,载misc文件中
    12     delay_init();        //延时初始化
    13     LED_Init();            //LED初始化
    14     
    15     TIM3_Int_Init(4999, 7199);        //定时器中断初始化
    16     
    17     while(1)
    18     {
    19         LED2 = !LED2;
    20         delay_ms(200);
    21     }
    22     
    23 }
  • 相关阅读:
    WSS3.0安装后,系统资源消耗这么大
    通过名称找到控件(VB.NET)
    zencart 对首页静态化处理
    zen cart 模板类 template_fun class
    现在网络上流行的病毒都太“厚道”了
    从SPS2003的邮件设置上看微软标准与国际标准
    我也有了BLOG,欢迎交流
    如何给WEBPART中增加客户端代码
    如何修改More Information 中的Page 2,Page 3,Page4
    汽车保养项目[转载]
  • 原文地址:https://www.cnblogs.com/ksht-wdyx/p/11665062.html
Copyright © 2020-2023  润新知