查看: 5869|回复: 1

[分享] LPC54110学习+再看Systick中断

[复制链接]
  • TA的每日心情
    开心
    2018-7-23 21:04
  • 签到天数: 103 天

    连续签到: 1 天

    [LV.6]常住居民II

    228

    主题

    5379

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    16849
    最后登录
    1970-1-1
    发表于 2017-4-8 12:50:14 | 显示全部楼层 |阅读模式
    本帖最后由 lkl0305 于 2017-4-8 12:51 编辑

    在CM4内核的systick时钟源可以选择,而且可以设置分频,以降低systick的计数时钟,进而能够定时更长时间。
    这一次做个练习,将systick时钟的分频系数改为48后完成之前的功能。
    可参见上一帖子:LPC54110学习+Systick中断
    QQ截图20170407214053.png
    在始终配置工具中可以选择时钟及配置分频。
    QQ截图20170407112140.png
    如下图,设置成1MHz时钟,但系统时钟还是48MHz。
    QQ截图20170407222950.png
    更改后的时钟。
    QQ截图20170407223010.png
    可以看到工程生成的时钟配置文件的相关代码。
    QQ截图20170408124403.png
    由于默认的systick配置函数时钟选择是不可分频的。
    QQ截图20170408113622.png
    我们可以重写这个函数,当然也可已调用此函数后再修改。
    QQ截图20170408123339.png
    关闭系统默认的systick函数。
    QQ截图20170408123357.png
    自己重新编写函数,主要是修改时钟源。
    QQ截图20170408123417.png
    调用自己的时钟配置函数。
    QQ截图20170408123452.png
    systick中断函数,和之前的一致。
    QQ截图20170407213410.png
    完整的代码:
    1. /**
    2. * This is template for main module created by MCUXpresso Project Generator. Enjoy!
    3. **/

    4. #include "board.h"
    5. #include "pin_mux.h"
    6. #include "clock_config.h"

    7. #include "fsl_gpio.h"

    8. __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
    9. {
    10.   if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)
    11.   {
    12.     return (1UL);                                                   /* Reload value impossible */
    13.   }

    14.   SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         /* set reload register */
    15.   NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */
    16.   SysTick->VAL   = 0UL;                                             /* Load the SysTick Counter Value */
    17.   SysTick->CTRL  = (~SysTick_CTRL_CLKSOURCE_Msk) & (
    18.                    SysTick_CTRL_TICKINT_Msk   |
    19.                    SysTick_CTRL_ENABLE_Msk);                         /* Enable SysTick IRQ and SysTick Timer */
    20.   return (0UL);                                                     /* Function successful */
    21. }


    22. void SysTick_Handler(void) {
    23.   static uint32_t count = 0;
    24.   count++;
    25.   if (count >= 100) {
    26.     count = 0;
    27.     GPIO_TogglePinsOutput(BOARD_INITPINS_LED0_GPIO, BOARD_INITPINS_LED0_PORT, 1U << BOARD_INITPINS_LED0_GPIO_PIN);
    28.   }
    29. }

    30. /*!
    31. * @brief Application entry point.
    32. */
    33. int main(void) {
    34.   /* Init board hardware. */
    35.   BOARD_InitBootPins();
    36.   BOARD_InitBootClocks();
    37.   BOARD_InitDebugConsole();
    38. #ifdef SDK_PRIMARY_CORE
    39.   BOARD_StartSecondaryCore();
    40. #endif

    41.   /* Add your code here */
    42.   CLOCK_EnableClock(kCLOCK_Gpio0);
    43.   
    44.   gpio_pin_config_t led0Config = {
    45.     kGPIO_DigitalOutput,
    46.     0,
    47.   };
    48.   
    49.   GPIO_PinInit(BOARD_INITPINS_LED0_GPIO, BOARD_INITPINS_LED0_PORT, BOARD_INITPINS_LED0_GPIO_PIN, &led0Config);
    50.   
    51.   SysTick_Config(MSEC_TO_COUNT(10, CLOCK_GetFreq(kCLOCK_CoreSysClk) / 48));

    52.   for(;;) { /* Infinite loop to avoid leaving the main function */
    53.     __asm("NOP"); /* something to use as a breakpoint stop while looping */
    54.   }
    55. }
    复制代码
    再次编译下载,效果如前。
    QQ截图20170407213120.png

    完整的工程文件:
    LED0_Toggle_SysTick_Div48_MCUXpressoIDE_Project_cm4.rar (4.71 MB, 下载次数: 6)
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    2

    帖子

    0

    新手上路

    Rank: 1

    积分
    6
    最后登录
    2018-10-25
    发表于 2018-10-25 16:46:28 | 显示全部楼层
    谢谢分享
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-8-30 05:09 , Processed in 0.091573 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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