硬汉嵌入式论坛

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

硬件定时器函数bsp_StartHardTimer怎么使用

[复制链接]

2

主题

1

回帖

7

积分

新手上路

积分
7
发表于 2018-8-28 17:25:35 | 显示全部楼层 |阅读模式
在stm32F429上,使用 V5-003b_SysTick实验_复杂例子,添加硬件定时器函数bsp_StartHardTimer(1, 3000000, test);为什么会立刻执行test,我用bsp_GetRunTime()查看时间间隔是65ms,不管怎么改时间,都不变,不知道哪里没有设置到位。

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2018-8-28 17:36:06 | 显示全部楼层
F429,直接看此例子即可,有使用方法,看main.C文件,看下就会了。支持的参数范围记得看下此函数的注释说明
http://www.armbbs.cn/forum.ph ... 7658&extra=page%3D1

1.png


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2018-8-28 17:47:27 | 显示全部楼层

1、选择宏定义,TIM2和TIM5是32位定时器,其它是16位定时器,在文件bsp_timer.C开头

#define USE_TIM2
//#define USE_TIM3
//#define USE_TIM4
//#define USE_TIM5

#ifdef USE_TIM2
        #define TIM_HARD                TIM2
        #define TIM_HARD_IRQn        TIM2_IRQn
        #define TIM_HARD_RCC        RCC_APB1Periph_TIM2
#endif

#ifdef USE_TIM3
        #define TIM_HARD                TIM3
        #define TIM_HARD_IRQn        TIM3_IRQn
        #define TIM_HARD_RCC        RCC_APB1Periph_TIM3
#endif

#ifdef USE_TIM4
        #define TIM_HARD                TIM4
        #define TIM_HARD_IRQn        TIM4_IRQn
        #define TIM_HARD_RCC        RCC_APB1Periph_TIM4
#endif

#ifdef USE_TIM5
        #define TIM_HARD                TIM5
        #define TIM_HARD_IRQn        TIM5_IRQn
        #define TIM_HARD_RCC        RCC_APB1Periph_TIM5
#endif


2、bsp.C文件里面记得先初始化

调用函数bsp_InitHardTimer();  一般此函数会在bsp_timer.C文件的bsp_InitTimer里面被调用,记得优先看下调用了没,没有调用就单独调用下。

3、使用举例
比如50ms执行某个功能
调用函数bsp_StartHardTimer(1 ,50000, (void *)TIM_CallBack1);即可。

TIM_CallBack1函数里面填写要执行的功能即可:
static void TIM_CallBack1(void)
{
    xxxxxxx
}



回复

使用道具 举报

2

主题

1

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2018-8-30 13:52:17 | 显示全部楼层
eric2013 发表于 2018-8-28 17:36
F429,直接看此例子即可,有使用方法,看main.C文件,看下就会了。支持的参数范围记得看下此函数的注释说明 ...

问题出在void bsp_InitHardTimer(void)这个函数,V5的例子语句为
  1. usPeriod = 0xFFFF;
复制代码
而V6的语句为
  1. #if defined (USE_TIM2) || defined (USE_TIM5)
  2.         usPeriod = 0xFFFFFFFF;
  3. #else
  4.         usPeriod = 0xFFFF;
  5. #endif
复制代码
改成V6的就好了。感谢。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2018-8-30 13:59:22 | 显示全部楼层
fengbuding 发表于 2018-8-30 13:52
问题出在void bsp_InitHardTimer(void)这个函数,V5的例子语句为而V6的语句为改成V6的就好了。感谢。

估计是看的驱动版本稍有点早,要以论坛置顶帖V5网盘出厂程序里面带的驱动包为准。
回复

使用道具 举报

34

主题

111

回帖

213

积分

高级会员

程序小白

积分
213
QQ
发表于 2019-12-4 14:52:22 | 显示全部楼层
bsp_timer的中的软件定时器已经提供了4组。 感觉很多了。  不知道实际应用中,什么情况下必须使用bsp_timer下面的硬件定时器?是定时更精确吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2019-12-4 19:43:26 | 显示全部楼层
清风徐来 发表于 2019-12-4 14:52
bsp_timer的中的软件定时器已经提供了4组。 感觉很多了。  不知道实际应用中,什么情况下必须使用bsp_timer ...

