ARM9中断定时理解

1. 中断控制器

    a. 中断处理流程

  

                      P1--摘自S3C2440A手册

P1简要阐述了S3C2440A内置中断控制器处理中断的流程:

●?若某中断有自中断,则先接收子中断请求,否则,直接接受源中断。

●?中断控制逻辑根据INTMSK,屏蔽对应位的中断;根据INTMOD确定对应位中断模式(FIQ或者IRQ)。

?●中断仲裁器根据PRIORITY,确定仲裁规则并仲裁出最高优先级;同时,INTPND对应中断位置为1,只要CPSR的I位或者F位使能,就执行相应中断。

b. 中断向量表

?当ARM920T内核发生异常时,就会自动转到相应的地址,并自动记录跳转前PC的值(存入LR)和状态(存入SPSR)

      P2--中断向量表

一般我们在中断向量表相应位置写入相关跳转指令,可以是

??LDR PC,=FLAG;B  FLAG注意这两个指令所能接受的地址的范围即可

c. 中断控制器的特殊功能寄存器

?●源挂起寄存器:32位,每一位均与一个中断源连接;当中断源产生中断请求时并等待中断服务程序执行时,其相应位为1;其每一位均自动设置(若有某中断请求,则相应位设为1),不受中断屏蔽寄存器影响;中断服务程序执行完后,其相应位应该清0(只需写入一个对应位有1的数字,例如,清除第二位对应中断,给其写入0x2即可)。

●?中断模式寄存器:32位,每一位均与一个中断源对应;某位为1,则对应中断为FIQ,否则,为IRQ(某一时刻只能有一位被设为1)。

●?中断屏蔽寄存器:32位,每一位均与一个中断源对应;某位为1,则对应中断被屏蔽,否则,正常执行。

●?优先寄存器:32位,提供了多种冲裁规则

●?中断挂起寄存器:32位,每一位均与一个中断源对应;某位为1,则表示该位对应中断源拥有最高优先级。

●?中断偏移寄存器:32位,其大小对应当前被处理的中断源。

?               d. 详细寄存器介绍,请看S3C2440A手册

?2. PWM

?              a. PWM脉冲宽度调制大致结构

P3--摘自S3C2440A手册

???●定时器0和1与一个8位预分频器相连,定时器2,3,4则与另外一个预分频器相连;每个定时器都有一个时钟分频器,可以根据TCFG0和TCFG1的值调节定时器输入频率;

定时器输入频率=PCLK/(预分频值+1)/分割值

预分频值=0~255

分割值=2,4,8,16?

●?定时器4没有输出引脚,可以单纯的作为定时器。

b. 定时器操作步骤

●?设置TCNTBn和TCMPBn,将手动更新位设为1,假设不配置逆变器(即逆变器位设为0)

●?设置TCFG0和TCFG1,即调节定时器的输入频率

●?配置自动重载位(即自动重载位设为1),启动定时器(即启动位设为1)

c. 输出电平控制

●逆变器关时,若TCNTn<=TCMPn,输出为高,若TCNTn>TCMPn,输出为低;逆变器开时,与前者相反。

?         d. 死区发生器介绍,详见S3C2440A手册

3. 学习了这么多,终于可以开始写代码?

?AREA TIMER,CODE,READONLY

ENTRY

CODE32

GPFCON EQU 0x56000050

GPFDAT EQU 0x56000054

GPFUP  EQU 0x56000058

GPBDAT EQU 0X56000014

GPBCON EQU 0x56000010

GPBUP  EQU 0x56000018

SRCPND EQU 0X4A000000

INTMOD EQU 0X4A000004

INTMSK EQU 0X4A000008

PRIORITY EQU 0x4A00000C

INTPND EQU 0X4A000010

INTOFFSET EQU 0X4A000014

WTCON  EQU 0X53000000

TCFG0 EQU 0x51000000

TCFG1 EQU 0x51000004

TCON  EQU 0x51000008

TCNTB0 EQU 0x5100000C

TCMPB0 EQU 0x51000010

TCNTO0 EQU 0x51000014

_ENTRY

B RESET;0X0

B .;0X4

B .;0X8

B .;0xc

B .;0x10

B .;0x14

B  HANDLEIRQ  ;0x18中断入口

B  .

RESET

LDR R0,=WTCON

LDR R1,=0

STR R1,[R0]

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;关闭?看门狗,否则无限重启

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;?

MSR CPSR_c,#0Xd2

LDR SP,=3000

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;设置中断服务的堆栈指针

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;?

MSR CPSR_c,#0xdf

BL INIT_LED

BL INIT_IRQ

BL INIT_TIMER

?;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;初始化相关寄存器

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;?

MSR CPSR_c,#0X5F

LDR PC,=MAIN

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;初始化完成,转到主程序

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;?

?

INIT_LED

LDR R0,=GPFCON

LDR R1,=0X5555

STR R1,[R0]

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;初始化GPF端口属性,具体电路可以看我的前一篇博文

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;?

?

LDR R0,=GPFUP

LDR R1,=0XFF

STR R1,[R0]

LDR R0,=GPFDAT

LDR R1,=0XFF

STR R1,[R0]

LDR R2,=0

MOV PC,LR

INIT_IRQ

LDR R0,=INTMOD

LDR R1,=0X0

STR R1,[R0]

;简单起见,全设为IRQ模式?

LDR R0,=PRIORITY

LDR R1,=0X7F

STR R1,[R0]

;设置中断仲裁规则?

LDR R0,=INTMSK

LDR R1,=0xFFFFFBFF

STR R1,[R0]

;屏蔽掉无关中断?

MOV PC ,LR

INIT_TIMER

LDR R0,=GPBUP

LDR R1,=0X7FF

