硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2888|回复: 2
收起左侧

[有问必答] 定时器程序有点不懂

[复制链接]

2

主题

1

回帖

2

积分

新手上路

积分
2
发表于 2017-9-1 17:51:41 | 显示全部楼层 |阅读模式
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: bsp_SetTIMforInt
  4. *    功能说明: 配置TIM和NVIC,用于简单的定时中断. 开启定时中断。 中断服务程序由应用程序实现。
  5. *    形    参: TIMx : 定时器
  6. *              _ulFreq : 定时频率 (Hz)。 0 表示关闭。
  7. *              _PreemptionPriority : 中断优先级分组
  8. *              _SubPriority : 子优先级
  9. *    返 回 值: 无
  10. *********************************************************************************************************
  11. */
  12. void bsp_SetTIMforInt(TIM_TypeDef* TIMx, uint32_t _ulFreq, uint8_t _PreemptionPriority, uint8_t _SubPriority)
  13. {
  14.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  15.     uint16_t usPeriod;
  16.     uint16_t usPrescaler;
  17.     uint32_t uiTIMxCLK;
  18.       /* 使能TIM时钟 */
  19.     if ((TIMx == TIM1) || (TIMx == TIM8))
  20.     {
  21.         RCC_APB2PeriphClockCmd(bsp_GetRCCofTIM(TIMx), ENABLE);
  22.     }
  23.     else
  24.     {
  25.         RCC_APB1PeriphClockCmd(bsp_GetRCCofTIM(TIMx), ENABLE);
  26.     }
  27.     if (_ulFreq == 0)
  28.     {
  29.         TIM_Cmd(TIMx, DISABLE);        /* 关闭定时输出 */
  30.         /* 关闭TIM定时更新中断 (Update) */
  31.         {
  32.             NVIC_InitTypeDef NVIC_InitStructure;    /* 中断结构体在 misc.h 中定义 */
  33.             uint8_t irq = 0;    /* 中断号, 定义在 stm32f4xx.h */
  34.             if (TIMx == TIM1)
  35.                 irq = TIM1_UP_IRQn;
  36.             else if (TIMx == TIM2)
  37.                 irq = TIM2_IRQn;
  38.             else if (TIMx == TIM3)
  39.                 irq = TIM3_IRQn;
  40.             else if (TIMx == TIM4)
  41.                 irq = TIM4_IRQn;
  42.             else if (TIMx == TIM5)
  43.                 irq = TIM5_IRQn;
  44.             else if (TIMx == TIM6)
  45.                 irq = TIM6_IRQn;
  46.             else if (TIMx == TIM7)
  47.                 irq = TIM7_IRQn;
  48.             else if (TIMx == TIM8)
  49.                 irq = TIM8_UP_IRQn;
  50.             NVIC_InitStructure.NVIC_IRQChannel = irq;
  51.             NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = _PreemptionPriority;
  52.             NVIC_InitStructure.NVIC_IRQChannelSubPriority = _SubPriority;
  53.             NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;
  54.             NVIC_Init(&NVIC_InitStructure);
  55.         }        
  56.         return;
  57.     }
  58.     /*-----------------------------------------------------------------------
  59.         system_stm32f4xx.c 文件中 static void SetSysClockToHSE(void) 函数对时钟的配置如下:
  60.             //HCLK = SYSCLK
  61.             RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
  62.               
  63.             //PCLK2 = HCLK
  64.             RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
  65.             
  66.             //PCLK1 = HCLK
  67.             RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV1;
  68.         APB1 定时器有 TIM2, TIM3 ,TIM4, TIM5, TIM6, TIM7, TIM12, TIM13,TIM14
  69.         APB2 定时器有 TIM1, TIM8 ,TIM9, TIM10, TIM11
  70.     ----------------------------------------------------------------------- */
  71.     if ((TIMx == TIM1) || (TIMx == TIM8) || (TIMx == TIM9) || (TIMx == TIM10) || (TIMx == TIM11))
  72.     {
  73.         /* APB2 定时器 */
  74.         uiTIMxCLK = SystemCoreClock;
  75.     }
  76.     else    /* APB1 定时器 .  */
  77.     {
  78.         uiTIMxCLK = SystemCoreClock;    // SystemCoreClock / 2;
  79.     }
  80.     if (_ulFreq < 100)
  81.     {
  82.         usPrescaler = 10000 - 1;                    /* 分频比 = 1000 */
  83.         usPeriod =  (uiTIMxCLK / 10000) / _ulFreq  - 1;        /* 自动重装的值 */
  84.     }
  85.     else if (_ulFreq < 3000)
  86.     {
  87.         usPrescaler = 100 - 1;                    /* 分频比 = 100 */
  88.         usPeriod =  (uiTIMxCLK / 100) / _ulFreq  - 1;        /* 自动重装的值 */
  89.     }
  90.     else    /* 大于4K的频率,无需分频 */
  91.     {
  92.         usPrescaler = 0;                    /* 分频比 = 1 */
  93.         usPeriod = uiTIMxCLK / _ulFreq - 1;    /* 自动重装的值 */
  94.     }
  95.     /* Time base configuration */
  96.     TIM_TimeBaseStructure.TIM_Period = usPeriod;
  97.     TIM_TimeBaseStructure.TIM_Prescaler = usPrescaler;
  98.     TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  99.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  100.     TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
  101.     TIM_TimeBaseInit(TIMx, &TIM_TimeBaseStructure);
  102.     TIM_ARRPreloadConfig(TIMx, ENABLE);
  103.     /* TIM Interrupts enable */
  104.     TIM_ITConfig(TIMx, TIM_IT_Update, ENABLE);
  105.     /* TIMx enable counter */
  106.     TIM_Cmd(TIMx, ENABLE);
  107.     /* 配置TIM定时更新中断 (Update) */
  108.     {
  109.         NVIC_InitTypeDef NVIC_InitStructure;    /* 中断结构体在 misc.h 中定义 */
  110.         uint8_t irq = 0;    /* 中断号, 定义在 stm32f4xx.h */
  111.         if (TIMx == TIM1)
  112.             irq = TIM1_UP_IRQn;
  113.         else if (TIMx == TIM2)
  114.             irq = TIM2_IRQn;
  115.         else if (TIMx == TIM3)
  116.             irq = TIM3_IRQn;
  117.         else if (TIMx == TIM4)
  118.             irq = TIM4_IRQn;
  119.         else if (TIMx == TIM5)
  120.             irq = TIM5_IRQn;
  121.         else if (TIMx == TIM6)
  122.             irq = TIM6_IRQn;
  123.         else if (TIMx == TIM7)
  124.             irq = TIM7_IRQn;
  125.         else if (TIMx == TIM8)
  126.             irq = TIM8_UP_IRQn;
  127.         NVIC_InitStructure.NVIC_IRQChannel = irq;
  128.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = _PreemptionPriority;
  129.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = _SubPriority;
  130.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  131.         NVIC_Init(&NVIC_InitStructure);
  132.     }
  133. }
复制代码

============================================================
这个里面的if (_ulFreq < 100)
    {
        usPrescaler = 10000 - 1;                 
        usPeriod =  (uiTIMxCLK / 10000) / _ulFreq  - 1;    是什么意思
回复

使用道具 举报

2

主题

1

回帖

2

积分

新手上路

积分
2
 楼主| 发表于 2017-9-1 17:57:23 | 显示全部楼层
还有那个usPrescaler=10000-1 什么意思
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107034
QQ
发表于 2017-9-2 01:58:37 | 显示全部楼层

回 ccwwbb76 的帖子

ccwwbb76:还有那个usPrescaler=10000-1 什么意思 (2017-09-01 17:57) 
你问题的这两个问题其实是一个,就是这个公式:
TIM 更新周期是 = TIMCLK / (TIM_Period + 1)/(TIM_Prescaler + 1)


ps:帮你修改了下代码。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-15 05:58 , Processed in 0.162578 second(s), 31 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表