查看: 1396|回复: 0

[分享] 【MCX先手尝鲜】体验定时器点灯

[复制链接]
  • TA的每日心情
    开心
    5 小时前
  • 签到天数: 528 天

    连续签到: 23 天

    [LV.9]以坛为家II

    21

    主题

    854

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2317
    最后登录
    2025-7-27
    发表于 2024-1-24 18:43:17 | 显示全部楼层 |阅读模式
    请叫我点灯小菜鸟吧。前面用延时来实现了对RGB灯的控制,今天我继续点灯。
    MCX的定时器是最基础的外设之一,定时器有着许许多的功能,其实让他点灯,简单是天大的浪费,但是点灯是最好的检验手段。如果你用单片机会一百种点灯,那你的就是大师了,如果你有1000+的点灯方式,估计你就是点灯大神!
    经过学习定时器例程,(例程为:SDK_2_13_1_MCX-N9XX-BRK\boards\mcxn9xxbrk\driver_examples\lptmr\cm33_core0)
    我总结了一下,定时器的配置与开启为以下几步:
    1、先定义一下,我们需要定时器多少时间溢出,以us为单位,在fsl_lptmr.c中有这样的换算:
    1. /*! Macro to convert a microsecond period to raw count value 宏定义将微秒转换为计数器的预装值ARR*/
    2. #define USEC_TO_COUNT(us, clockFreqInHz) (uint64_t)(((uint64_t)(us) * (clockFreqInHz)) / 1000000U)
    复制代码
    例程中用宏定义了#define LPTMR_USEC_COUNT   1000000  
    即1秒定期器溢出。
    2、配置定时器,分为四步,第一是将定义一个定时器结构体,lptmr_config_t lptmrConfig;
    二是将时器结构体恢复初值即:LPTMR_GetDefaultConfig(&lptmrConfig);  三是将恢复黙认值的数据写入到定时器寄存器中:LPTMR_Init(DEMO_LPTMR_BASE, &lptmrConfig); 四是配置定时器溢出值:LPTMR_SetTimerPeriod(DEMO_LPTMR_BASE, USEC_TO_COUNT(LPTMR_USEC_COUNT, LPTMR_SOURCE_CLOCK));
    3、使能定时器中断,中断中好实现对LED灯的操作。
    /* Enable timer interrupt */
        LPTMR_EnableInterrupts(DEMO_LPTMR_BASE, kLPTMR_TimerInterruptEnable);

        /* Enable at the NVIC */
        EnableIRQ(DEMO_LPTMR_IRQn);

    4、开启定时器:
        /* Start counting */
        LPTMR_StartTimer(DEMO_LPTMR_BASE);


    定时器中断函数,在汇编中已经实现了弱函数    .weak LPTMR0_IRQHandler,我们需要对他进行重写。

    1. void LPTMR_LED_HANDLER(void)  //开开头,使用宏定义进行了转换即:#define LPTMR_LED_HANDLER  LPTMR0_IRQHandler
    2. {
    3.     LPTMR_ClearStatusFlags(DEMO_LPTMR_BASE, kLPTMR_TimerCompareFlag);
    4.     lptmrCounter++;
    5.     LED_TOGGLE();
    6.     /*
    7.      * Workaround for TWR-KV58: because write buffer is enabled, adding
    8.      * memory barrier instructions to make sure clearing interrupt flag completed
    9.      * before go out ISR
    10.      */
    11.     __DSB();
    12.     __ISB();
    13. }
    复制代码
    在中断函数中,首先清除中断,对计数值进行递加,然后进行LED的翻转,最后DSB ISB是NXP的特有操作吧,先不解释。
    在主函数中获取最新的计数据,然后打印出来。
    烧写示例后,实现了对LED的1秒钟翻转一次:

    哎...今天够累的,签到来了~
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-7-27 12:25 , Processed in 0.079735 second(s), 19 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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