ARM7的LPC22xx寄存器基础。

2024-01-07 18:48
文章标签 基础 寄存器 arm7 lpc22xx

本文主要是介绍ARM7的LPC22xx寄存器基础。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


1.

MEMMAP = 0x00时为Boot模式,异常向量表从Boot Block重新映射

MEMMAP = 0x01时为片内Flash模式,异常向量表不重新映射

MEMMAP = 0x10时为片内RAM模式,异常向量表从静态RAM重新映射

MEMMAP = 0x11时为片外存储器模式,异常向量表从外部存储器重新映射(only for LPC22xx)

所谓映射,就是一种对应关系,所以“重映射”就是重新对应的意思

ARM7的LPC22xx寄存器基础。 - songqing_789 - songqing_789的博客

2.

LPC2148有两个32位的通用I/O口:PORT0的32个可用引脚中P0.31为输出引脚,P0.24未用,其余30个为输入/输出引脚;PORT1中P1.16-P1.31引脚可用作GPIO功能。

PINSEL0、PINSEL1用于选择PORT0,每2bit对应一个引脚(2bit有4种组合,对应4种引脚功能)

PINSEL0[31:0]对应P0.15~P0.0

PINSEL1[31:0]对应P0.31~P0.16

PINSEL2直接控制P1.31~P1.0

IO0SET、IO1SET[31:0]:对应P0.31~P0.0和P1.31~P1.0,往[n]写1即将Px.n置1,写0无效

IO0CLR、IO1CLR[31:0]:对应P0.31~P0.0和P1.31~P1.0,往[n]写1即将Px.n置0,写0无效

IO0DIR、IO1DIR[31:0]:对应P0.31~P0.0和P1.31~P1.0,往[n]写1即将Px.n设为output,写0则设为input

IO0PIN、IO1PIN[31:0]:存储P0.31~P0.0和P1.31~P1.0的当前值(for read)

3.

Fosc:晶振频率,在软件中设置时应与实际晶振频率相同,是计算其他频率的基础

Fcclk:system clock,= M * Fosc,int M∈[1, 32],但Fcclk≤60MHz

Fcco:CCO工作频率,= 2 * P * Fcclk = 2 * P * M * Fosc,int p=1/2/4/8,须满足Fcco∈[156, 320]MHz

Fpclk:外设工作频率

PLLCON:PLL Control

PLLCON[0]:enable PLL when 1

PLLCON[1]:connect PLL when 1

PLLCON[1:0]:00/10->disabled and not connected; 01->enabled but not connected; 11->enabled and connected

PLLCFG:PLL Config

PLLCFG[4:0]:将(M-1)的值写入这5位即设置M值

PLLCFG[6:5]:写入00/01/10/11即设置P值为1/2/4/8

PLLFEED:设置好PLLCON和PLLCFG后,向PLLFEED先后写入0xAA、0x55才能使设置生效(像点击“确定”一样)

PLLSTAT:存储PLL的当前状态(for read)

PLLSTAT[4:0]:当前的PLLCFG[4:0]值

PLLSTAT[6:5]:当前的PLLCFG[6:5]值

PLLSTAT[8]:当前的PLLCON[0]值

PLLSTAT[9]:当前的PLLCON[1]值

PLLSTAT[10]:PLOCK值,为1时表示PLL已被锁定到设置的频率上。PLOCK在0xAA、0x55 写入PLLFEED后由系统自动设置。必须等待PLOCK为1时才能connect PLL

4.

T0PR、T1PR:用来存储Prescale值

T0PC、T1PC:Prescale Counter,频率为Fpclk,从0开始,递增到Prescale值时,PC置0,TC加1

T0TC、T1TC:Timer Counter,由PC可知,TC的频率为Fpclk/(Prescale+1),是整个Timer的中断源

T0TCR、T1TCR:Timer Control Register

T0TCR、T1TCR [0]:enable TC and PC when 1

T0TCR、T1TCR [1]:reset TC and PC when 1

MR0、MR1、MR2、MR3:设置Match值,当TC递增到Match值时产生动作(产生中断、复位TC或是停止TC和PC,这个动作由MCR控制)

MCR:Match Control Register,控制TC递增到Match值时的动作

MCR[0]:为1时,TC递增到MR0中的Match值时产生中断

MCR[1]:为1时,TC递增到MR0中的Match值时复位TC

MCR[2]:为1时,TC递增到MR0中的Match值时停止TC和PC

MCR[5:3]:对应MR1,顺序同上

MCR[8:6]:对应MR2,顺序同上

MCR[11:9]:对应MR3,顺序同上

T0IR、T1IR:Interrupt Register,有中断时,对应位置1;往某位写入1则将该位置0 (即复位中断),写入0无效

T0IR、T1IR[3:0]:对应timer自身产生的MR3/MR2/MR1/MR0中断

T0IR、T1IR[7:4]:对应捕获到的外部输入中断,即CR3/CR2/CR1/CR0中断

