ARM LPC2103定时器中断方式寄存器设置

发布者:塞上老马最新更新时间:2023-03-07 来源: elecfans关键字:ARM  LPC2103  定时器  中断方式  寄存器设置 手机看文章 扫描二维码
随时随地手机看文章

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

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)

{};

}


关键字:ARM  LPC2103  定时器  中断方式  寄存器设置 引用地址:ARM LPC2103定时器中断方式寄存器设置

上一篇:基于LPC2378的IAP功能实现配变监测终端程序远程更新
下一篇:解读LPC210X之外部中断寄存器

推荐阅读最新更新时间:2024-11-11 12:08

ARM for ADS1.2
一、新建项目文件夹(最好用英文名称); 二、将相应的项目中的INIT文件夹中的Src和inc中的9个文件托人新建文件夹中。 三、打开 ADS1.2,点击File,在弹出窗口中的Project标签下,选中ARM Executable Image,在右边Project name下的框中输入项目名称(英文),点击下面的保存路径按钮SET...选择存放路径保存。 四、在项目界面,点击右键,选择Add Files,选中拖入项目文件夹中的8个单后缀文件添加进来,最后再点击右键,添加新建组,将几个文件分类,以便是界面简明整洁。 五、再点击ads1.2的File菜单下的New(同三),在弹出窗口中的File name 下的框中输入代码源代
[单片机]
ARM处理器编程模型
一、arm采用RISC体系结构 RISC并非只是简单地去减少指令,而是把着眼点放在了如何使计算机的结构更加简单合理地提高运算速度上,优先选取使用频最高的简单指令。 二、ARM处理器共有37个寄存器,被分为若干个组(BANK),这些寄存器包括: 31个通用寄存器,包括程序计数器(PC指针),均为32位的寄存器。 6个状态寄存器,用以标识CPU的工作状态及程序的运行状态,均为32位,目前只使用了其中的一部分。 三、ARM微处理器在较新RISC体系结构中支持两种指令集:ARM指令集和Thumb指令集。 ARM指令为32位的长度,Thumb指令为16位长度 Thumb指令集为ARM指令集的功能子集,但与等价的ARM代码相比较,可
[单片机]
<font color='red'>ARM</font>处理器编程模型
ARM零碎知识点总结
寄存器中普遍存在的情况 : 当往某个寄存器只有写入特定逻辑的值才有效而写入反逻辑的值无效时(如只有写入1有效而写入0无效,或者只有写入0有效而写入1无效),只操作其中某一位或者某些位时,可以不必关心其他的状态,即不必读回原来的值,进行“与”/“或”操作后进行回写。 一般情况下,有这种特性的寄存器,均会有置位和清零寄存器成对出现,如IO0SET和IO0CLR. (可参见周立功GPIO部分) 对端口赋值时怎样保证只只改变所需引脚的值而不改变其与引脚的值 : 为了改变一组端口引脚的输出,必须将IOPIN读出的内容和一个值相“与”(该值使要改变的引脚对应的位用0来屏蔽,其他引脚对应的位为1)。最后再
[单片机]
STM32高级定时器、通用定时器TIMx、基本定时器TIM6和TIM7的区别
TIM1和TIM8定时器的功能包括: ● 16位向上、向下、向上/下自动装载计数器 ● 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值 ● 多达4个独立通道: ─ 输入捕获 ─ 输出比较 ─ PWM生成(边缘或中间对齐模式) ─ 单脉冲模式输出 ● 死区时间可编程的互补输出 ● 使用外部信号控制定时器和定时器互联的同步电路 ● 允许在指定数目的计数器周期之后更新定时器寄存器的重复计数器 ● 刹车输入信号可以将定时器输出信号置于复位状态或者一个已知状态 ● 如下事件发生时产生中断/DMA: ─ 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) ─ 触发事件(
[单片机]
韦东山ARM裸机学习笔记——S3C2440的串口驱动编程原理
前言 讲解韦东山JZ2440开发板的串口驱动原理,对韦东山在维基教程串口使用内容的一些补充,串口使用点击这里进入。这里主要讲的是串口驱动的编程思路,如何根据s3c2440的芯片手册编写出最简单的串口驱动。 一、串口的初始化 串口初始化包括引脚初始化、串口时钟初始化和中断模式、波特率配置以及参数配置等。 1、引脚初始化 (1)看JZ2440开发板的原理图,可知UART0的引脚是GPH2(TXD0)和GPH3(RXD0)。 (2)到s3c2440芯片手册295页,看GPHCON(GPH控制寄存器),可以需要把GPH2也就是GPHCON 配置为10,GPH3也就是GPHCON 配置为10。 (3)配置引脚为内部上拉,
[单片机]
韦东山<font color='red'>ARM</font>裸机学习笔记——S3C2440的串口驱动编程原理
用Qemu运行/调试arm linux
用Qemu运行/调试arm linux,这事情干过好几次了,久了就忘记了,每次都要重新去查资料,浪费不少时间。这次把整个过程弄成个脚本,放到github上,需要是拿下来运行一下即可,方便自己也方便有需要的朋友。这里解释一下脚本的内容(运行系统Ubuntu 16.04 LTS): 1. 设置一些环境变量,可以根据自己需要修改。 export ARCH=arm export MACHINE=vexpress export TARGET=arm-linux export GDB_VERSION=8.0 export KERNEL_VERSION=4.4.1 export BUSYBOX_VERSION=1.25.1 export C
[单片机]
嵌入式Linux之我行——ARM MMU工作原理剖析
一、MMU的产生 许多年以前,当人们还在使用DOS或是更古老的操作系统的时候,计算机的内存还非常小,一般都是以K为单位进行计算,相应的,当时的程序规模也不大,所以内存容量虽然小,但还是可以容纳当时的程序。但随着图形界面的兴起还用用户需求的不断增大,应用程序的规模也随之膨胀起来,终于一个难题出现在程序员的面前,那就是应用程序太大以至于内存容纳不下该程序,通常解决的办法是把程序分割成许多称为覆盖块(overlay)的片段。覆盖块0首先运行,结束时他将调用另一个覆盖块。虽然覆盖块的交换是由OS完成的,但是必须先由程序员把程序先进行分割,这是一个费时费力的工作,而且相当枯燥。人们必须找到更好的办法从根本上解决这个问题。不久人们找到了一
[单片机]
STM32F4 定时器TIM(1)定时器控制输出
高级时钟控制定时器TIM1&TIM8简介: STM32F4的高级控制定时器包含一个自动重装载计数器,计数器的输入是一个被预分频的系统时钟。 这个定时器有多种用途,包括车辆输入信号长度(输入捕获模式)或者产生波形输出(输出捕获,PWM,带死区插入的互补PWM输出等) 脉冲长度和波形周期可在通过定时器的预分频器或者RCC的预分频器在几个微秒时钟内调整。 高级控制定时器和通用定时器完全独立,不共享任何资源。 高级时钟控制定时器TIM1&TIM8的主要特性: 1、16位向上、向下、双向自动重装载计数器2、16位预分频器,分频值从1打655353、4个独立通道4、带死去输出的互补输出5、控制外部信号的同步电路6、刹车输入7、产生中断和DMA
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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