Chinaunix首页 | 论坛 | 博客
  • 博客访问: 102844
  • 博文数量: 32
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 318
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-30 09:58
个人简介

经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂。 本人擅长 Ai、Fw、Fl、Br、Ps 等软件的安装卸载,精通 CSS、Java、PHP、C、C++、C#、Java、Ruby、Python、Objective-C等单词的拼写,熟悉 Windows、Linux、Mac、Android、iOS等系统的开关机 https://github.com/ianhom

文章分类

全部博文(32)

我的朋友

分类: C/C++

2015-03-11 13:57:18

基于KL25平台,已在FRDM-KL25Z开发板上验证。通过示波器测试出较准的1ms中断,提供16位的系统ms时钟,提供获取当前系统ms数,获取已延时ms数,执行固定ms数延时,执行固定s数延时。

使用方法:
            1、工程中添加模块中的.C和.H文件;
            2、将.H文件中注释的代码复制到工程中的isr.h中(或修改vectors.H文件中 VECTOR_044的宏定义为中断函数,此法不推荐);
            3、在系统初始化时使用Timer_Init()函数初始化。

KL25_Lpt_Time.c

点击(此处)折叠或打开

  1. /******************************************************************************
  2. * 文件名称:KL25_Lpt_Time.c
  3. * 内容摘要:LPTMR定时器软件模块
  4. * 其他说明:本软件模块适合于FRDM-KL25平台,用于提供ms的计时和延时,Sec的延时。
  5.             在工程中加载C文件及H文件,将H文件中需要增加到isr.h的内容复制过去,
  6.             在应用程序用Timer_Init()用于启动定时器
  7. * 当前版本:V1.00
  8. * 作 者:Ian
  9. * 完成日期:2015年3月11日
  10. ******************************************************************************/

  11. #include "common.h"
  12. #include "KL25_Lpt_Time.h"

  13. static WORD32 sg_dwSystime = 0; /* Global system time in ms */

  14. /*************************************************************************
  15. * 函数名称:WORD32 Timer_Init()
  16. * 功能说明:初始化计时器
  17. * 输入参数:无
  18. * 输出参数:无
  19. * 返 回 值:SW_ERROR: 操作失败
  20.             SW_OK 操作成功
  21. * 其它说明:无
  22. **************************************************************************/
  23. WORD32 Timer_Init()
  24. {
  25.     WORD32 dwData = 0; // For temp value of register

  26.     MCG_SC &= (~MCG_SC_FCRDIV_MASK); // Do this before set value of FCRDIV to evoid wrong masking
  27.     MCG_SC |= MCG_SC_FCRDIV(2); // We choose to divided clock by 4
  28.     MCG_C2 |= MCG_C2_IRCS_MASK; // And we choose the fast internal refenced clock(4MHz),
  29.                                              // So final clock is 1Mhz.
  30.     MCG_C1 |= MCG_C1_IRCLKEN_MASK; // Then turn on MCGIRCLK and it works even in stop mode
  31.     SIM_SCGC5 |= SIM_SCGC5_LPTMR_MASK; // Enable LPTMR software accessing

  32.     LPTMR0_CSR &= ~LPTMR_CSR_TEN_MASK; // Turn off LPTMR before LPTMR register configration
  33.     dwData |= (LPTMR_CSR_TIE_MASK\
  34.                   |LPTMR_CSR_TCF_MASK); // We do this to reduce operations of register to save time
  35.     LPTMR0_CSR = dwData; // In this case, we just operate register for once.
  36.     LPTMR0_PSR |= LPTMR_PSR_PBYP_MASK; // We do not need to divided the clock any more here
  37.     LPTMR0_PSR &= (~LPTMR_PSR_PCS_MASK); // Choose MCGIRCLK as the clock source (1MHz)
  38.     LPTMR0_CMR = (1025); // Then turn it as a period in 1ms

  39.     LPTMR0_CSR |= LPTMR_CSR_TEN_MASK; // After all, we turn on LPTMR and start counting
  40.     
  41.     NVIC_ICPR |= 1 << 28;
  42.     NVIC_ISER |= 1 << 28; // Enable interrupt
  43.     return SW_OK; // That is all
  44. }

  45. /*************************************************************************
  46. * 函数名称:void lpt_isr()
  47. * 功能说明:计时器中断处理函数,每毫秒中断一次,更新sg_Systime
  48. * 输入参数:无
  49. * 输出参数:无
  50. * 返 回 值:无
  51. * 其它说明:无
  52. **************************************************************************/
  53. void lpt_isr()
  54. {
  55.     LPTMR0_CSR |= LPTMR_CSR_TCF_MASK; /* Clear Int flag */
  56.     sg_dwSystime++; /* Update system time in ms */
  57. }

  58. /*************************************************************************
  59. * 函数名称:WORD16 App_GetSystemTime_ms()
  60. * 功能说明:获取当前毫秒数
  61. * 输入参数:无
  62. * 输出参数:无
  63. * 返 回 值:当前毫秒数 0~0xFFFF
  64. * 其它说明:无
  65. **************************************************************************/
  66. WORD16 App_GetSystemTime_ms()
  67. {
  68.     return (uint32)sg_dwSystime; /* Return system time in ms */
  69. }

  70. /*************************************************************************
  71. * 函数名称:WORD16 App_GetSystemDelay_ms(WORD16 wTime)
  72. * 功能说明:获取延时毫秒数
  73. * 输入参数:WORD16 wTime 0~0xFFFF 起始时间
  74. * 输出参数:无
  75. * 返 回 值:延时毫秒数 0~0xFFFF
  76. * 其它说明:无
  77. **************************************************************************/
  78. WORD16 App_GetSystemDelay_ms(WORD16 wTime)
  79. {
  80.     WORD16 wTemp = 0;
  81.     wTemp = App_GetSystemTime_ms(); /* Get current time in ms */
  82.     if (wTemp < wTime) /* Compare with old time */
  83.     {
  84.         wTemp = 0xFFFF - wTime + wTemp;
  85.     }
  86.     else
  87.     {
  88.         wTemp = wTemp - wTime;
  89.     }
  90.     return wTemp; /* Return the time delay */
  91. }

  92. /*************************************************************************
  93. * 函数名称:void Delay_ms(WORD16 wTime)
  94. * 功能说明:延时固定毫秒数
  95. * 输入参数:WORD16 wTime 0~0xFFFF 延时时间ms
  96. * 输出参数:无
  97. * 返 回 值:无
  98. * 其它说明:无
  99. **************************************************************************/
  100. void Delay_ms(WORD16 wTime)
  101. {
  102.     WORD16 wTemp;
  103.     wTemp = App_GetSystemTime_ms(); /* Get current time in ms */
  104.     while(1)
  105.     {
  106.         if(App_GetSystemDelay_ms(wTemp) >= wTime) /* If Delay time is over */
  107.         {
  108.             return;
  109.         }
  110.     }
  111. }

  112. /*************************************************************************
  113. * 函数名称:void Delay_s(WORD16 wTime)
  114. * 功能说明:延时固定秒数
  115. * 输入参数:WORD16 wTime 0~0xFFFF 延时时间s
  116. * 输出参数:无
  117. * 返 回 值:无
  118. * 其它说明:无
  119. **************************************************************************/
  120. void Delay_s(WORD16 wTime)
  121. {
  122.     WORD16 wTemp = 0;
  123.     while(1)
  124.     {
  125.         Delay_ms(1000); /* Wait 1000ms = 1s */
  126.         wTemp++; /* Plus 1s */
  127.         if(wTemp >= wTime) /* If delay time in s is over */
  128.         {
  129.             return;
  130.         }
  131.     }
  132. }
