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. 学习了这么多,终于可以开始写代码

注意:本人喜欢从根本上理解事物,故而,以下代码运行在裸机上,不依赖任何已有库,纯汇编;以下代码在keil uvison 5下编译通过。

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

LDR R1,=0X3

STR R1,[R0]

;设置定时器输入频率​

LDR R0,=TCNTB0

LDR R1,=6250

STR R1,[R0]

LDR R0,=TCMPB0

LDR R1,=6000

STR R1,[R0]

;设置定时器多久产生中断​

LDR R0,=TCON

LDR R1,=0X2

STR R1,[R0]

;设置手动更新TCNT0和TCMP0​​

LDR R0,=TCON

LDR R1,=0Xd

STR R1,[R0]

;启动定时器​

MOV PC,LR

HANDLEIRQ;中断服务程序入口

SUB LR,LR,#4

STMDB SP!,{R0-R12,LR}

LDR LR,=INT_RETURN

LDR PC,=EINT_HANDLE

INT_RETURN

LDMIA SP!,{R0-R12,PC}^

EINT_HANDLE

LOOP

SWITCH

LDR R0,=GPFDAT

LDR R1,[R0]

CASE_111

CMP R1,#0XFF

BNE CASE_110

LDR R1,=0X6F

STR R1,[R0]

B SWITCH_END

CASE_110

CMP R1,#0X6F

BNE CASE_101

LDR R1,=0X5F

STR R1,[R0]

B SWITCH_END

CASE_101

CMP R1,#0X5F

BNE CASE_011

LDR R1,=0X3F

STR R1,[R0]

B SWITCH_END

CASE_011

CMP R1,#0X3F

BNE SWITCH_END

LDR R1,=0X6F

STR R1,[R0]

B SWITCH_END

SWITCH_END

LDR R4,=SRCPND

LDR R5,=0XFFF

STR R5,[R4]

LDR R4,=INTPND

LDR R5,=0XFFF

STR R5,[R4]

MOV PC,LR

MAIN

B MAIN

END

主要注意先设置手动更新位,再启动定时器

ARM学习篇 中断定时理解的更多相关文章

  1. ARM学习篇 SDRAM理解

    1.SDRAM单管存储单元 SDRAM单管电路图 C记忆单元 T控制门管 Z字线 W位线 注:图示为N沟道耗尽型MOS管 写入:Z加高电平,MOS导通,W状态决定了电容C的状态 读出:Z加高电平,MO ...

  2. ARM学习篇一 点亮LED

    要点亮LED,先决条件是什么,当然得有相应的硬件设施.板子的整个电路图比较大,我就直接取相关部分. 给发光二级管加上3.3v电压后,通过1k电阻,直接与S3C2440连接.至于为什么要加电阻,大家应该 ...

  3. 灵动微电子ARM Cortex M0 MM32F0010 Timer定时器中断定时功能的配置

    灵动微电子ARM Cortex M0 MM32F0010 Timer定时器中断定时功能的配置 目录: 1.Timer1高级定时器Timer3通用定时器Timer14基本定时器简介 2.Timer1高级 ...

  4. 鸟哥Linux私房菜基础学习篇学习笔记1

    鸟哥Linux私房菜基础学习篇学习笔记1 第三章 主导分区(MBR),当系统在开机的时候会主动去读取这个区块的内容,必须对硬盘进行分区,这样硬盘才能被有效地使用. 所谓的分区只是针对64Bytes的分 ...

  5. 《Mysql 公司职员学习篇》 第二章 小A的惊喜

          第二章 小A的惊喜  ---- 认识数据库 吃完饭后,小Y和小A回到了家里,并打开电脑开始学习Mysql. 小Y:"小A,你平时的Excell文件很多的情况下,怎么样存放Exce ...

  6. Java多线程(学习篇)

    Java多线程:(学习篇) 1.什么是线程 2.线程状态 3.线程中断 4.线程交互 5.同步机制 6.锁机制 7.堵塞队列与堵塞栈 8.条件变量.原子量.线程池等 9.线性安全类和Callable与 ...

  7. 鸟哥Linux私房菜基础学习篇学习笔记2

    鸟哥Linux私房菜基础学习篇学习笔记2 第九章 文件与文件系统的压缩打包: Linux下的扩展名没有什么特殊的意义,仅为了方便记忆. 压缩文件的扩展名一般为: *.tar, *.tar.gz, *. ...

  8. python-基础学习篇(一)

    python基础学习(一) 不积硅步,无以至千里.基础的学习越加透彻,才能更清楚的理解和分析需求,我贯彻基础学习“永无止境”的理念,故把自学的知识梳理在博客中,基础学习篇无限更新. python介绍 ...

  9. C++入职学习篇--代码规范(持续更新)

    C++入职学习篇--代码规范(持续更新) 一.头文件规范 在头文件中大家一般会定义宏.引入库函数.声明.定义全局变量等,在设计时最后进行分类,代码示范(自己瞎琢磨的,请多多指点): #ifndef T ...

随机推荐

  1. 详细解读XMLHttpRequest(一)同步请求和异步请求

    本文主要参考:MDN XMLHttpRequest 让发送一个HTTP请求变得非常容易.你只需要简单的创建一个请求对象实例,打开一个URL,然后发送这个请求.当传输完毕后,结果的HTTP状态以及返回的 ...

  2. 理解React中es6方法创建组件的this

    首发于:https://mingjiezhang.github.io/(转载请说明此出处). 在JavaScript中,this对象是运行时基于函数的执行环境(也就是上下文)绑定的. 从react中的 ...

  3. ae_datagridview显示属性

    public partial class FrmAttributeTable : Form { private AxMapControl m_MapCtl; public FrmAttributeTa ...

  4. sharepoint 权限继承相关

    重新继承父级权限: SPList.ResetRoleInheritance(); 断开继承: SPList.BreakRoleInheritance(true); 用powershell断开继承: $ ...

  5. [Android]仿新版QQ的tab下面拖拽标记为已读的效果

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4182929.html 可拖拽的红点,(仿新版QQ,tab下面拖 ...

  6. 一个UILabel不同部分显示不同颜色

    我们直接来看效果图吧: 需求:就是表格cell里面的状态Label,前面的"状态:"是黑色,后面的状态值是红色,他们在同一个Label上,怎么做呢? 解答:真的是会者不难,难者不会 ...

  7. Linux内核--C语言中内嵌汇编 asm __volatile__

    在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器,以及如何将计算结果写回C 变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可 ...

  8. CLLocationManagerDelegate不调用didUpdateLocations (地图)

    这是因为xcode升级造成的定位权限设置问题.升级xcode6以后打开以前xcode5工程,程序不能定位.工程升级到xcode6编译时需要iOS8 要自己写授权,不然没权限定位.解决方法:首先在 in ...

  9. iOS 子视图超出父视图范围点击事件处理!

    - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{   UIView *view = [super hitTest:point ...

  10. UITableView与UISearchController搜索及上拉加载,下拉刷新

    #import "ViewController.h" #import "TuanGouModel.h" #import "TuanGouTableVi ...