【PIC32MZ】Timer定时器

2020-03-25来源: eefocus关键字:PIC32MZ  Timer  定时器

PIC32MZ有多达9组Timer,但是并非任何时候都能同时使用,主要是在使用32位计数器时的问题。


Timer的2、4、6、8定时器支持16位和32位,但是在使用32位,占用的ID并非自身,而是下一个。以Timer4为例,在system_interrupt中可以看到,若是使用16位模式,显示为Timer4,而使用32位时,其使用的是Timer5。如果同时使用Timer4的32位和Timer5,生成代码时,则会出现冲突提示。


还有就是设置系统频率时需要注意,若是要求较短间隔(us),最好使用32位模式,因为分频后的频率数值若是超过计数器长度,则无法正常使用,并且没有提示,你会看到定时器没有起作用。


以下使用timer4示例,事实上可以看到,不管配置的是哪个Timer,只要是相同的Instance ID,代码部分没有变化:


1、配置驱动

2、生成代码,使用定时器


使用时注意先调用initial(open一个客户端),再调用开始停止


timer.h


/***********************************************

 * This is a timer for active motor

 * Timer 4 32bit

 ************************************************/

 

#ifndef _MOTOR_TIMER_H

#define _MOTOR_TIMER_H

 

#include

#include

#include

#include

#include "system_config.h"

#include "system_definitions.h"

 

typedef struct

{

    /*** uart ******/

    DRV_HANDLE drvTimerHandle;

    

    uint8_t timerGap;

    uint32_t timerTotalCount;

    uint32_t timerCurrentCount;

 

}TIMERS_DATA;

 

 

TIMERS_DATA timerData;

 

 

bool Timer_Init(void);

 

void Timer_Start(uint32_t milliSeconds , uint32_t TotalCount);

 

void Timer_Stop();

 

 

#endif


timer.c


 

#include "timer.h"

 

 

void Timer_Tick_Callback( uintptr_t context, uint32_t alarmCount )

{

    //do sometime

 

    

}

 

bool Timer_Init(void)

{

    timerData.timerTotalCount = 0;

    timerData.timerCurrentCount = 0;

    timerData.timerGap = 0;

    

    //initial timer4, id0

    timerData.drvtimerHandle = DRV_TMR_Open(DRV_TMR_INDEX_0,DRV_IO_INTENT_READ );

    

    /* Check the USART1 driver handler */  

   if (timerData.drvtimerHandle == DRV_HANDLE_INVALID )  

   {   

       return false;  

   }  

    

    return true;

}

 

//start timer with microSeconds

void Timer_Start(uint32_t microSeconds, uint32_t TotalCount)

{

    

    //maybe some is invalib ,such TMR_PRESCALE_VALUE_4, DRV_TMR_CLKSOURCE_INTERNAL is Peripheral clock,now is 64,000,000 Hz

    DRV_TMR_ClockSet(timerData.drvtimerHandle,DRV_TMR_CLKSOURCE_INTERNAL,TMR_PRESCALE_VALUE_64);

    

    //get timer input clock frequency,100ns

    uint32_t frequency = DRV_TMR_CounterFrequencyGet(timerData.drvtimerHandle);

    

    Uart_printf("Timer 2 Frequency is : %un",frequency);

    

    uint32_t us = frequency/1000000;

    

    Uart_printf("Timer 2 half period is : %un",us*microSeconds);

    

    //Set timer gap and register callback function

    DRV_TMR_AlarmRegister(timerData.drvtimerHandle, us*microSeconds, true, 0, (DRV_TMR_CALLBACK)Timer_Tick_Callback);

 

    //enable the alarm

    DRV_TMR_AlarmEnable(timerData.drvtimerHandle, true);

    

    //start timer 2

    DRV_TMR_Start(timerData.drvtimerHandle);

 

    OnePulseEnd = true;

    

    timerData.timerTotalCount = TotalCount;  // one pulse is 0_1-

    timerData.timerCurrentCount = 0;

    timerData.timerGap = microSeconds;

 

}

 

void Timer_Stop()

{

    DRV_TMR_Stop(timerData.drvtimerHandle);

}

关键字:PIC32MZ  Timer  定时器 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic492554.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:关于结构体/联合体 字节对齐及位域操作出现的问题
下一篇:PIC24HJ系列入门: 配置位及时钟配置

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