modbus里面的时间间隔用的。
回复

使用道具 举报

4

主题

18

回帖

30

积分

新手上路

积分
30
发表于 2021-4-26 15:36:10 | 显示全部楼层
eric2013 发表于 2019-12-4 19:43
modbus里面的时间间隔用的。

大佬,我想请教一下这个微秒硬件定时器的问题,我看到bsp_StartHardTimer里面只是获取了计数器的值,然后就直接加上定时时间,这样不会有溢出的问题吗?假如现在计数器是0xFFFF,需要定时100us,那么cnt_tar肯定就是大于0xFFFF,这个比较的值不是永远也达不到吗?

  1. void bsp_StartHardTimer(uint8_t _CC, uint32_t _uiTimeOut, void * _pCallBack)
  2. {
  3.     uint32_t cnt_now;
  4.     uint32_t cnt_tar;

  5.     /*
  6.         执行下面这个语句,时长 = 18us (通过逻辑分析仪测量IO翻转)
  7.         bsp_StartTimer2(3, 500, (void *)test1);
  8.     */
  9.     if (_uiTimeOut < 5)
  10.     {
  11.         ;
  12.     }
  13.     else
  14.     {
  15.         _uiTimeOut -= 5;
  16.     }

  17.     cnt_now = TIM_GetCounter(TIM_HARD);            /* 读取当前的计数器值 */
  18.     cnt_tar = cnt_now + _uiTimeOut;                        /* 计算捕获的计数器值:这里不会溢出吗? */
  19.     if (_CC == 1)
  20.     {
  21.         s_TIM_CallBack1 = (void (*)(void))_pCallBack;

  22.         TIM_SetCompare1(TIM_HARD, cnt_tar);              /* 设置捕获比较计数器CC1 */
  23.         TIM_ClearITPendingBit(TIM_HARD, TIM_IT_CC1);
  24.                 TIM_ITConfig(TIM_HARD, TIM_IT_CC1, ENABLE);        /* 使能CC1中断 */

  25.     }
  26.     else if (_CC == 2)
  27.     {
  28.                 s_TIM_CallBack2 = (void (*)(void))_pCallBack;

  29.         TIM_SetCompare2(TIM_HARD, cnt_tar);              /* 设置捕获比较计数器CC2 */
  30.                 TIM_ClearITPendingBit(TIM_HARD, TIM_IT_CC2);
  31.                 TIM_ITConfig(TIM_HARD, TIM_IT_CC2, ENABLE);        /* 使能CC2中断 */
  32.     }
  33.     else if (_CC == 3)
  34.     {
  35.         s_TIM_CallBack3 = (void (*)(void))_pCallBack;

  36.         TIM_SetCompare3(TIM_HARD, cnt_tar);              /* 设置捕获比较计数器CC3 */
  37.         TIM_ClearITPendingBit(TIM_HARD, TIM_IT_CC3);
  38.                 TIM_ITConfig(TIM_HARD, TIM_IT_CC3, ENABLE);        /* 使能CC3中断 */
  39.     }
  40.     else if (_CC == 4)
  41.     {
  42.         s_TIM_CallBack4 = (void (*)(void))_pCallBack;

  43.         TIM_SetCompare4(TIM_HARD, cnt_tar);              /* 设置捕获比较计数器CC4 */
  44.                 TIM_ClearITPendingBit(TIM_HARD, TIM_IT_CC4);
  45.                 TIM_ITConfig(TIM_HARD, TIM_IT_CC4, ENABLE);        /* 使能CC4中断 */
  46.     }
  47.         else
  48.     {
  49.         return;
  50.     }
  51. }
复制代码
回复

使用道具 举报

4

主题

18

回帖

30

积分

新手上路

积分
30
发表于 2021-4-26 16:15:24 | 显示全部楼层
tanzhuolin 发表于 2021-4-26 15:36
大佬,我想请教一下这个微秒硬件定时器的问题,我看到bsp_StartHardTimer里面只是获取了计数器的值,然后 ...

抱歉抱歉,我看了资料以后明白了,V7的用户手册第35章有特别说明的,谢谢了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-18 07:44 , Processed in 0.299788 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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