STR R1,[R0]

LDR R0,=GPBCON

LDR R1,=0X2

STR R1,[R0]

;把GPB.0端口配置?为TOUT0输出,我的板子是连接的LCD背光灯

LDR R0,=TCFG0

LDR R1,=119

STR R1,[R0]

LDR R0,=TCFG1

时间: 2024-10-06 03:28:45

ARM9中断定时理解的相关文章

STM32中断定时,控制LED灯

1 #include "led.h" 2 3 void TIM3_Int_Init(u16 arr,u16 psc) 4 { 5 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; 6 NVIC_InitTypeDef NVIC_InitStructure; 7 8 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //设置TIM3时钟使能 9 10 11 TIM_TimeBaseStru

Linux的中断和系统调用 &amp; esp、eip等寄存器

http://www.linuxidc.com/Linux/2012-11/74486.htm 一共三篇 中断一般分为三类: 1.由计算机硬件异常或故障引起的中断,称为内部异常中断: 2.由程序中执行了引起中断的指令而造成的中断,称为软中断(这也是和我们将要说明的系统调用相关的中断): 3.由外部设备请求引起的中断,称为外部中断.简单来说,对中断的理解就是对一些特殊事情的处理. 当发生软件中断时,其他所有的中断都可能发生并被处理:但当发生磁盘中断时,就只有时钟中断和机器错误中断能被处理了. 用户

JAVA多线程之中断机制(如何处理中断?)

一,介绍 这篇文章主要记录使用 interrupt() 方法中断线程,以及如何对InterruptedException进行处理.感觉对InterruptedException异常进行处理是一件谨慎且有技巧的活儿. 由于使用stop()方法停止线程非常的暴力,人家线程运行的好好的,突然就把人家杀死了,线程占用的锁被强制释放,极易导致数据的不一致性.可参考这篇文章对stop()方法的介绍. 因此,提出了一种温和的方式:请求另外一个线程不要再执行了,这就是中断方式. 二,中断及如何响应中断? 如何优

关于STM32串口空闲中断的问题

1.空闲中断是接受数据后出现一个byte的高电平(空闲)状态,就会触发空闲中断.并不是空闲就会一直中断 2.关于第二点有要铺垫的三个情况,datasheet中 "当一空闲帧被检测到时,其处理步骤和接收到普通数据帧一样,但如果IDLEIE位被设置将产生一个中断" "空闲符号被视为完全由'1'组成的一个完整的数据帧,后面跟着包含了数据的下一帧的开始位'1'的位数也包括了停止位的位数” 空闲符号的配图后面跟这一个低电平.有人理解为只有收到下一个数据的起始位才会触发中断,这样理解是不

Linux系统的中断、系统调用和调度概述【转】

转自:http://blog.csdn.net/yanlinwang/article/details/8169725 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近学习Linux操作系统,关于中断系统调用和进程的级别总是感觉有些模糊的地方,特在此做个小结,整理下思路. 所谓的中断就是在计算机执行程序的过程中,由于出现了某些特殊事情,使得CPU暂停对程序的执行,转而去执行处理这一事件的程序.等这些特殊事情处理完之后再回去执行之前的程序.中断一般分为三类:1.由计算机硬件异常或故障引起的

s5pv210的外部中断

中断,在学单片机的时候就没有学好,这次接触到210的中断体系,直接蒙圈了..前天下午老师简单的讲了一下,他的每句话拆开都可以听得懂,联系起来就傻了,,而且懂了与会写差距还远着呢.当天下午所有人都是萎靡的状态(不懂,不会写极其郁闷),以为参照裸机开发指南可以边写会慢慢理解,结果越写越是打击.晚上没有回去,一直想体验下在教室通宵的感觉,除了蚊子比较多.床不好睡.网速依旧渣.睡得太累,好吧,好像并没有什么优点. 虽然说是通宵了,但是几乎什么都没有学到,反而把自己搞得劳累.得不偿失!早上去领了免费包子,

软中断和硬中断(转)

1.中断:通常被定义成一个事件,该事件改变处理器执行的指令顺序.这样的事件与cpu芯片外部电路产生 的电信号相对应.2.中断的产生:每个能够发出中断请求的硬件设备控制器都有一条称为IRQ的输出线(中断线).所有的IRQ线都 与一个中断控制器的输入引脚相连,中断控制器与cpu的intr引脚相连.3.中断向量:每个中断由0-255之间的一个8位数来标识.称为中断向量.4.中断描述符表:IDT是一个系统表,它与每一个中断或者异常向量相联系,每一个向量在表中有相应的中断处理程 序的入口地址.cpu的id

软中断和硬中断

http://www.cnblogs.com/huayuan/archive/2012/05/18/2507150.html 1.中断: 通常被定义成一个事件,该事件改变处理器执行的指令顺序.这样的事件与cpu芯片外部电路产生 的电信号相对应.2.中断的产生: 每个能够发出中断请求的硬件设备控制器都有一条称为IRQ的输出线(中断线).所有的IRQ线都 与一个中断控制器的输入引脚相连,中断控制器与cpu的intr引脚相连.3.中断向量: 每个中断由0-255之间的一个8位数来标识.称为中断向量.4

Linux下ioctl函数理解

一. 什么是ioctl ioctl是设备驱动程序中对设备的I/O通道进行管理的函数.所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率.马达的转速等等.它的调用个数如下: int ioctl(int fd, ind cmd, -): 其中fd就是用户程序打开设备时使用open函数返回的文件标示符,cmd就是用户程序对设备的控制命令,至于后面的省略号,那是一些补充参数,一般最多一个,有或没有是和cmd的意义相关的,如果有的话,第三个参数总是一个指针,但指针的类型依赖于re