5.

所谓“向量”,就是引导、跳转的意思,“向量地址”实际就是跳转地址 (another example that I hate translation)

ARM7的LPC22xx寄存器基础。 - songqing_789 - songqing_789的博客

ARM7: 8种异常的向量地址

异常 向量地址 优先级

Reset 复位 0x0000 0000 1 (highest)

Undefined Instruction 未定义指令 0x0000 0004 6

Software Interrupt (SWI) 软件中断 0x0000 0008 7 (lowest)

Prefetch Abort (instruction fetch memory fault) 预取指中止 0x0000 000C 5

Data Abort (data access memory fault) 数据中止 0x0000 0010 2

Reserved (used by the Boot Loader as the Valid User Program key) 保留 0x0000 0014 N/A

IRQ 0x0000 0018 4

FIQ 0x0000 001C 3

FIQ之所以比IRQ多个F (fast),之所以称之为“快”,就是因为FIQ的优先级比IRQ高,比IRQ先处理

ARM的未定义指令异常有以下两种情况:

(1)遇到一条无法执行的指令,此指令没有定义

(2)执行一条对协处理器的操作指令,在正常情况下,协处理器应该应答,但协处理器没有应答

Prefetch Abort和Data Abort的产生主要是由于ARM7的三级流水机制

注意,这里的“无效指令”并不是未定义指令,是在取得指令时,若程序存储器发出中止信号,则ARM处理器把这一条指令标记为无效

把取指令换成取数据即变成Data Abort (读取数据时数据存储器发出了中止信号)

6.

发生中断时,ARM只负责(把PC)跳转到向量地址(FIQ to 0x1C, IRQ to 0x18),后面的工作需要我们自己完成。

FIQ的ISR可以直接写到0x1C,也可以像IRQ一样,用一个一级ISR取到VICVectAddr中的地址(即是二级ISR的地址),再运行二级ISR。当然,也可以直接在0x18写IRQ的ISR,不过 ARM

既然提供了这么多类似VICVectAddr的寄存器,不用白不用。

接下来的问题是:如何把一个函数地址准确地放在0x18/0x1C?

Yeah, we have #pragma!

In Programming Languages, Principles and Practice (Boston, PWS-Kent Publishing Co, 1993), Kenneth C. Louden writes

"Finally, a translator needs to provide the user options for debugging, for interfacing with the operating system, and perhaps with a software development

environment. These options, such as specifying files for inclusion, disabling optimizations or turning on tracing or debugging information, are the

pragmatics of a programming language translator. Occasionally, facilities for pragmatic directives (实用性指示), or pragmas, are part of the language

definition"

#pragma vector = address

该命令为其后声明的一个中断函数指定地址,即把中断函数和地址绑定

#pragma type_attribute = keyword

该命令影响其后声明的一个函数,keyword包括:

__arm:使函数以ARM模式运行

__thumb:使函数以thumb模式运行

__interwork:使函数既可以以ARM模式运行,也可以以thumb模式运行

__fiq:声明函数为FIQ函数(ISR)

__irq:声明函数为IRQ函数(ISR)

ISR must be compiled in ARM mode. ISR does not accept parameters and does not have a return value.

__swi:声明函数为软件中断函数( ISR)

__monitor:声明函数为监视函数

这些keyword也可以在函数声明时直接使用,如:

__irq __arm interrupt_handler()

{

……

}

7.

LPC2148有32个中断源(部分保留未用),每个中断源对应一个固定的VIC Channel (VIC Channel #可以看作中断源的编号) (可以理解为每一个中断源有一根固定的信号线连到内核

,一有中断就通过这根信号线通知内核)。一些片内中断源已经固定,额外添加的中断源要经过外部中断引脚(EINT),此时要用到PINSEL,一般使用P0.15和P0.16,因为P0.15对应

S4(也就是说S4可以控制P0.15的值,也一点并不只是在P0.15用作GPIO时才成立),P0.16对应S5,而它们又分别对应EINT2和EINT0 (关于YL所做的内部连接是个让人头痛的问题)

EXTMODE:设置EXTINT的捕捉模式

EXTMODE[0]:对应EINT0,置1表示即EXTINT捕捉EINT0引脚上的边沿,0表示EXTINT捕捉EINT0引脚上的电平

EXTMODE[1]:对应EINT1,同上

EXTMODE[2]:对应EINT2,同上

EXTMODE[3]:对应EINT3,同上

EXTPOLAR:设置EXTINT的捕捉极性

EXTPOLAR [0]:对应EINT0,置1表示EXTINT捕捉EINT0引脚上的高电平或是上升沿,0表示EXTINT捕捉EINT0引脚上的低电平或是下降沿

EXTPOLAR[1]:对应EINT1,同上

EXTPOLAR[2]:对应EINT2,同上

EXTPOLAR[3]:对应EINT3,同上

EXTINT:External Interrupt Flag register (where dose the ‘F’ go?)

