zoukankan      html  css  js  c++  java
  • TIM计数中断:神舟IV

     计数器模式

    原子的链接:http://www.openedv.com/posts/list/11832.htm

    TIM2-TIM5可以由向上计数、向下计数、向上向下双向计数。向上计数模式中,计数器从0计数到自动加载值(TIMx_ARR计数器内容),然后重新从0开始计数并且产生一个计数器溢出事件。在向下模式中,计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。而中央对齐模式(向上/向下计数)是计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数

    中断时间:自动加载值/(主频/预分频)

    先设置TIM3 向上计数 1秒1次中断,再设置TIM4向下计数1/4秒中断一次,在中断函数中打印counter,中断函数中不推荐使用printf

    Timer3_Config
     1 void Timer3_Config(void)
     2 {
     3   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
     4   NVIC_InitTypeDef     NVIC_InitStructure;
     5 
     6   /* TIM3 clock enable */
     7   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
     8   
     9   /* ---------------------------------------------------------------
    10     TIM3 Configuration: Output Compare Timing Mode:
    11     TIM2CLK = 36 MHz, Prescaler = 7200, TIM2 counter clock = 7.2 MHz
    12   --------------------------------------------------------------- */
    13 
    14   /* Time base configuration */
    15   //这个就是自动装载的计数值,由于计数是从0开始的,计数10000次后为9999
    16   TIM_TimeBaseStructure.TIM_Period = (10000 - 1);
    17   // 这个就是预分频系数,当由于为0时表示不分频所以要减1
    18   TIM_TimeBaseStructure.TIM_Prescaler = (7200 - 1);
    19   // 高级应用本次不涉及。定义在定时器时钟(CK_INT)频率与数字滤波器(ETR,TIx)
    20   // 使用的采样频率之间的分频比例
    21   TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    22   //向上计数
    23   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    24   //初始化定时器3
    25   TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
    26 
    27   /* Clear TIM3 update pending flag[清除TIM5溢出中断标志] */
    28   TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
    29 
    30   /* TIM IT enable */ //打开溢出中断
    31   TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
    32 
    33   /* TIM3 enable counter */
    34   TIM_Cmd(TIM3, ENABLE);  //计数器使能,开始工作
    35 
    36 
    37   
    38   /* Set the Vector Table base address at 0x08000000 */
    39   NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0000);
    40 
    41   /* Enable the TIM5 gloabal Interrupt */
    42   NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
    43   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    44   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    45   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    46 
    47   NVIC_Init(&NVIC_InitStructure);
    48 
    49 }
    Timer4_Config
     1 void Timer4_Config(void)
     2 {
     3 
     4   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
     5   NVIC_InitTypeDef     NVIC_InitStructure;
     6 
     7   /* TIM3 clock enable */
     8   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
     9   
    10   /* ---------------------------------------------------------------
    11     TIM3 Configuration: Output Compare Timing Mode:
    12     TIM2CLK = 36 MHz, Prescaler = 7200, TIM2 counter clock = 7.2 MHz
    13   --------------------------------------------------------------- */
    14 
    15   /* Time base configuration */
    16   //这个就是自动装载的计数值,由于计数是从0开始的,计数10000次后为9999 除以四,1/4秒中断
    17   TIM_TimeBaseStructure.TIM_Period = (10000/4 - 1);
    18   // 这个就是预分频系数,当由于为0时表示不分频所以要减1
    19   TIM_TimeBaseStructure.TIM_Prescaler = (7200 - 1);
    20   // 高级应用本次不涉及。定义在定时器时钟(CK_INT)频率与数字滤波器(ETR,TIx)
    21   // 使用的采样频率之间的分频比例
    22   TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    23   //向上计数
    24   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down;
    25   //初始化定时器4
    26   TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
    27 
    28   /* Clear TIM4 update pending flag[清除TIM4溢出中断标志] */
    29   TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
    30 
    31   /* TIM IT enable */ //打开溢出中断
    32   TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
    33 
    34   /* TIM4 enable counter */
    35   TIM_Cmd(TIM4, ENABLE);  //计数器使能,开始工作
    36 
    37 
    38   
    39   /* Set the Vector Table base address at 0x08000000 */
    40   NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0000);
    41 
    42   /* Enable the TIM5 gloabal Interrupt */
    43   NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
    44   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    45   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
    46   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    47 
    48   NVIC_Init(&NVIC_InitStructure);
    49 
    50 
    51 }
    TIM3_IRQHandler
    1 void TIM3_IRQHandler(void)
    2 {
    3   static u32 counter3 = 0;
    4   if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)
    5   {
    6    TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
    7   }    
    8   printf("Allen:-->TIM3:%d\n\r", counter3++);
    9 }
    TIM4_IRQHandler
     1 void TIM4_IRQHandler(void)
     2 {
     3   static u32 counter4 = 0;
     4   if(TIM_GetITStatus(TIM4,TIM_IT_Update)!=RESET)
     5   {
     6    TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
     7   }    
     8   printf("Allen:-->TIM4:%d\n\r", counter4++);;
     9 
    10 }
  • 相关阅读:
    POJO,简单的Java对象
    Oracle 11g R2 for Win7旗舰版(64位)- 安装
    Eclipse安装与配置
    Tomcat 安装、配置与部署
    图形数据库 Neo4j 开发实战【转载】
    Java 语言中 Enum 类型的使用介绍【转载】
    IBM Java 7 新特性和在 WAS 8.5 中的配置【转载】
    为Eclipse指定JVM
    网页页面的宽度:950 还是 960?
    Zabbix + Grafana
  • 原文地址:https://www.cnblogs.com/wwjdwy/p/2958263.html
Copyright © 2011-2022 走看看