1、PIC32参考资源

PIC32系列参考手册 中文版  链接地址:PIC32系列参考手册 第14章 定时器(https://download.csdn.net/download/Huangtop/20299476?spm=1001.2014.3001.5503)

image.png

2、32位同步时钟计数器Harmony配置

1、在左侧Available Components列表中将TMR3拖入到Project Graph中;若新建的工程则将TMR2一起拖入框内;

image.png

2、拖入后工程组件如下图所示;

image.png

3、TMR2以及TMR3初始配置信息如下;

image.png

TMR3的配置信息;

image.png

4、修改TMR2的参数,设置分频系数为1,32-Bit模式选择32位计数模式,时钟源选择内部时钟,定时时间为1毫秒,空闲模式继续工作;

image.png

5、定时器3仅需配置使能中断;

image.png

6、组件配置完成后点击左侧的Generate Code按钮生成代码;

image.png

7、生成的代码与原始代码存在差异,需进行确认;

image.png

8、代码生成后需要的操作;

        1、启动定时器;

        2、添加中断任务内容;

9、编译运行将代码烧录到开发板中;

点击编译按钮,编译提示BUILD SUCCESSFUL,点击烧录,提示Programming/Verify complete,开发板上的LED灯闪烁。

image.png

3、工程配置分析

1、TMR2 Configuration Options配置分析

image.png

Select Prescaler 选择分频系数;

32-Bit Timer Mode Select Bit 可选Odd numbered and even numbered timers form separate 16-bit timers奇数和偶数定时器形成单独的16位定时器,以及Odd numbered and even numbered timers form a 32-bit timer奇数和偶数定时器组成一个32位定时器

Select Timer Clock Frequency 选择时钟源;

Timer Clock Frequency 时钟频率,计算得到,是分频后得到的值,定时器时钟;

Timer Period Unit 为定时器时间单位,可选millisecond、microsecond、nanosecond;也就是毫秒、微秒以及纳秒;

Time为计时时间,与上面的单位结合使用,Period Register为周期寄存器数值,通过时间计算得到;

Stop in Idle Mode bit停止在空闲模式位,可选Continue operation even in Idle mode(空闲模式下继续)或Discontinue operation when device enters Idle mode(当设备进入空闲模式时停止);

2、TMR3 Configuration Options配置分析

image.png

Enable Interrupts?使能中断服务,勾选该项后,会生成中断相关的代码及函数;

4、具体代码分析

//定时器初始化
void TMR2_Initialize(void)
{
    /* Disable Timer */
    T2CONCLR = _T2CON_ON_MASK; //禁止定时器,清零ON控制位
 
    /*
    SIDL = 0 //空闲模式停止位
    TCKPS =0 //预分频设置
    T32   = 1 //32定时器
    TCS = 0 //时钟源选择,内部时钟源或外部时钟源
    */
    T2CONSET = 0x8;  //TxCON与定时器相关的 16 位控制寄存器
 
    /* Clear counter */
    TMR2 = 0x0; //TMRx 32位定时器计数器寄存器
 
    /*Set period */
    PR2 = 79999U; //PRx与定时器相关的 32 位周期寄存器
 
    /* Enable TMR Interrupt of odd numbered timer in 32-bit mode */
    IEC0SET = _IEC0_T3IE_MASK; //TxIE中断允许控制位在IEC0中断寄存器中
}
 
//开启定时器
void TMR2_Start(void)
{
    T2CONSET = _T2CON_ON_MASK; //TxIF中断标志状态位在IFS0 中断寄存器中;
}
 
//关闭定时器
void TMR2_Stop (void)
{
    T2CONCLR = _T2CON_ON_MASK; //TxIF中断标志状态位在IFS0 中断寄存器中;
}
 
//设置周期寄存器
void TMR2_PeriodSet(uint32_t period)
{
    PR2  = period; //PRx与定时器相关的32位周期寄存器
}
 
//获取周期寄存器
uint32_t TMR2_PeriodGet(void)
{
    return PR2; //PRx与定时器相关的32位周期寄存器
}
 
//获取计数值
uint32_t TMR2_CounterGet(void)
{
    return (TMR2);  //TMRx 32位定时器计数器寄存器
}
 
//获取定时器频率
uint32_t TMR2_FrequencyGet(void)
{
    return (80000000); //返回定时器的时钟频率
}
 
//定时器中断服务函数,32位定时器中断控制由Slave定时器处理
void TIMER_3_InterruptHandler (void)
{
    uint32_t status  = 0U;
    status = IFS0bits.T3IF;
    IFS0CLR = _IFS0_T3IF_MASK; //清零IFSx寄存器中的TxIF中断标志位
 
/*可在这添加中断处理内容*/
 
    if((tmr2Obj.callback_fn != NULL))
    {
        tmr2Obj.callback_fn(status, tmr2Obj.context);
    }
}
 
//中断使能
void TMR2_InterruptEnable(void)
{
    IEC0SET = _IEC0_T3IE_MASK; //TxIE中断允许控制位在IEC0中断寄存器
}
 
//禁止中断
void TMR2_InterruptDisable(void)
{
    IEC0CLR = _IEC0_T3IE_MASK; //TxIE中断允许控制位在IEC0中断寄存器
}
 
//
void TMR2_CallbackRegister( TMR_CALLBACK callback_fn, uintptr_t context )
{
    /* Save callback_fn and context in local memory */
    tmr2Obj.callback_fn = callback_fn;
    tmr2Obj.context = context;
}
 
//中断服务函数,在interrupts.c中,调用TIMER_3_InterruptHandler
void __ISR(_TIMER_3_VECTOR, ipl1SOFT) TIMER_3_Handler (void)
{
    TIMER_3_InterruptHandler();
}

5、32位定时器说明

1、B类32位定时器框图

image.png

32 位模式

只有 B 类定时器模块支持 32 位工作模式。 32 位定时器模块通过将偶编号 B 类定时器 (称为TimerX)与相邻奇编号 B 类定时器 (称为 TimerY)组合而构成。例如, 32 位定时器组合有Timer2 与 Timer3 和 Timer4 与 Timer5 等。

Timer2 和 Timer4:这些位代表 32 位定时器的低半字 (16 位)。

Timer3 和 Timer5:这些位代表 32 位定时器的高半字 (16 位)。

32 位定时器模式由以下位决定:

• T32 (TxCON<3>):32 位定时器模式选择位 (仅适用于 TimerX)

• TCS (TxCON<1>):定时器时钟源选择位

• TGATE (TxCON<7>):定时器门控时间累加使能位

32 位定时器模式下的具体行为:

• TimerX 是主定时器; TimerY 是从定时器

• TMRx 计数寄存器是 32 位定时器值的低半字

• TMRy 计数寄存器是 32 位定时器值的高半字

• PRx 周期寄存器是 32 位周期值的低半字

• PRy 周期寄存器是 32 位周期值的高半字

• TimerX 控制位 (TxCON)配置 32 位定时器对的操作

• TimerY 控制位 (TyCON)没有任何作用

• TimerX 中断和状态位会被忽略

• TimerY 提供中断允许、中断标志和中断优先级控制位

使用 32 位定时器时,需要考虑以下事项:

• 在向 TMRxy 计数寄存器或 PRxy 周期寄存器中写入任意 32 位值之前,确保先将定时器对配置为 32 位模式,方法是设置 T32 (TxCON<3>) = 1。

• 所有定时器模块的 SFR 都可以按字节 (8 位)、半字 (16 位)或字 (32 位)进行写操作。

• 所有定时器模块的 SFR 都可以按字节、半字或字进行读操作。

• TMRx 和 TMRy 计数寄存器对可以按单个 32 位值的形式进行读写。

• PRx 和 PRy 周期寄存器对可以按单个 32 位值的形式进行读写。

6、32位定时器初始化步骤

1. 清零 ON 控制位 (TxCON<15> = 0)以禁止定时器。

2. 清零 TCS 控制位 (TxCON<1> = 0)以选择内部 PBCLK 源。

3. 将 T32 控制位置 1 (TxCON<3> = 1)以选择 32 位工作。

4. 选择所需的定时器输入时钟预分频比。

5. 装载 / 清零定时器寄存器 TMRxy。

6. 将所需的 32 位匹配值装入周期寄存器 PRxy。

7. 如果使用了中断:

        a) 清零 IFSx 寄存器中的 TyIF 中断标志位。

        b) 在 IPCx 寄存器中配置中断优先级和子优先级。

        c) 将 IECx 寄存器中的 TyIE 中断允许位置 1。

8. 将 ON 控制位置 1 (TxCON<15> = 1)以使能定时器。

7、实验验证

 点击编译按钮,编译提示BUILD SUCCESSFUL,点击烧录,提示Programming/Verify complete,开发板上的LED灯闪烁。

image.png

————————————————

版权声明:本文为CSDN博主「Huangtop」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/Huangtop/article/details/119302111