Kinetis单片机K64F开发笔记:PIT中断定时器

Kinetis单片机K64F开发笔记:PIT中断定时器

概述

一个单片机程序,从本质上讲,都可以归结为对GPIOh和定时器的操作,也就是说,单片机就是按照一定周期执行特定操作的器件,因此学习单片机,学会GPIO操作后,应该学习一种定时器。对于Kinetis器件,具有很多种定时器,包括FlexTimer Module (FTM),Periodic Interrupt Timer (PIT),Low-Power Timer (LPTMR)还有系统定时器等等,其中PIT最简单,所有先从这里下手。

官方例程

官方例程中,pit.c包含了PIT操作的主要步骤和函数。

void PIT_LED_HANDLER(void)
{
    /* 清除中断标志位*/
    PIT_ClearStatusFlags(PIT, kPIT_Chnl_0, kPIT_TimerFlag);
    pitIsrFlag = true;
    /* 添加DSB指令,防止重复进入中断*/
    __DSB();
}

/*!
 * @brief 主函数
 */
int main(void)
{
    /* PIT配置 */
    pit_config_t pitConfig;

    /* Board pin, clock, debug console init */
    BOARD_InitPins();
    BOARD_BootClockRUN();
    BOARD_InitDebugConsole();

    /* Initialize and enable LED */
    LED_INIT();

    /*
     * pitConfig.enableRunInDebug = false;
     */
    PIT_GetDefaultConfig(&pitConfig);

    /* pit模块初始化 */
    PIT_Init(PIT, &pitConfig);

    /* 设置通道0的周期 */
    PIT_SetTimerPeriod(PIT, kPIT_Chnl_0, USEC_TO_COUNT(1000000U, PIT_SOURCE_CLOCK));

    /* 使能通道0中断 */
    PIT_EnableInterrupts(PIT, kPIT_Chnl_0, kPIT_TimerInterruptEnable);

    /* NVIC中使能中断 */
    EnableIRQ(PIT_IRQ_ID);

    /* 启动定时器 通道 0 */
    PRINTF("\r\nStarting channel No.0 ...");
    PIT_StartTimer(PIT, kPIT_Chnl_0);

    while (true)
    {
        /* 中断时点亮LED指示灯 */
        if (true == pitIsrFlag)
        {
            PRINTF("\r\n Channel No.0 interrupt is occurred !");
            LED_TOGGLE();
            pitIsrFlag = false;
        }
    }
}

详见注释。

使用配置工具操作PIT

打开MCUXpresso IDE的外设配置工具。(USB符号图标)
在这里插入图片描述按照下图,在左侧勾选PIT选择框
在这里插入图片描述在中间按照提示,选择PIT配置,这里设置中断时间间隔为1S,然后点击“更新源代码”,工程中会添加peripherals.h和peripherals.c两个配置文件。打开文件peripherals.c文件,发现pit的配置工作已经做好了。

const pit_config_t PIT_config = {
  .enableRunInDebug = false
};

static void PIT_init(void) {
  /* Initialize the PIT. */
  PIT_Init(PIT_PERIPHERAL, &PIT_config);
  /* Set channel 0 period to 1 s (60000000 ticks). */
  PIT_SetTimerPeriod(PIT_PERIPHERAL, PIT_CHANNEL_0, PIT_CHANNEL_0_TICKS);
  /* Enable interrupts from channel 0. */
  PIT_EnableInterrupts(PIT_PERIPHERAL, PIT_CHANNEL_0, kPIT_TimerInterruptEnable);
  /* Enable interrupt PIT_CHANNEL_0_IRQN request in the NVIC */
  EnableIRQ(PIT_CHANNEL_0_IRQN);
  /* Start channel 0. */
  PIT_StartTimer(PIT_PERIPHERAL, PIT_CHANNEL_0);
}

但是中断处理函数没有生成,需要从这里获得
在这里插入图片描述代码如下:

/* PIT0_IRQn interrupt handler */
void PIT_CHANNEL_0_IRQHANDLER(void) {
  uint32_t intStatus;
  /* Reading all interrupt flags of status register */
  intStatus = PIT_GetStatusFlags(PIT_PERIPHERAL, PIT_CHANNEL_0);
  PIT_ClearStatusFlags(PIT_PERIPHERAL, PIT_CHANNEL_0, intStatus);

  /* Place your code here */

  /* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F
     Store immediate overlapping exception return operation might vector to incorrect interrupt. */
  #if defined __CORTEX_M && (__CORTEX_M == 4U)
    __DSB();
  #endif
}

好了,到此为止,我们一行代码也没敲,pit代码就准备好了。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值