• 定时器中断实验


    通用定时器

     

    APB1默认为36M,36*2=72M,

    计数器是0~65535

     

    两个AHB/APB桥在AHB2APB总线间提供同步连接。 APB1操作速度限于36MHzAPB2
    作于全速(最高72MHz)
    注意: 当对APB寄存器进行8位或者16位访问时,该访问会被自动转换成32位的访问:桥会自动将8
    或者32位的数据扩展以配合32位的向量。
    程序存储器、数据存储器、寄存器和输入输出端口被组织在同一个4GB的线性地址空间内。

    下面的例子说明如何映射别名区中SRAM地址为0x20000300的字节中的位216进制的计算
    0x22006008 = 0x22000000 + (0x300× 32) + (2× 4).
    0x22006008地址的写操作与对SRAM中地址0x20000300字节的位2执行读--写操作有着相
    同的效果

    128 256  512 1024

    一个输入通道可以给两个捕获通道

     时钟分频是设置采样滤波的

    重复计数器是高级定时器需要设置的

    分频系数会自动加一,为36000,不能超过65535

    500ms=1000*36000/72M

    读取状态标志位以及清除中断标志位,函数分别为TIM_GetFlagStatus和TIM_ClearFlag

     time.c

    #include "time.h"
    #include "led.h"

    void TIM4_Init(u16 pre,u16 psc)
    {
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//结构体初始化
    NVIC_InitTypeDef NVIC_InitStructure;
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能TIM4时钟

    TIM_TimeBaseInitStructure.TIM_Prescaler=psc;//定时器预分频器
    TIM_TimeBaseInitStructure.TIM_Period=pre; //定时器周期
    TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//技术模式
    TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; //时钟分频
    TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);

    TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);
    TIM_ClearITPendingBit(TIM4,TIM_IT_Update);//清除标志

    NVIC_InitStructure.NVIC_IRQChannel=TIM4_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占式优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=3; //响应优先级,0到3选择
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能中断通道
    NVIC_Init(&NVIC_InitStructure);

    TIM_Cmd(TIM4,ENABLE);

    }

    void TIM4_IRQHandler(void)
    {
    if(TIM_GetITStatus(TIM4,TIM_IT_Update)==1)
    {
    led2=!led2;
    }
    TIM_ClearITPendingBit(TIM4,TIM_IT_Update);//清除标志
    }

     总结:1.TIM4初始化函数,定义变量

                2.TIM和NVIC结构体初始化

                3.使能TIM4时钟,挂接在APB1上

                4.定时器预分频器,周期,技术模式,时钟分频,初始变量及结构地址

               5.TIM_ITConfig,清除标志

               6.NVIC的设置, TIM_Cmd(TIM4,ENABLE);

               7.TIM4_IRQHandler函数,if语句判断状态if(TIM_GetITStatus(TIM4,TIM_IT_Update)==1)

               8.清除标志,TIM_ClearITPendingBit(TIM4,TIM_IT_Update);

     time.h

    #ifndef _time_H
    #define _time_H

    #include "system.h"

    void TIM4_Init(u16 pre,u16 psc);

    #endif

    总结:注意包含头文件#include "system.h",初始化函数

    main.c

    #include "system.h"
    #include "led.h"
    #include "SysTick.h"
    #include "time.h"

    int main()
    {
    u8 i=0;
    SysTick_Init(72);//72M
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    LED_Init();//初始化
    TIM4_Init(1000,36000-1);//500ms定时器时间

    while(1) //可以检测是否死机
    {
    i++;
    if(i%20==0)
    {
    led1=!led1; //led1不断闪烁
    }
    delay_ms(10);
    }
    }

     

  • 相关阅读:
    根据科目计算父科目ID,并递归累计求父科目的金额
    xshell连接中标麒麟
    查看linux版本
    虚拟机的Vmtools
    apt-get和yum
    1264
    使用navicat的坑
    Qt bug
    模板函数举例
    头文件里声明和定义,Qt编译不过问题
  • 原文地址:https://www.cnblogs.com/296389183yy/p/9370730.html
Copyright © 2020-2023  润新知