KL25_Lpt_Time.h

点击(此处)折叠或打开

  1. /******************************************************************************
  2. * 文件名称:KL25_Lpt_Time.h
  3. * 内容摘要:LPTMR定时器软件模块头文件
  4. * 其他说明:本软件模块适合于FRDM-KL25平台,用于提供ms的计时和延时,Sec的延时。
  5.             在工程中加载C文件及H文件,将H文件中需要增加到isr.h的内容复制过去,
  6.             在应用程序用Timer_Init()用于启动定时器
  7. * 当前版本:V1.00
  8. * 作 者:Ian
  9. * 完成日期:2015年3月11日
  10. ******************************************************************************/

  11. #ifndef __KL25_LPT_TIME_H_
  12. #define __KL25_LPT_TIME_H_

  13. typedef uint8_t BYTE;
  14. typedef uint16_t WORD16;
  15. typedef uint32_t WORD32;

  16. #define SW_ERR (-1)
  17. #define SW_OK 0

  18. /*************************************************************************
  19. * 函数名称:WORD32 Timer_Init()
  20. * 功能说明:初始化计时器
  21. * 输入参数:无
  22. * 输出参数:无
  23. * 返 回 值:SW_ERROR: 操作失败
  24.             SW_OK 操作成功
  25. * 其它说明:无
  26. **************************************************************************/
  27. WORD32 Timer_Init();

  28. /*************************************************************************
  29. * 函数名称:void lpt_isr()
  30. * 功能说明:计时器中断处理函数,每毫秒中断一次,更新sg_Systime
  31. * 输入参数:无
  32. * 输出参数:无
  33. * 返 回 值:无
  34. * 其它说明:无
  35. **************************************************************************/
  36. void lpt_isr();

  37. /*************************************************************************
  38. * 函数名称:WORD16 App_GetSystemTime_ms()
  39. * 功能说明:获取当前毫秒数
  40. * 输入参数:无
  41. * 输出参数:无
  42. * 返 回 值:当前毫秒数 0~0xFFFF
  43. * 其它说明:无
  44. **************************************************************************/
  45. WORD16 App_GetSystemTime_ms();

  46. /*************************************************************************
  47. * 函数名称:WORD16 App_GetSystemDelay_ms(WORD16 wTime)
  48. * 功能说明:获取延时毫秒数
  49. * 输入参数:WORD16 wTime 0~0xFFFF 起始时间
  50. * 输出参数:无
  51. * 返 回 值:延时毫秒数 0~0xFFFF
  52. * 其它说明:无
  53. **************************************************************************/
  54. WORD16 App_GetSystemDelay_ms(WORD16 wTime);

  55. /*************************************************************************
  56. * 函数名称:void Delay_ms(WORD16 wTime)
  57. * 功能说明:延时固定毫秒数
  58. * 输入参数:WORD16 wTime 0~0xFFFF 延时时间ms
  59. * 输出参数:无
  60. * 返 回 值:无
  61. * 其它说明:无
  62. **************************************************************************/
  63. void Delay_ms(WORD16 wTime);

  64. /*************************************************************************
  65. * 函数名称:void Delay_s(WORD16 wTime)
  66. * 功能说明:延时固定秒数
  67. * 输入参数:WORD16 wTime 0~0xFFFF 延时时间s
  68. * 输出参数:无
  69. * 返 回 值:无
  70. * 其它说明:无
  71. **************************************************************************/
  72. void Delay_s(WORD16 wTime);


  73. /* Copy follow to isr.h

  74. #undef VECTOR_044
  75. #define VECTOR_044 lpt_isr

  76. extern void lpt_isr(void);
  77. */

  78. #endif //__KL25_LPT_TIME_H_
  79. /* End of file */


KL25_LPT_TIME.rar

阅读(4141) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~

ianhom2015-09-06 10:52:31

获取ms延时的函数可以简化一下
WORD16 App_GetSystemDelay_ms(WORD16 wTime)
{
    WORD16 wTemp = 0;

    wTemp = sg_dwSystime - wTime;

    return wTemp; /* Return the time delay */
}