LPC210X定时器查询方式及如何初始化

发布时间:2023-04-03  

定时器查询方式定时器初始化:

1、设置定时器分频数,为(x+1)分频

2、匹配通道X中断并复位TxTC

3、比较值(1S定时值)

4、启动并复位TxTC


如:

T1PR = 99; // 设置定时器0分频为100分频,得110592Hz

T1MCR = 0x03; // 匹配通道0匹配中断并复位T0TC

T1MR0 = 110592/2; // 比较值(1S定时值)

T1TCR = 0x03; // 启动并复位T0TC

T1TCR = 0x01;

研究了好长一段时间,LPC210X的定时器,查询方式定时很简单如上面,但中断方式要操作好多寄存器,太麻烦,一直是一头雾水。好不容易理出了思路,现将一段例程粘贴备忘。


#include 《intrinsics.h》

#include 《stdio.h》

#include 《iolpc2103.h》

// OSC [Hz]

#define FOSC 11059200UL

// Core clk [Hz]

#define FCCLK FOSC

// Per clk [Hz]

#define PCCLK (FOSC/4)

// TImer TIck per second

#define TICK_PER_SEC (4UL)

#define TIM_PER_S(Val) (PCCLK/Val)

#define MAX_TICK_PER TIM_PER_S(20)

#define MIN_TICK_PER TIM_PER_S(5)

// Timer Delta period [ms]

#define DELTA_PER (50UL)

#define TIM_DPER ((PCCLK*DELTA_PER)/1000UL)

#define LED_MASK 1《《18

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

* 函数名称:irq_handler

* 入口参数:无

* 返回参数:无

* 描 述:IRQ handler

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

#pragma vector=IRQV

__irq __arm void irq_handler (void)

{

void (*interrupt_function)();

unsigned int vector;

vector = VICVectAddr; //获得中断向量

interrupt_function = (void(*)())vector;

if(interrupt_function != NULL)

{

interrupt_function(); //调用中断指向的函数

}

else

{

VICVectAddr = 0; //清除在VIC中的中断

}

}

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

* 函数名称: Timer0Handler

* 入口参数: 无

* 返回参数: 无

* 说 明: Timer 0 handler

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

void Timer0Handler (void)

{

// clear interrupt flag

T0IR_bit.MR0INT = 1;

// Change patern

if ((IOSET & LED_MASK) == 0)

IOSET = LED_MASK; //关闭LED

else

IOCLR = LED_MASK;

//pNextPattern = pNextPattern-》pNextPattern; //调整当前的链表

VICVectAddr = 0;

}

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

* 函数名称: VicInit

* 入口参数: 无

* 返回参数: 无

* 说 明: Init VIC module

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

void VicInit (void)

{

// Assign all interrupt chanels to IRQ

VICIntSelect = 0;

// Diasable all interrupts

VICIntEnClear = 0xFFFFFFFF;

// Clear all software interrutps

VICSoftIntClear = 0xFFFFFFFF;

// VIC registers can be accessed in User or privileged mode

VICProtection = 0;

// Clear interrupt

VICVectAddr = 0;

// Clear address of the Interrupt Service routine (ISR) for non-vectored IRQs.

VICDefVectAddr = 0;

// Clear address of the Interrupt Service routine (ISR) for vectored IRQs.

VICVectAddr0 = VICVectAddr1 = VICVectAddr2 = VICVectAddr3 =

VICVectAddr4 = VICVectAddr5 = VICVectAddr6 = VICVectAddr7 =

VICVectAddr8 = VICVectAddr9 = VICVectAddr10 = VICVectAddr11 =

VICVectAddr12 = VICVectAddr13 = VICVectAddr14 = VICVectAddr15 = 0;

// Disable all vectored IRQ slots

VICVectCntl0 = VICVectCntl1 = VICVectCntl2 = VICVectCntl3 =

VICVectCntl4 = VICVectCntl5 = VICVectCntl6 = VICVectCntl7 =

VICVectCntl8 = VICVectCntl9 = VICVectCntl10 = VICVectCntl11 =

VICVectCntl12 = VICVectCntl13 = VICVectCntl14 = VICVectCntl15 = 0;

}

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

* 函数名称: Init_timer0

* 入口参数: 无

* 返回参数: 无

* 说 明: Init tiner0

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

void Init_timer0(void)