EXTINT[0]:对应EINT0,若捕捉到EINT0上的敏感信号(电平或是边沿),则该位置1,否则为0,写入1则将该位置0

EXTINT[1]:对应EINT1,同上

EXTINT[2]:对应EINT2,同上

EXTINT[3]:对应EINT3,同上

8.

32个中断源可以设置为FIQ和IRQ两种模式,有关FIQ和IRQ的处理方式,参见第6点。

VICIntEnable:使能中断源

VICIntEnable[x]:置1表示使能第x号中断源(即是VIC Channel #为x的中断源),写0无效

VICIntEnClr:禁止中断源

VICIntEnClr[x]:写入1即将VICIntEnable[x]置0,写0无效

VICIntSelect:设置中断源

VICIntSelect[x]:写1表示把第x号中断源设置为FIQ,写0则设置为IRQ

VICFIQStatus:FIQ Status

VICFIQStatus[x]:为1表示第x号中断源产生FIQ中断请求

VICIRQStatus:IRQ Status

VICIRQStatus[x]:为1表示第x号中断源产生IRQ中断请求

LPC2148有16个优先级(对应16个slot,0到15优先级从高到低)供IRQ使用,使用slot的IRQ即是向量IRQ,没有使用slot的IRQ即是非向量IRQ

VICVectAddr0~VICVectAddr15、VICDefVectAddr、VICVectAddr:

当ISR读取VICVectAddr时,VICVectAddr会先去查找发送过来的最高优先级的VICVectAddrx (若有向量IRQ发生,VIC会把对应的VICVectAddrx发送到VICVectAddr),若没有

VICVectAddrx发送过来 (即没有向量IRQ发生),则VICVectAddr返回VICDefVectAddr (Def: default)中的地址值

所以一般把非向量IRQ的地址放在VICDefVectAddr (第6点中提到处理FIQ也可以在一级ISR里读取VICVectAddr,所以FIQ的ISR一般也是写在VICDefVectAddr里的),如果有多个非向

量IRQ或是FIQ中断源,则在ISR里要先用if-else或是swith-case来判断中断源,再做相应的处理。若是非向量IRQ倒也无所谓,反正非向量IRQ不要求处理速度;若是FIQ则会严重影

响FIQ的处理速度,所以一般只设置1个FIQ中断源(总之是越少越好)

“VICVectAddr查找发送过来的最高优先级的VICVectAddrx”实际是通过一个硬件的排序器来实现的,在ISR末尾应向VICVectAddr写入(一般是0x00)来清除硬件排序器中的中断标志

这篇关于ARM7的LPC22xx寄存器基础。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/580894

相关文章

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

MySQL中my.ini文件的基础配置和优化配置方式

《MySQL中my.ini文件的基础配置和优化配置方式》文章讨论了数据库异步同步的优化思路,包括三个主要方面:幂等性、时序和延迟,作者还分享了MySQL配置文件的优化经验,并鼓励读者提供支持... 目录mysql my.ini文件的配置和优化配置优化思路MySQL配置文件优化总结MySQL my.ini文件

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

C 语言基础之数组

文章目录 什么是数组数组变量的声明多维数组 什么是数组 数组,顾名思义,就是一组数。 假如班上有 30 个同学,让你编程统计每个人的分数,求最高分、最低分、平均分等。如果不知道数组,你只能这样写代码: int ZhangSan_score = 95;int LiSi_score = 90;......int LiuDong_score = 100;int Zhou

c++基础版

c++基础版 Windows环境搭建第一个C++程序c++程序运行原理注释常亮字面常亮符号常亮 变量数据类型整型实型常量类型确定char类型字符串布尔类型 控制台输入随机数产生枚举定义数组数组便利 指针基础野指针空指针指针运算动态内存分配 结构体结构体默认值结构体数组结构体指针结构体指针数组函数无返回值函数和void类型地址传递函数传递数组 引用函数引用传参返回指针的正确写法函数返回数组

【QT】基础入门学习

文章目录 浅析Qt应用程序的主函数使用qDebug()函数常用快捷键Qt 编码风格信号槽连接模型实现方案 信号和槽的工作机制Qt对象树机制 浅析Qt应用程序的主函数 #include "mywindow.h"#include <QApplication>// 程序的入口int main(int argc, char *argv[]){// argc是命令行参数个数,argv是

【MRI基础】TR 和 TE 时间概念

重复时间 (TR) 磁共振成像 (MRI) 中的 TR(重复时间,repetition time)是施加于同一切片的连续脉冲序列之间的时间间隔。具体而言,TR 是施加一个 RF(射频)脉冲与施加下一个 RF 脉冲之间的持续时间。TR 以毫秒 (ms) 为单位,主要控制后续脉冲之前的纵向弛豫程度(T1 弛豫),使其成为显著影响 MRI 中的图像对比度和信号特性的重要参数。 回声时间 (TE)