查看: 2410|回复: 0

[原创] 【LPC11U68开发板】+ 5、TIMER定时器的使用

[复制链接]
  • TA的每日心情
    开心
    4 天前
  • 签到天数: 1319 天

    [LV.10]以坛为家III

    124

    主题

    2833

    帖子

    31

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    7578
    最后登录
    2024-5-5
    发表于 2018-11-21 14:28:30 | 显示全部楼层 |阅读模式
    本帖最后由 TLLED 于 2018-11-21 14:28 编辑

            16位TIMER的使用,通过定时器中断取反LED指示灯,来学习定时器的使用。


        一、硬件部分


            驱动红色LED。
             102.png

        二、软件部分
       
            2.1、定时器初始化
          
    1. #define TICKRATE_HZ1 (1)/* 1 ticks per second */
    2. #define TICKRATE_HZ2 (2)/* 2 ticks per second */
    3. #define PRESCALE_HZ2 (0xFFFF)        /* 16-bit prescale count */

    4. void TIMER16_Init(void)
    5. {
    6.         uint32_t timerFreq;
    7.        
    8.         Chip_TIMER_Init(LPC_TIMER16_0);                                                                                //使能16位定时器0时钟
    9.         timerFreq = Chip_Clock_GetSystemClockRate();                        //获取系统时钟
    10.         //printf("timerFreq== %d \r\n",timerFreq);                                  //48000000
    11.         Chip_TIMER_Reset(LPC_TIMER16_0);                                                                        //复位定时器0
    12.         Chip_TIMER_MatchEnableInt(LPC_TIMER16_0, 1);                        //使能比较中断
    13.         Chip_TIMER_PrescaleSet(LPC_TIMER16_0, PRESCALE_HZ2);                //预分频值
    14.         Chip_TIMER_SetMatch(LPC_TIMER16_0, 1, (timerFreq / TICKRATE_HZ2) >> 16);                        //设置比较值
    15.         //printf("timerFreq / TICKRATE_HZ2== %d \r\n",(timerFreq / TICKRATE_HZ2)>>16);  //48000000
    16.         Chip_TIMER_ResetOnMatchEnable(LPC_TIMER16_0, 1);
    17.         Chip_TIMER_Enable(LPC_TIMER16_0);
    18.         NVIC_ClearPendingIRQ(TIMER_16_0_IRQn);                                                //清除中断标志位
    19.         NVIC_EnableIRQ(TIMER_16_0_IRQn);                                                                        //使能外部中断
    20. }
    复制代码

            2.2、定时器中断
            
    1. void TIMER16_0_IRQHandler(void)
    2. {
    3.         if (Chip_TIMER_MatchPending(LPC_TIMER16_0, 1))
    4.         {
    5.                 Chip_TIMER_ClearMatch(LPC_TIMER16_0, 1);
    6.                 //Board_LED_Toggle(1);
    7.                 if(i==0)
    8.                 {
    9.                         i=1;
    10.                         LED_RED(1);
    11.                 }
    12.                 else
    13.                 {
    14.                         i=0;
    15.                         LED_RED(0);
    16.                 }
    17.                
    18.         }
    19. }
    复制代码


            2.3、主程序
            
    1. int main(void)
    2. {
    3.         unsigned int cn=0;
    4.         unsigned char ts=0;
    5.         SystemCoreClockUpdate();
    6.         Board_Init();
    7.         LED_Init();
    8.         TIMER16_Init();

    9.         while (1)
    10.         {
    11.         }

    12.         return 0;
    13. }
    复制代码

            2.4、代码分析           
               a、获取时钟频率 48000000
                timerFreq = Chip_Clock_GetSystemClockRate();        //获取系统时钟频率
               b、设置分频值 65535
                 Chip_TIMER_PrescaleSet(LPC_TIMER16_0, PRESCALE_HZ2);        //预分频值   0xffff==65535
               分频以后的时钟=48000000/65535=732.4
               c、设置比较值  
                 Chip_TIMER_SetMatch(LPC_TIMER16_0, 1, (timerFreq / TICKRATE_HZ2) >> 16);        //设置比较值

               比较值=(48000000/2)>>16   == 366.22
               d、进中断时间
               T=(1/732.4)*366=0.4997s == 499.7ms


        三、程序执行结果
            
            3.1、板子上红色LED灯闪烁
            3.2、红色LED灯上的波形
             F0002TEK.png      














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

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-5-9 06:49 , Processed in 0.096517 second(s), 19 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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