{

/*

// Init timer

// Reset and stop timer0

T0TCR = 2;

// Set timer counters mode - clock by PCLK

T0CTCR = 0;

// Set timer prescaler

T0PR = 0;

// Set timer period

T0MR0 = PCCLK/TICK_PER_SEC;

// Set mack action - interrupt by MACH0 enable, reset counter

T0MCR = 3;

// No external action

T0EMR = 0;

*/

T0TCR = 2;

T0CTCR = 0;

T0PR = 0;

T0MR0 = PCCLK/TICK_PER_SEC;

T0MCR = 3;

T0EMR = 0;

// Assign to IRQ

VICIntSelect_bit.TIMER0 = 0;

// Set interrupt slots

VICVectAddr0 = (unsigned int) Timer0Handler;

VICVectCntl0_bit.NUMBER = VIC_TIMER0;

VICVectCntl0_bit.ENABLED = 1;

// Timer 0 interrupt enable

VICIntEnable_bit.TIMER0 = 1;

// Enable timer0

T0TCR = 1;

}

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

* 函数名称: Init_Gpio

* 入口参数: 无

* 返回参数: 无

* 说 明: Init GPIO

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

void Init_Gpio(void)

{

// Init GPIO

PINSEL0 = PINSEL1 = 0;

// Disable fast IO

SCS_bit.GPIO0M = 0;

// Set pins connect to LEDs as outputs

IODIR = LED_MASK;

// All LEDs off

IOCLR = LED_MASK;

}

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

* 函数名称: Init_pll

* 入口参数: 无

* 返回参数: 无

* 说 明: Init PLL

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

void Init_pll(void)

{

// Disable PLL

PLLCON = 0;

// Write Feed

PLLFEED = 0xAA;

PLLFEED = 0x55;

// Set periphery divider /4

APBDIV_bit.APBDIV = 0;

// Set MAM fully enable

MAMCR_bit.MODECTRL = 0;

MAMTIM_bit.CYCLES = 3;

MAMCR_bit.MODECTRL = 2;

}

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

* 函数名称: main

* 入口参数: 无

* 返回参数: 无

* 描 述: main

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

void main(void)

{

Init_pll();

// Memory map init flash memory is maped on 0 address

#ifdef FLASH

MEMMAP_bit.MAP = 1;

#else

MEMMAP_bit.MAP = 2;

#endif

__disable_interrupt();

VicInit();

Init_Gpio();

Init_timer0();

__enable_interrupt();


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    时间设定值而不同,例如: T5 k10定时时间为1s T243 K10定时时间为0.1s T275 K10定时时间为0.01s 定时器编址与时钟脉冲周期关系可查资料或手册 11、在梯形图程序中,定时器当前值是如何......
    定时器位断开,且当前值不递增。 定时器工作规律如下表所示: 表3. 定时器操作和PLC上电循环 ......
    PLC定时器使用注意事项;PLC中的定时器相当于继电器系统中的时间继电器。它有一个设定值寄存器(一个字长)、一个当前值寄存器(一个字长)和一个用来储存其输出触点状态的映像寄存器(占二......
    设定的生产数量后进行相应提醒或操作。 减计数器(CTD) :每接收到一次计数脉冲的上升沿,计数器当前值减 1,当当前值减为 0 时,相关的常开、常闭......
    线圈马上得电(线圈中出现蓝色方块,并且显示Q0.0=ON,同时可观察到PLC上的Q0.0指示灯也会亮),如图3-23(c)所示,定时器上方显示“+20=T37”表示定时器当前计时为20×100ms......
    有256个(C0~C255)。计数器是对PLC内部的时钟脉冲进行计数,而计数器是对外部的或由程序产生的计数脉冲进行计数。计数器累计计数的当前值(16位有符号整数),它存放在计数器的16位(bit)当前值......
    指令。 ------------------------------------------------------------------------------ 二、定时器指令 包括:接通延时定时器(TON)、有记忆的接通延时(保持型)定时器(TONR)、断开延时定时器(TOF)。S7-200有256个定时器(T0~T255......
    (TOF)。S7-200有256个定时器(T0~T255)。 三、计数器指令    包括:加计数CTU、减计数CTD和加/减计数CTUD总共有256个(C0~C255)。计数器是对PLC内部......
    )。计数器是对PLC内部的时钟脉冲进行计数,而计数器是对外部的或由程序产生的计数脉冲进行计数。计数器累计计数的当前值(16位有符号整数),它存放在计数器的16位(bit)当前值寄存器中。   每个......
    机才能切换到反转运行。 电动机从反转运行切换到正转运行亦是如此。 二、延时电路 1)接通延时电路 按下启动按钮X0,定时器T0开始计时,当T0当前值等于设定值后,T0的常开触点接通,线圈Y0接通,按下停止按钮X1......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>