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

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

转载于:https://www.cnblogs.com/GaussianPrince/p/5932213.html

ARM学习篇 中断定时理解相关推荐

  1. ARM学习(12)基于arm架构的嵌入式操作系统理解

    ARM学习(12)基于arm架构的嵌入式操作系统理解 笔者来聊聊指令集的理解 这里写自定义目录标题 ARM学习(12)基于arm架构的嵌入式操作系统理解 symbol 符号表认识 symbol符号表的 ...

  2. STM32CubeMX与HAL库学习--基本定时器定时中断

    STM32CubeMX与HAL库学习--基本定时器定时中断 背景 STM32CubeMX生成初始化代码 在MDK-ARM里编辑代码 其他 背景 本人小白,最近在学着使用STM32CubeMX与HAL库 ...

  3. ARM裸机篇(五)——异常和中断

    linux系列目录: linux基础篇(一)--GCC和Makefile编译过程 linux基础篇(二)--静态和动态链接 ARM裸机篇(一)--i.MX6ULL介绍 ARM裸机篇(二)--i.MX6 ...

  4. GNU ARM汇编--(五)中断汇编之嵌套中断处理

    在上篇<GNU ARM汇编--(四)中断汇编之非嵌套中断处理>中分析了最简单的中断处理的写法,再看TQ2440启动代码中的中断向量表的写法就一目了然了.今天抽时间对嵌套中断处理的学习做下整 ...

  5. 鸟哥的linux私房菜-基础学习篇 读书笔记

    从事linux工作一年多,算是能够熟练运用linux服务器,但仍觉得自己对Linux的原理,理论缺乏空洞,潜下心来认真阅读尘封的鸟哥经典,知识点很全,收获颇多,实践与知识结合,知行合一,对linux开 ...

  6. 鸟哥的LINUX私房菜 基础学习篇 读书笔记 -- 第零章 计算机概论 (一)

    鸟哥的LINUX私房菜 基础学习篇 读书笔记 -- 第零章 计算机概论 (一) 第零章 计算机概论 0.1 电脑:辅助人脑的好工具 0.1.1 计算机硬件五大组成部分 0.1.2 一切设计的起点: C ...

  7. MACE源码解析【ARM卷积篇(一) 】1*N和N*1卷积实现

    MACE Mobile AI Compute Engine (MACE) 是一个专为移动端异构计算平台优化的神经网络计算框架,旨在深度神经网络部署在移动端,是一个SoC上的神经网络实现.主要涉及的硬件 ...

  8. [网络安全学习篇50]:Web架构安全分析

    引言:我的系列博客[网络安全学习篇]上线了,小编也是初次创作博客,经验不足:对千峰网络信息安全开源的视频公开课程的学习整理的笔记整理的也比较粗糙,其实看到目录有300多集的时候,讲道理,有点怂了,所以 ...

  9. 我在Salira的800天(2009.5.20~2011.7.29)-三.研究与学习篇

    本博客(http://blog.csdn.net/livelylittlefish )贴出作者(阿波)相关研究.学习内容所做的笔记,欢迎广大朋友指正! Content 零.序 一.感谢篇 二.工作篇 ...

最新文章

  1. java计算器的重点解决问题_java计算器问题
  2. 干货|全面解析知识图谱:一种帮助通向强AI的数据科学技术
  3. 11月份是个少产的季节
  4. Python基础(1)
  5. IDEA代码生成插件CodeMaker
  6. K 个一组翻转链表Python解法
  7. python 新闻摘要_每日新闻摘要:Microsoft内部禁止应用程序,这样就可以了
  8. 资源不在java项目和构建路径上_编译单元不在Java项目的构建路径上-Maven
  9. python猜猜我是几,我在python中猜数游戏的问题
  10. jemter的竞品分析
  11. 第七章 consul docker集群
  12. CVPR 2022 | UniDet:通用的多数据集目标检测
  13. PAT乙级 1068 万绿丛中一点红 (20 分) Java 实现
  14. Quorum共识简析
  15. 计算机房宣传标语,机房安全标语
  16. 花与剑尚未获取服务器信息,花与剑澄心无忆攻略,触发条件及完成方式介绍
  17. ati自定义分辨率_修改三国无双 游戏自定义分辨率教学 6/19更新
  18. 婚姻:中国女研究生结婚率下降明显 对方学历低看不上
  19. Science复活远古“蛋白质”,揭示光合作用的“昨天、今天和明天”
  20. python2和python3 with open as f写中文乱码

热门文章

  1. ireport模块之间的动态传参及拼接SQL
  2. Win10错误代码0x80070541是怎么回事
  3. java数组与以逗号分隔开的字符串的相互转换
  4. Android开发笔记(一百五十八)运行时动态授权管理
  5. 前端集成方案——理论(一)
  6. Vue源码解析:虚拟dom比较原理
  7. bzoj3524: [Poi2014]Couriers / bzoj2223: [Coci 2009]PATULJCI 主席树
  8. javascript--函数(一)
  9. FreeMarker基本操作(二)
  10. 黑马程序员——关于static关键字