历史上的今天
返回首页

历史上的今天

今天是:2025年03月25日(星期二)

正在发生

2020年03月25日 | 【PIC32MZ】Timer定时器

2020-03-25 来源:eefocus

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);

}

推荐阅读

史海拾趣

Eagle Plastic Devices公司的发展小趣事

Eagle Plastic Devices公司成立于20世纪90年代初期,当时市场上对于高性能塑料电子部件的需求日益增长。公司创始人张先生,凭借其在塑料材料科学和电子工程领域的深厚背景,带领团队研发出了一系列具有革命性的塑料电子封装和连接器产品。这些产品以其优异的电气性能、耐用性和成本效益,迅速在行业内获得了认可,为Eagle Plastic Devices公司奠定了坚实的基础。

DMC Tools公司的发展小趣事

随着全球对环保问题的日益关注,DMC Tools公司也积极响应号召,致力于绿色生产。公司引进了先进的环保设备和技术,对生产过程中的废弃物进行无害化处理。同时,公司还积极推广绿色产品,帮助客户实现绿色生产。这种对环保的关注和投入不仅彰显了公司的社会责任感,也为公司赢得了良好的社会声誉。

BALLUFF公司的发展小趣事

作为一家世界领先的传感器制造商,BALLUFF公司始终坚持全球化战略与本土化发展的结合。在全球60多个国家设有代表处,并在38个国家拥有销售、生产和开发的子公司。同时,公司在德国、美国、瑞典、巴西、匈牙利、中国和日本等地建立了自动化产业和能源产业生产基地。这种全球化布局使得BALLUFF能够更好地服务全球客户,满足不同地区的市场需求。同时,公司也注重本土化发展,通过深入了解当地市场和客户需求,不断推出符合当地市场需求的产品和服务。

这五个故事展示了BALLUFF公司在电子行业中的发展历程和取得的成就。从初创时期的机械修理厂到如今的全球传感器制造领军企业,BALLUFF凭借其技术创新、产品质量和市场拓展能力,不断在电子行业中取得突破和进展。同时,公司也积极适应市场变化,不断调整战略和业务模式,以适应全球化趋势和客户需求的变化。

台湾兆欣(EMTEK)公司的发展小趣事

在立足台湾市场的同时,兆欣也积极拓展海外市场。他们通过参加国际展会、与海外客户建立合作关系等方式,成功将产品打入国际市场。特别是在亚洲地区,兆欣的产品受到了广泛欢迎和认可。这种多元化的市场布局为公司的快速发展提供了有力支持。

飞翼科技(FEIYI)公司的发展小趣事

在立足台湾市场的同时,兆欣也积极拓展海外市场。他们通过参加国际展会、与海外客户建立合作关系等方式,成功将产品打入国际市场。特别是在亚洲地区,兆欣的产品受到了广泛欢迎和认可。这种多元化的市场布局为公司的快速发展提供了有力支持。

Eastron Corp公司的发展小趣事

Eastron Corp成立于电子产业的起步阶段,凭借创始人在半导体领域的深厚技术背景,公司迅速开发出了一系列高性能、低成本的半导体芯片。这些产品迅速占领了市场,为公司带来了可观的利润。随着技术的不断进步,Eastron不断推出新的产品,逐渐在电子行业中确立了其技术领先者的地位。

问答坊 | AI 解惑

分享国产3G频谱分析仪AV4062技术参数!

AV4061/4062型频谱分析仪是一款高性能、经济型的射频信号分析仪。仪器采用了全频段数字扫描锁相本地振荡器和数字检波技术,以及6.4\"高亮度TFT LCD显示器,具有准确的频率、幅度测量精度和灵活的多功能扩展能力。可广泛应用于数字移动通信、CATV测 ...…

查看全部问答>

请教51多任务操作系统

我最近在网上找到这么个简单的基于51单片机的多任务操作系统,但是我不知道其中task-swith和task-load这两个函数是怎么切换任务的,用堆栈管理实现任务的切换,请高手帮我解释下,谢谢 我主要想知道51单片机怎样去识别任务切换 程序 /* ...…

查看全部问答>

关于WINCE6.0 USB蓝牙上网问题

{}. ;       ConnectionTimeout (dw) - …

查看全部问答>

获取电机转数

我设计的系统是这样的啊,T0扩展为一个外中断,T2工作在定时器方式下,TH2,TL2初值为0,当T0接收到第一个外断信号时,T2开始工作,当下个信号到来后停止工作,得到TH2和TL2的值啊,然后再这个值转化为是时间得到电机转一周的时间.这样行的通吗? 下一步对电 ...…

查看全部问答>

求wince5.0书籍

麻烦大家介绍几本wince5.0的开发书籍,最好是直接针对5.0的,谢谢~~…

查看全部问答>

运行时关闭UPLL的问题

系统:s3c2440a +wince5 想在系统运行时,关闭UPLL,不产生48Mhz,在需要时再打开UPLL 查看s3c2440a的datasheet,上写控制CLKSLOW寄存器的UCLK_ON即可 CLKSLOW[7] --> UCLK_ON --> = 0 UCLK_ON (UPLL turn on)         ...…

查看全部问答>

求助,硬件设计de-rating是个什么东西?

de-rating是什么东西?有什么用? 越详细越好,讲明白就好~~~~…

查看全部问答>

如何改变列表框的列头的文本

我想改变列表框的列头的文本,代码如下:         LVCOLUMN lvColumn;         lvColumn.mask = LVCF_TEXT | LVCF_WIDTH;         pMethodManageDlg->m_MethodList.GetColumn(1, ...…

查看全部问答>

如何知道一个WinCE SDK裁剪了哪些内容?

我现在手上有一个针对某个设备的 WinCE5.0 SDK包。 如何知道其在原版WinCE上做了哪些裁剪? 相关目录如下: [Atl] [Help]                   [Include]     & ...…

查看全部问答>

关于wince上的中文输入法

如果想在wince中自己开发一个中文输入法,要是用EVC的话,应该如果建立拼音和汉字字库的检索? 有没有相关的API函数? 要是想开发一个手写中文输入软件呢?都需要怎么去开发?…

查看全部问答>