【PIC32MZ】Usart串口通讯
串口通讯是一个很成熟的通讯协议,几乎所有MCU都配有串口,本篇将述在Harmony中如何使用Usart,使用设备为PIC32MZ2048EFH,其他PIC32MZ基本相似。以下使用的是Harmony的动态驱动,要注意动态驱动的使用规则,动态驱动排序为Driver中配置顺序,即InstanceIndex,而非Usart ID的顺序。 串口使用流程如下,以串口2为例: 1、配置串口驱动2、配置串口引脚3、生成代码,使用串口注意Dynamic的驱动对象都需要有一个Open动作来创建一个Handle,后续所有操作都是用Handle来代表这个驱动对象。所有动态驱动的中断都是采用注册回调函数的方式来使用,无需
发表于 2020-03-15
【PIC32MZ】Usart串口通讯
【PIC32MZ】PWM呼吸灯
PWM类似于开关电源,将高电压中间插入地脉冲,来将有效电压降低,在某些电压不敏感器件中,可以实现电压降低的效果。例如LED的亮度变化。前文有说过,Harmony的Dynamic还不是很完善,在PWM上就有体现,PWM需要OC与静态Timer配合,如果有其它Timer在在使用Dynamic,不想全部改为Static,可以直接使用PLIB函数,可以从其它Static函数往底层去看,也是通过static调用的PLIB函数。所以,在这里我们只配置OC,而对应的Timer则采用直接调用底层函数的方法使用static驱动。注意,PWM的占空比指的是高电位占空比,例如80%指的是80%为高电位。呼吸灯则是使用另外一个Timer,来分段设置不同的占
发表于 2020-03-06
【PIC32MZ】PWM呼吸灯
PIC32MZ 通过U盘在线升级 -- USB Host bootloader
上一篇博文介绍的PIC32MZ HID bootloader是其中之一,这次将要介绍的是PIC32MZ U盘bootloader,也是其中之一。大概在今年6月份,我有尝试过实现PIC32MZ U盘bootloader, 但没有成功。放假了,效率果然不一样,之前一直没能完成,这次也轻松搞定。PIC32MZ U盘bootloader也是在harmony的bootloader例程基础上修改而成。开发环境如下,1. IDE: MPLABX IDE 4.012. Compiler:  XC32 v1.403. Library: Harmony 1.074. Example: c:/microchip/harmony
发表于 2019-11-29
PIC32MZ 通过USB在线升级 -- USB HID bootloader
上一篇博文介绍了PIC32MZ 的USB CDC bootloader, 但是USB CDC bootloader是模拟UART通信,速度比较慢。所以我决定使用USB HID class替换USB CDC class. 让我的PIC32MZ bootloader更新程序时,有飞一般的感觉。整个PIC32MZ USB HID bootloader是在harmony 的bootloader例程基础上修改的。HID bootloader的开发环境如下。开发环境1. IDE:  MPLABX IDE 4.012. Compiler:  XC32 1.403. Library:  Harmony 1.074.
发表于 2019-11-29
PIC32MZ 通过USB在线升级 -- USB CDC bootloader
最近给我的开发板PIC32MZ EC starter kit写了个USB 在线升级程序--USB CDC bootloader。有了它,我可以很方便的升级我的应用程序。我大概是一个星期前开始决定写这个USB在线升级程序的,USB 有两种类型,USB host和USB device。 USB host接触不多,我决定采用USB device的类型。 USB device有很多种Class, 例如HID, CDC,和MSD等,MSD device不适合做在线升级,HID用来做在线升级很不错,但是PC端需要驱动和专门的上位机。所以我决定采用CDC device, 模拟一个串口,上位机实现也简单。此在线升级程序虽然只是第一版(v 1.0
发表于 2019-11-29
PIC18F25K80,timer0定时器中断
volatile uint32_t uwTick = 0; void __interrupt() ISR(void) //void attribute ( (interrupt, no_auto_psv) ) _T1Interrupt( void ){ if((T0IF)&&(T0IE)) //定时器 {    TMR0IF=0;              //T0CON=0B10010011;    //enable T0,16bit,FSCO/4,16:1
发表于 2020-03-15
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved