查看: 2590|回复: 5

[求助] KL46的PIT定时中断 熟悉底层代码的大神请进

[复制链接]

该用户从未签到

1

主题

2

帖子

0

新手上路

Rank: 1

积分
7
最后登录
2015-11-13
发表于 2015-11-13 10:36:20 | 显示全部楼层 |阅读模式
在做智能车的测试题,相用两个定时器pit0和pit1,这样的话稳定一点。但是两个定时器用的是一个中断向量,所以需要在中断函数里判断中断标志,有没有大神知道如何判断呢?        小弟新手上路,跪求大神帮忙。

我知道答案 目前已有5人回答
回复

使用道具 举报

该用户从未签到

124

主题

3600

帖子

0

金牌会员

Rank: 6Rank: 6

积分
5781
最后登录
1970-1-1
发表于 2015-11-13 10:41:23 | 显示全部楼层
在KL46中,PIT0与PIT1都有对应的PIT_TFLGn寄存器,TIF就是它们所对应的中断标志。 2015-11-13_10-39-47.jpg
回复 支持 反对

使用道具 举报

该用户从未签到

27

主题

320

帖子

0

中级会员

Rank: 3Rank: 3

积分
484
最后登录
2016-3-28
发表于 2015-11-13 11:51:15 | 显示全部楼层
楼主可参考示例:\KSDK_1.3.0\examples\frdmkl46z\driver_examples\pit中fsl_pit_irq.c

  1. #include <stdlib.h>
  2. #include <assert.h>
  3. #include "fsl_pit_driver.h"
  4. #include "fsl_clock_manager.h"

  5. /*******************************************************************************
  6. * Variables
  7. ******************************************************************************/
  8. extern volatile bool pitIsrFlag[2];
  9. /*******************************************************************************
  10. * Code
  11. ******************************************************************************/

  12. /*!
  13. * @brief System default IRQ handler defined in startup code.
  14. */
  15. #if FSL_FEATURE_PIT_HAS_SHARED_IRQ_HANDLER
  16. #if defined(KM34Z7_SERIES)
  17. void PIT0_PIT1_IRQHandler(void)
  18. {
  19.     uint32_t i;
  20.     for(i=0; i < PIT_INSTANCE_COUNT; i++)
  21.     {
  22.         if (CLOCK_SYS_GetPitGateCmd(i))
  23.         {
  24.             for(i=0; i < FSL_FEATURE_PIT_TIMER_COUNT; i++)
  25.             {
  26.                 if (PIT_HAL_IsIntPending(g_pitBase[0], i))
  27.                 {
  28.                     /* Clear interrupt flag.*/
  29.                     PIT_HAL_ClearIntFlag(g_pitBase[0], i);
  30.                     pitIsrFlag[i] = true;
  31.                 }
  32.             }
  33.         }
  34.     }
  35. }
  36. #else
  37. void PIT_IRQHandler(void)
  38. {
  39.     uint32_t i;
  40.     for(i=0; i < 2; i++)  // We only support two channels for pit example
  41.     {
  42.         if (PIT_HAL_IsIntPending(g_pitBase[0], i))
  43.         {
  44.             /* Clear interrupt flag.*/
  45.             PIT_HAL_ClearIntFlag(g_pitBase[0], i);
  46.             pitIsrFlag[i] = true;
  47.         }
  48.     }
  49. }
  50. #endif
  51. #else

  52. #if (FSL_FEATURE_PIT_TIMER_COUNT > 0U)
  53. void PIT0_IRQHandler(void)
  54. {
  55.     /* Clear interrupt flag.*/
  56.     PIT_HAL_ClearIntFlag(g_pitBase[0], 0U);
  57.     pitIsrFlag[0] = true;
  58. }
  59. #endif

  60. #if (FSL_FEATURE_PIT_TIMER_COUNT > 1U)
  61. void PIT1_IRQHandler(void)
  62. {
  63.     /* Clear interrupt flag.*/
  64.     PIT_HAL_ClearIntFlag(g_pitBase[0], 1U);
  65.     pitIsrFlag[1] = true;
  66. }
  67. #endif

  68. #endif /* FSL_FEATURE_PIT_HAS_SHARED_IRQ_HANDLER */

  69. /*! @} */
复制代码
回复 支持 反对

使用道具 举报

该用户从未签到

27

主题

320

帖子

0

中级会员

Rank: 3Rank: 3

积分
484
最后登录
2016-3-28
发表于 2015-11-13 11:55:09 | 显示全部楼层
相关结构定义:
  1. /** PIT - Register Layout Typedef */
  2. typedef struct {
  3.   __IO uint32_t MCR;                               /**< PIT Module Control Register, offset: 0x0 */
  4.        uint8_t RESERVED_0[220];
  5.   __I  uint32_t LTMR64H;                           /**< PIT Upper Lifetime Timer Register, offset: 0xE0 */
  6.   __I  uint32_t LTMR64L;                           /**< PIT Lower Lifetime Timer Register, offset: 0xE4 */
  7.        uint8_t RESERVED_1[24];
  8.   struct {                                         /* offset: 0x100, array step: 0x10 */
  9.     __IO uint32_t LDVAL;                             /**< Timer Load Value Register, array offset: 0x100, array step: 0x10 */
  10.     __I  uint32_t CVAL;                              /**< Current Timer Value Register, array offset: 0x104, array step: 0x10 */
  11.     __IO uint32_t TCTRL;                             /**< Timer Control Register, array offset: 0x108, array step: 0x10 */
  12.     __IO uint32_t TFLG;                              /**< Timer Flag Register, array offset: 0x10C, array step: 0x10 */
  13.   } CHANNEL[2];
  14. } PIT_Type, *PIT_MemMapPtr;


  15. #define PIT_TFLG_REG(base,index)                 ((base)->CHANNEL[index].TFLG)

  16. /*!
  17. * @brief Reads the current timer timeout flag.
  18. *
  19. * Every time the timer counts to 0, this flag is set.
  20. *
  21. * @param base Base address for current PIT instance.
  22. * @param channel Timer channel number
  23. * @return Current status of the timeout flag
  24. *         - true:  Timeout has occurred.
  25. *         - false: Timeout has not yet occurred.
  26. */
  27. static inline bool PIT_HAL_IsIntPending(PIT_Type * base, uint32_t channel)
  28. {
  29.     assert(channel < FSL_FEATURE_PIT_TIMER_COUNT);
  30.     return PIT_RD_TFLG(base, channel);
  31. }
复制代码
回复 支持 反对

使用道具 举报

该用户从未签到

61

主题

965

帖子

0

金牌会员

Rank: 6Rank: 6

积分
2394
最后登录
1970-1-1
发表于 2015-11-13 12:54:18 | 显示全部楼层
楼上说的很详细,看数据手册
回复 支持 反对

使用道具 举报

  • TA的每日心情
    开心
    2018-7-2 06:04
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    59

    主题

    2888

    帖子

    10

    金牌会员

    Rank: 6Rank: 6

    积分
    6020
    最后登录
    2020-9-28
    发表于 2015-11-13 13:52:14 | 显示全部楼层
    如ZP所述,在中断函数里查询PIT_TFLG0和PIT_TFLG1寄存器的TIF位即可。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-26 22:44 , Processed in 0.094918 second(s), 27 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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