查看: 3676|回复: 0

[MPC] 【MPC5602开发笔记】PIT 轮询方式

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

    连续签到: 1 天

    [LV.6]常住居民II

    228

    主题

    5379

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    16697
    最后登录
    1970-1-1
    发表于 2016-2-29 23:55:38 | 显示全部楼层 |阅读模式
    本帖最后由 lkl0305 于 2016-3-1 00:13 编辑

    接着给大家分享MPC5602的学习笔记,今天给大家分享一个PIT模块的基本使用,PIT其实就是一个基本定时器。
    暂不使用中断方式,中断的工程比较麻烦一些,整理好了再给大家分享,今天分享轮询方式,先了解一下这个模块的基本使用。

    1、实现功能
    使用PIT实现一个延时程序,比之前的软件延时要准确一些,那就实现一个周期1秒的LED闪烁现象吧。

    2、电路和之前的一样
    0060.png

    3、相关寄存器使用
    关于GPIO的就不说了,大家可以参考之前的帖子。
    关于PIT的,首先是它的外设控制寄存器,可以查看编号是92的,功能和之前的UART的一样设置,这里也不过多说了
    0140.png
    0141.png 下面指示了PIT模块的框图,可以看到,MPC5602PPIT模块有4个独立通道
    0142.png
    PIT相关的寄存器如下,我们只看PIT0通道
    0143.png
    这个是PIT模块控制寄存器,里面控制PIT时钟的开启和关闭,以及调试时是否停止计数
    0144.png
    0145.png
    下面是PIT的加载计数值寄存器,也就是PIT的计数初值寄存器,32位的
    0146.png
    下面是PIT的当前计数值寄存器,PIT每次计数时,都是把LDVAL的值复制到CVAL中,然后开始做递减计数
    0147.png
    0148.png
    下面是PIT的控制寄存器,控制是否中断,轮询方式就禁止中断,另一个位指示是否开始定时
    0149.png
    0150.png
    下面是定时到的标志位,每次CVAL的值减到0,该位就置一,轮询它的状态就知道了是否定时时间到
    0151.png
    0152.png
    下面这个图只是了每次重启定时器时,都会重新计时。
    0153.png

    4、有了上面的基础,其实程序比较简单的
    关键是PIT的初始化和延时函数中的判断,这里就不多说了,相信都能看懂的
    1. #include "MPC5602P.h"

    2. #define LED_YELLOW                               (SIU.GPDO[53].B.PDO) //黄色LED输出寄存器
    3. #define ON                                       (0)
    4. #define OFF                                      (1)

    5. void disableWatchdog(void) {        //禁止看门狗
    6.   SWT.SR.R = 0x0000c520;     
    7.   SWT.SR.R = 0x0000d928;
    8.   SWT.CR.R = 0x8000010A;     
    9. }

    10. void initModesAndClock(void) {
    11.   ME.MER.R = 0x0000001D;          /* Enable DRUN, RUN0, SAFE, RESET modes */

    12.   CGM.CMU_0_CSR.R = 0x000000004;  /* Monitor FXOSC > FIRC/1 (4MHz); no PLL monitor*/
    13.   CGM.FMPLL[0].CR.R = 0x02400100; /* 8 MHz xtal: Set PLL0 to 64 MHz */   
    14.   ME.RUN[0].R = 0x001F0074;       /* RUN0 cfg: 16MHzIRCON,OSC0ON,PLL0ON,syclk=PLL0 */
    15.   ME.RUNPC[0].R = 0x000000FE;
    16.   ME.PCTL[92].R = 0x00;           //PIT的外设控制

    17.   ME.MCTL.R = 0x40005AF0;         /* Enter RUN0 Mode & Key */
    18.   ME.MCTL.R = 0x4000A50F;         /* Enter RUN0 Mode & Inverted Key */  
    19.   
    20.   while (ME.GS.B.S_MTRANS == 1) {}    /* Wait for mode transition to complete */   

    21.   while(ME.GS.B.S_CURRENTMODE != 4) {} /* Verify RUN0 is the current mode */
    22. }

    23. void initGpio(void) {
    24.   SIU.PCR[53].R = 0x0220;           //PD5设置为输出模式
    25.   
    26.   LED_YELLOW = OFF;                 //初始化LED灭
    27. }

    28. void initPIT(void) {               //初始化PIT0
    29.   PIT.PITMCR.R = 0x00000001;       //使能PIT模块时钟,调试模式停止运行
    30.   PIT.CH[0].LDVAL.R = 64000;       //定时1ms
    31.   PIT.CH[0].TCTRL.R = 0x000000000; //禁止PIT0,禁止中断
    32.   PIT.CH[0].TFLG.B.TIF = 1;        //清标志位
    33. }

    34. void timeDelay(uint32_t nms) {
    35.   vuint32_t i;
    36.   PIT.CH[0].TFLG.B.TIF = 1;        //清标志位
    37.   PIT.CH[0].TCTRL.B.TEN = 1;       //启动PIT0
    38.   for (i = 0; i < nms; i++) {
    39.     while (PIT.CH[0].TFLG.B.TIF == 0) {}  //等待定时时间到
    40.     PIT.CH[0].TFLG.B.TIF = 1;      //清PIT0溢出标志位
    41.   }
    42.   PIT.CH[0].TCTRL.B.TEN = 0;       //停止PIT0
    43. }
    44. int main(void) {
    45.   initModesAndClock();              //时钟设置
    46.   disableWatchdog();                //禁止看门狗
    47.   initGpio();
    48.   initPIT();

    49.   /* Loop forever */
    50.   for (;;) {
    51.     LED_YELLOW = ~ LED_YELLOW;
    52.     timeDelay(500);
    53.   }
    54. }
    复制代码

    5、演示效果,看不出来是定时器PIT还是软件演示
    0000.gif


    6、上工程文件,方便大家参考
    pit_polling_mpc5602p.rar (117.24 KB, 下载次数: 11)
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-7-18 22:38 , Processed in 0.084974 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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