MPC5744P-PIT模块(周期中断定时器)

1.功能描述

在周期中断定时器使能的情况下,定时器加载被LDVAL寄存器指定的计数初值,然后递减计数,当递减到0时自动重载LDVAL指定的计数初值并触发一次中断。中断的使能由TCTR寄存器TIE位控制。

2.PIT初始化

1.结构

5744P含有4个周期中断定时器,各个定时器可以分别设置不同的定时器周期,也可以进行两个定时器的链接以形成定时周期更长的定时器,PIT定时器的结构如下:

2.配置过程

PIT定时器的一般配置过程为:

1)根据系统配置情况选择外设运行模式。由时钟模块可知,外设可设置外设配置寄存器来决定自身在不同模式的运行情况,PIT定时器也是这样

2)使能PIT模块,5744P中各个外设模块一般需要软件使能来使用;

3)关闭指定定时器以进行初始化,PIT模块有4个定时器,使用时需要指定具体的定时器,可为0~3;

4)对指定定时器加装初值;

5)设置指定定时器中断优先级,配置中断优先级时需选择处理中断请求的处理器和中断优先级,0为最高优先级,32为最低优先级,5744设置处理中断的处理器和优先级的寄存器为INTC_0.PSR[x].R,其中x为要处理中断的中断号,本文中PIT Timer0的中断号为226,所以为226。

PRC_SELn表示要选择处理中断的处理器,各个值表示的意义如下:

0 不发生中断请求到处理器       1 发送中断请求到处理器3            2 发送中断请求到处理器2        3 发送中断请求到处理器2,3

4 发送中断请求到处理器1         5 发送中断请求到处理器1,3        6 发送中断请求到处理器1,2      7 发送中断请求到处理器1,2,3

8 发送中断请求到处理器0         9 发送中断请求到处理器0,3        10 发送中断请求到处理器0,2    11 发送中断请求到处理器0,2,3

12 发送中断请求到处理器0,1    13 发送中断请求到处理器0,1,3   14 发送中断请求到处理器0,1,2  

15 发送中断请求到处理器0,1,2,3

由于5744P对中断的处理是中断源先向INTC(中断控制单元)发送中断请求,经过INTC处理后再由INTC向CPU发送中断请求,故要在INTC_0.PSR[x].R寄存器中为中断设置要请求的处理器,一般情况下CPU选择处理器0,故PRC_SEL一般等于8;

6)使能指定定时器的定时周期中断;

7)使能指定定时器以开始计时。

3.寄存器

1)PIT_MCR寄存器 PIT模块控制寄存器

  • MDIS PIT模块失能位
              0    使能PIT模块
              1    关闭PIT模块
  • FRZ   是否允许定时器在Debug模式下运行
              0    PIT在Debug模式下继续运行
              1    PIT在Debug模式下停止运行

2)PIT_TCTRLn寄存器 定时器控制寄存,需要根据选择的寄存器选择对应的寄存器

  • CHN 链接模式选择位
            0     定时器不链接
            1     定时器选择链接模式
  • TIE   定时器中断使能位
             0     关闭所选定时器的中断功能
             1     开启所选定时器的中断功能
  • TEN  定时器使能位
             0     关闭所选定时器,停止计数
             1     启动所选定期,开始计数

3)PIT_LDVALn寄存器  定时器初值装载寄存器,需要根据选择的定时器选择对应的寄存器

4)PIT_TFLGn寄存器   定时器中断标志寄存器,需要根据选择的寄存器选择对应的寄存器

TIF      中断标志位,该位需在中断处理程序中写1清零
           0     计数还未溢出,即中断还未发生
           1     计数溢出,中断发生
上述寄存器中,MCR是PIT模块的控制寄存器,其余TCTRL、LDVAL、TFLG寄存器是定时器控制寄存器,需要根据所使用的定时器选择对应的寄存器,MPC5744官方库中将它们包装到TIMER结构体内,可通过对应定时器的结构体配置它们。

4.示例代码

示例代码如下:

/******************************************************
 * 函数名       PIT_Init
 * 功能         对指定定时器初始化并设置指定定时周期
 * 输入参数
 *             PIT_TIMERx
 *             定时器号  指定要初始化的定时器  x可为0~3 如
 *               PIT_TIMER0     选择定时器0,PIT_TIMERx可以直接写为0,1,2,3
 *             PIT_SetMS
 *               定时器周期 单位为毫秒(ms)
 * 返回值      无
 * 示例        PIT_Init(PIT_TIMER0,1);//初始化PIT定时器0并设置定时周期为1ms
 ******************************************************
 */
static void PIT_Init(uint8_t PIT_TIMERx,uint8_t PIT_SetMs)
{
	MC_ME.PCTL30.B.RUN_CFG=0;                                  //选择外设运行模式0
	PIT_0.MCR.B.MDIS=0;                                        //打开PIT模块
	PIT_0.TIMER[PIT_TIMERx].TCTRL.B.TEN=0;                     //关闭TIMERx
	PIT_0.TIMER[PIT_TIMERx].LDVAL.R=PIT_SetMs*PIT_TRANS_RATE;  //设置TIMERx初始值
	INTC_0.PSR[226].R = 0x800A;                                //设置中断优先级为10
	PIT_0.TIMER[PIT_TIMERx].TCTRL.B.TIE=1;                     //使能TIMERx中断
	PIT_0.TIMER[PIT_TIMERx].TCTRL.B.TEN=1;                     //使能TIMERx模块
}

3.中断函数设计

在PIT初始化完成后,可设计对应的中断函数,中断函数内必须清除对应定时器的中断标志位,中断函数一般设计步骤如下:

1)设计中断函数PIT_TIMEx_Isr

2)在工程自动含有的intc_SW_mode_isr_vectors_MPC5744P.c中声明中断函数PIT_TIMEx_Isr

3)将中断向量表内对应PIT_TIMERx的中断向量改为中断函数PIT_TIMEx_Isr

示例代码如下:

在isr.c函数设计中断函数

void PIT_TIMERx_Isr()
{
	PIT_ClearFlag(PIT_TIMERx);
	.
        .
        .
}

在intc_SW_mode_isr_vectors_MPC5744P.c声明中断向量函数

extern void PIT_TIMERx_Isr(void);

在将中断向量表内对应PIT_TIMERx的中断向量改为中断函数PIT_TIMEx_Isr,定时器0~3对应的中断向量号对应位226~229.

(uint32_t) &dummy, /* Vector # 223 Reserved for Ethernet_1_2 */
(uint32_t) &dummy, /* Vector # 224 Reserved for Real Time Counter (RTC) */
(uint32_t) &dummy, /* Vector # 225 Reserved for Autonomous Periodic Interrupt (API) */
(uint32_t) &PIT_TIMERx_Isr, /* Vector # 226 Periodic Interrupt Timer (PIT_0) channel 0*/
(uint32_t) &dummy, /* Vector # 227 Periodic Interrupt Timer (PIT_0) channel 1 PIT_0 */
(uint32_t) &dummy, /* Vector # 228 Periodic Interrupt Timer (PIT_0) channel 2 PIT_0 */
(uint32_t) &dummy, /* Vector # 229 Periodic Interrupt Timer (PIT_0) channel 3 PIT_0 */
(uint32_t) &dummy, /* Vector # 230 Reserved for PITx PIT */
(uint32_t) &dummy, /* Vector # 231 Reserved for PITx PIT */
(uint32_t) &dummy, /* Vector # 232 Reserved for PITx PIT */
(uint32_t) &dummy, /* Vector # 233 Reserved for PITx PIT */
(uint32_t) &dummy, /* Vector # 234 Reserved for PITx PIT */
(uint32_t) &dummy, /* Vector # 235 Reserved for PITx PIT */

猜你喜欢

转载自blog.csdn.net/sinat_31773903/article/details/88048807