历史上的今天
返回首页

历史上的今天

今天是:2026年03月07日(星期六)

2023年03月07日 | ARM LPC2103定时器中断方式寄存器设置

2023-03-07 来源:elecfans

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

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

while(1)

{};

}


推荐阅读

史海拾趣

德崧电子(D-SWITCH)公司的发展小趣事

在电子开关行业,防水性能一直是重要的技术指标。德崧电子(D-SWITCH)公司在成立初期就意识到了这一点,并投入大量资源进行研发。经过数年的努力,公司成功研发出了具有TUV IP67/IP68防水等级认证的防水型开关。这一突破性的技术不仅解决了市场上防水开关性能不稳定的问题,还大大提高了产品的可靠性和使用寿命。凭借这一技术优势,德崧电子在市场上迅速崭露头角,赢得了客户的广泛认可。

Compact公司的发展小趣事

近年来,电子行业经历了多次技术变革和市场洗牌。面对这些挑战,Compact公司积极调整战略,加大研发投入,以适应市场变化。同时,公司还通过优化生产流程、降低成本等方式提高竞争力。在行业变革中,Compact公司不仅成功应对了挑战,还抓住了机遇,实现了跨越式发展。

AAEON公司的发展小趣事

随着电子市场的日益成熟,Compact公司意识到单纯的技术创新已不足以支撑其长期发展。于是,公司开始积极寻求市场拓展和战略合作的机会。通过与国内外知名企业建立合作伙伴关系,Compact公司成功将其产品打入国际市场,进一步扩大了市场份额。同时,通过与上下游企业的紧密合作,Compact公司实现了产业链的整合,提高了整体运营效率。

Display Elektronik GmbH公司的发展小趣事

面对数字化浪潮的冲击,Display Elektronik GmbH积极拥抱数字化转型。公司利用大数据、云计算等先进技术,实现了生产、销售、服务等各个环节的数字化管理。这种数字化转型不仅提高了公司的运营效率和管理水平,还为客户提供了更加便捷、高效的服务体验。在数字化转型的推动下,Display Elektronik GmbH的竞争力得到了显著提升。

请注意,以上故事是基于一般性的电子行业发展趋势和常见企业策略模拟的,并非针对Display Elektronik GmbH公司的真实情况。

Agere System(LSI Logic)公司的发展小趣事

Display Elektronik GmbH公司自创立之初,就致力于显示技术的研发与创新。在21世纪初,公司推出了一款采用全新显示技术的液晶显示屏,其高分辨率、低功耗和长寿命的特点迅速赢得了市场的认可。随着技术的不断迭代,Display Elektronik GmbH逐步确立了在显示技术领域的领先地位。

DSP Group Inc公司的发展小趣事

随着技术的不断进步和市场需求的增长,DSP Group开始将业务扩展到半导体领域。公司推出了一系列高性能、低功耗的DSP芯片,广泛应用于移动通信、智能家居、汽车电子等领域。这一举措不仅进一步巩固了DSP Group在DSP领域的领先地位,还为公司带来了可观的收益和市场份额。

问答坊 | AI 解惑

关于VGA显示扫描模块

用vga640480这程序  实现一个HS里包含800个CLK  1个VS里包含525个HS library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity vga640480 is   port (clk :in std_logic;   ...…

查看全部问答>

windows ce 虚拟串口对驱动

求wincewindows ce 虚拟串口对开发思路? 要求windows ce 虚拟串口驱动建立一个虚拟串口对,这个虚拟串口对,是彼此连接的。应用程序,可以其中任何一个串口(com2),写数据,另一个串口com3,读出数据。 大家帮帮忙呀!…

查看全部问答>

wince的串口安全判断问题

wince需要与解码器相连,如果断开时需要有发送不成功的提示,出了系统自带的读写异常还有其他办法来判断发送没有正确呢开发语言是c#现在情况是这样的,我用的是serialport控件,串口线接上以后接收事件就自动触发,但没法判断是不是连接了解码器,所以想 ...…

查看全部问答>

求助:Kernel panic

ibblpp> printenvbootargs=noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0bootcmd=nand read.jffs2 0x30007FC0 kernel; bootm 0x30007FC0bootdelay=2baudrate=115200ethaddr=08:00:3e:26:0a:5bipaddr=192.168.7.17serverip=192.168 ...…

查看全部问答>

学完51单片机,下一步PIC,AVR,还是啥呢?

如题,下一步该怎么走,还忘前辈们指教! …

查看全部问答>

WIN7下Protel99se添加元件库和封装库

WIN7系统下Protel99se添加元件库和封装库,按照此方法32bit/64bit win7系统下都可以成功添加。希望给大家带来帮助。…

查看全部问答>

求助啊,很急

昨天刷了一下BOIS,nor flash的,配置什么的都没问题,但是再用ads调试就没有现象了,程序好像正常运行, 就是一个简单的led灯,以前没有问题的,什么办法都用了,还是不行,用jlink调试出现下面提示,请高手看看是怎么回事,很急 其他功能都正常 ...…

查看全部问答>

使用Jlink作为电源为Open1081开发板供电

使用Jlink作为电源为Open1081开发板供电 微雪的Open1081开发板,具备了众多接口和外围设备,结合Core1081核心板,可以提供较全面完整的基于MX1081芯片平台的WIFI物联网设备开发。然而在评估的时候,发现该开发板的一个缺点就是供电方式不是很好 ...…

查看全部问答>

undefined reference to `usb_close'

关于使用libusb的问题。 我在嵌入式的arm板子上编译这个,然后也安装了libusb,而且也链接了-lusb, 但是就是会一直报这样的错,纠结死了。 undefined reference to `usb_close\' undefined reference to `usb_find_busses\' undefined ...…

查看全部问答>

求解答。。。

不知道为什么出现这个问题,老师都觉得我没写错。。。截图我上传到附件了…

查看全部问答>