查看: 2944|回复: 1

【赚周年币】技术帖Week2-Day5——LPC824 Lite之12、SCTimer延时

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

    连续签到: 76 天

    [LV.Master]伴坛终老

    发表于 2017-1-12 23:14:55 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 toofree 于 2017-1-19 03:27 编辑

            【赚周年币】技术帖Week2-Day5——LPC824 Lite之12、SCTimer定时器延时

            LPC824延时之——最后一种延时,SCTimer定时器延时。软件精确延时,SysTick延时都实验过了。今天就来测试一下最后一种延时SCTimer定时器延时,也算是对LPC824延时篇做个了结。

            使用YL-LPC824光盘资料.rar中程序模板,工程“YL-LPC824光盘资料\SDK\peri_example\sctimer\sct_basic\project_sct_basic.uvoptx”做模板,修改部分程序实现SCTimer定时器延时。
            复制工程文件夹,改名为“sct_basic_Delay”,不改变原有工程,给自己留点余地,省得万一哪有问题,还得重新解压光盘资料。
             傲游截图20170112230128.jpg

            不管三七二十一,先编译,仿真运行下,看看什么效果。结果是板上LED1、LED3交替点亮,熄灭。
            那么分析一下程序看看。可以看到,用了两个中断,SysTick_Handler()、SCT_IRQHandler()。
             傲游截图20170112230737.jpg
          
            86行程序执行后,将获取到“SystemCoreClock”。
             傲游截图20170112230940.jpg

            那么SystemCoreClock值是多少呢,我们今天就不分析代码了,直接仿真执行一下,观察变量值是多少。
             傲游截图20170112235511.jpg
             没错,SystemCoreClock是30M。

            90行初始化SysTick,并开启中断。
             傲游截图20170112235757.jpg
            
            94到126行为初始化SCTimer定时器,并开启中断。我们只关心3行代码。
            99行,Chip_SCT_Config(LPC_SCT, SCT_CONFIG_32BIT_COUNTER | SCT_CONFIG_CLKMODE_BUSCLK);,表示32位计数方式。
            105、107行,Chip_SCT_SetMatchCount(LPC_SCT, SCT_MATCH_0, SystemCoreClock / TICKRATE_HZ);,设置计数匹配值和重加载,反正就是指定时周期呗。

            我们还是定时1ms,以1ms为单位进行延时。直接复制前一贴中的延时子函数,及中断处理中的代码。
            TICKRATE_HZ改成两个独立的宏,TICKRATE_HZ_STK和TICKRATE_HZ_SCT。
            做两个Delay()函数,分别叫Delay_Stk()、Delay_Sct()。
            当然TimingDelay与是两个,TimingDelayStk,TimingDelaySct。
            最终修改代码如下:
    1. #include "board.h"
    2. /*****************************************************************************
    3. * Private types/enumerations/variables
    4. ****************************************************************************/

    5. //#define TICKRATE_HZ (10)        /* 10 ticks per second */
    6. #define TICKRATE_HZ_STK (1000)        /* 1000 ticks per second */
    7. #define TICKRATE_HZ_SCT (1000)        /* 1000 ticks per second */
    8. static __IO uint32_t TimingDelayStk;
    9. static __IO uint32_t TimingDelaySct;

    10. void Delay_Stk(__IO uint32_t nTime);
    11. void Delay_Sct(__IO uint32_t nTime);

    12. static volatile uint32_t ticks;

    13. /*****************************************************************************
    14. * Public types/enumerations/variables
    15. ****************************************************************************/

    16. /*****************************************************************************
    17. * Private functions
    18. ****************************************************************************/

    19. /*****************************************************************************
    20. * Public functions
    21. ****************************************************************************/

    22. /**
    23. * @brief        Handle interrupt from SysTick timer
    24. * @return        Nothing
    25. */
    26. void SysTick_Handler(void)
    27. {
    28.         if (TimingDelayStk > 0)
    29.                 TimingDelayStk--;
    30. }

    31. /**
    32. * @brief        Handle interrupt from State Configurable Timer
    33. * @return        Nothing
    34. */
    35. void SCT_IRQHandler(void)
    36. {
    37.         /* Clear the SCT Event 0 Interrupt */
    38.         Chip_SCT_ClearEventFlag(LPC_SCT, SCT_EVT_0);
    39.         if (TimingDelaySct > 0)
    40.                 TimingDelaySct--;
    41. }

    42. /**
    43. * @brief        Application main program
    44. * @return        Nothing (This function will not return)
    45. */
    46. int main(void)
    47. {
    48.         /* Generic Initialization */
    49.          SystemCoreClockUpdate();
    50.         Board_Init();

    51.         /* Enable SysTick Timer */
    52.         SysTick_Config(SystemCoreClock / TICKRATE_HZ_STK);

    53.         /* Custom Initialization */

    54.         /* Initialize the SCT clock and reset the SCT */
    55.         Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_SCT);
    56.         Chip_SYSCTL_PeriphReset(RESET_SCT);

    57.         /* Configure the SCT counter as a unified (32 bit) counter using the bus clock */
    58.         Chip_SCT_Config(LPC_SCT, SCT_CONFIG_32BIT_COUNTER | SCT_CONFIG_CLKMODE_BUSCLK);

    59.         /* The match/capture REGMODE defaults to match mode */
    60.         /* No REGMODE changes are needed for this program   */

    61.         /* Set the match count for match register 0 */
    62.         Chip_SCT_SetMatchCount(LPC_SCT, SCT_MATCH_0, SystemCoreClock / TICKRATE_HZ_SCT);

    63.         /* Set the match reload value for match reload register 0*/
    64.         Chip_SCT_SetMatchReload(LPC_SCT, SCT_MATCH_0, SystemCoreClock / TICKRATE_HZ_SCT);

    65.         /* Event 0 only happens on a match condition */
    66.         LPC_SCT->EV[0].CTRL = (1 << 12);

    67.         /* Event 0 only happens in state 0 */
    68.         LPC_SCT->EV[0].STATE = 0x00000001;

    69.         /* Event 0 is used as the counter limit */
    70.         LPC_SCT->LIMIT_U = 0x00000001;

    71.         /* Enable flag to request an interrupt for Event 0 */
    72.         Chip_SCT_EnableEventInt(LPC_SCT, SCT_EVT_0);

    73.         /* Enable the interrupt for the SCT */
    74.         NVIC_EnableIRQ(SCT_IRQn);

    75.         /* Start the SCT counter by clearing Halt_L in the SCT control register */
    76.         Chip_SCT_ClearControl(LPC_SCT, SCT_CTRL_HALT_L);
    77.         
    78.         TimingDelayStk = 0;
    79.         TimingDelaySct = 0;
    80.         Board_LED_Set(0,true);
    81.         Board_LED_Set(2,false);

    82.         while (1) {
    83.                 //__WFI();
    84.                 Board_LED_Toggle(0);
    85.                 Delay_Stk(500);
    86.                
    87.                 Board_LED_Toggle(2);
    88.                 Delay_Sct(500);
    89.                
    90.         }
    91. }

    92. void Delay_Stk(__IO uint32_t nTime)
    93. {
    94.   TimingDelayStk = nTime;
    95.    
    96.   while(TimingDelaySct != 0)
    97.   {
    98.   }        
    99. }
    100. void Delay_Sct(__IO uint32_t nTime)
    101. {
    102.   TimingDelaySct = nTime;
    103.    
    104.   while(TimingDelaySct != 0)
    105.   {
    106.   }        
    107. }
    复制代码
    SysTick和SCTimer定时同时使用,最终实验现象是LED1和LED3交替点亮、熄灭,频率1Hz。

           为方便测试,同时打包上传。
           main_sct_basic.rar (1.85 KB, 下载次数: 4)

    评分

    参与人数 2 +60 收起 理由
    EEboard爱板网 + 45 3周发帖养成记 奖励
    loveeeboard + 15

    查看全部评分

    回复

    使用道具 举报

    该用户从未签到

    发表于 2018-9-20 14:27:48 | 显示全部楼层
    写的通俗易懂 学习了,
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-4-25 18:21 , Processed in 0.160093 second(s), 28 queries , MemCache On.

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

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.