查看: 351|回复: 0

[评测分享] 【Avnet | NXP FRDM-MCXN947试用活动】非阻塞式点灯

[复制链接]
  • TA的每日心情
    开心
    2023-7-5 11:08
  • 签到天数: 120 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2024-11-17 21:45:19 | 显示全部楼层 |阅读模式
    分享到:
           在上一章节中,我们采用的是阻塞式方法来实现点灯的功能,即在延时期间程序只能停滞不前,依赖于在while循环中插入延时操作。这种阻塞式的循环灯实现方式,主要适用于点灯这类基础操作。然而,其对系统实时性的影响颇为显著,不够理想。本章节,我们将引入定时器的方式来实现循环灯操作。通过定时器达到预设时间后,再执行相应的操作。定时器定时功能展现出多方面的优势:首要的是定时精准度高,相较于我们之前看似精准实则存在较大偏差的延时方法,定时器能够实现更为精确的定时控制,无需繁琐的调整即可达到理想效果;其次,定时器在定时时间到达后,是在中断中处理任务内容,这赋予了其更高的优先级,进一步提升了系统的响应速度和稳定性。
           接下来我们就实现循环点亮LED(定时器,循环间隔500mms)。
           使用配置工具添加外设——LPTMR:
    1.png

           并配置为基础定时器功能(10ms):
    2.png

           上图的“复制到剪贴板”有没有看到,这也是官方IDE的一个小细节,我们直接可以把中断回调函数复制过去,非常的方便:
    1. /* LPTMR0_IRQn interrupt handler */
    2. void LPTMR0_IRQHANDLER(void) {
    3.   uint32_t intStatus;
    4.   /* Reading all interrupt flags of status register */
    5.   intStatus = LPTMR_GetStatusFlags(LPTMR0_PERIPHERAL);
    6.   LPTMR_ClearStatusFlags(LPTMR0_PERIPHERAL, intStatus);

    7.   /* Place your code here */

    8.   /* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F
    9.      Store immediate overlapping exception return operation might vector to incorrect interrupt. */
    10.   #if defined __CORTEX_M && (__CORTEX_M == 4U)
    11.     __DSB();
    12.   #endif
    13. }
    复制代码
          上述只是一个例程,我们在其中进行修改就可以了,最后如下:
    1. void LPTMR0_IRQHANDLER(void) {
    2.   uint32_t intStatus;
    3.   /* Reading all interrupt flags of status register */
    4.   LPTMR_ClearStatusFlags(LPTMR0_PERIPHERAL, kLPTMR_TimerCompareFlag);
    5.   cnt++;
    6.   if(cnt >= 50)
    7.   {
    8.       cnt = 0;
    9.       LED_state++;
    10.   }

    11.   /* Place your code here */

    12.   /* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F
    13.      Store immediate overlapping exception return operation might vector to incorrect interrupt. */
    14.   #if defined __CORTEX_M && (__CORTEX_M == 4U)
    15.     __DSB();
    16.   #endif
    17. }
    复制代码
          这样就可以是先定时器的定时初始化以及中断响应了,这里有一些地方需要注意,相关的外设初始化是在peripherals.c和peripherals.h,我们需要再主程序中调用相关的初始化函数BOARD_InitBootPeripherals(void),生成的初始化代码并没有在这里进行更新:
    3.png

           这样就实现了和上一章节一样的功能,不过这种定时器的方法实时性会更好,为了区分这次定时为500ms进行变换,效果如下:
    1 (1) (1).gif
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

    手机版|小黑屋|与非网

    GMT+8, 2024-12-24 01:53 , Processed in 0.108769 second(s), 16 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.