K60——寄存器




(1)PTx_BASE_PTR为GPIO寄存器结构体基址指针(PTR即point to register,x=A/B/C/D/E)

/* GPIO - Peripheral instance base addresses */

/** Peripheral PTA base pointer */
#define PTA_BASE_PTR                              ((GPIO_MemMapPtr)0x400FF000u)//将32位值(内存地址)强制转换为结构体类型指针,即得到一个初始地址(基址)为0x400FF000u的GPIO_MemMapPtr结构体。

/** Peripheral PTB base pointer */
#define PTB_BASE_PTR                             ((GPIO_MemMapPtr)0x400FF040u)
/** Peripheral PTC base pointer */
#define PTC_BASE_PTR                             ((GPIO_MemMapPtr)0x400FF080u)
/** Peripheral PTD base pointer */
#define PTD_BASE_PTR                             ((GPIO_MemMapPtr)0x400FF0C0u)
/** Peripheral PTE base pointer */
#define PTE_BASE_PTR                             ((GPIO_MemMapPtr)0x400FF100u)

//五个宏定义分别指向ABCDE口的GPIO寄存器结构体(每口有6个GPIO寄存器)


(2)GPIO寄存器结构体:嵌入式系统原理与实践(47页)

typedef struct GPIO_MemMap {
  uint32_t PDOR;                                   /**< Port Data Output Register, offset: 0x0 */
  uint32_t PSOR;                                   /**< Port Set Output Register, offset: 0x4 */
  uint32_t PCOR;                                   /**< Port Clear Output Register, offset: 0x8 */
  uint32_t PTOR;                                   /**< Port Toggle Output Register, offset: 0xC */
  uint32_t PDIR;                                   /**< Port Data Input Register, offset: 0x10 */
  uint32_t PDDR;                                   /**< Port Data Direction Register, offset: 0x14 */
} volatile *GPIO_MemMapPtr;


(3)调用GPIO寄存器结构体中的成员,即各种功能的寄存器,其中base为基址(对应(2))

/* GPIO - Register accessors */
#define GPIO_PDOR_REG(base)                      ((base)->PDOR)
#define GPIO_PSOR_REG(base)                      ((base)->PSOR)
#define GPIO_PCOR_REG(base)                      ((base)->PCOR)
#define GPIO_PTOR_REG(base)                      ((base)->PTOR)
#define GPIO_PDIR_REG(base)                      ((base)->PDIR)
#define GPIO_PDDR_REG(base)                      ((base)->PDDR)



(4)PORTx_BASE_PTR为内存映射结构体基址(PTR即point to register,x=A/B/C/D/E)

/* PORT - Peripheral instance base addresses */
/** Peripheral PORTA base pointer */
#define PORTA_BASE_PTR                           ((PORT_MemMapPtr)0x40049000u)
/** Peripheral PORTB base pointer */
#define PORTB_BASE_PTR                           ((PORT_MemMapPtr)0x4004A000u)
/** Peripheral PORTC base pointer */
#define PORTC_BASE_PTR                           ((PORT_MemMapPtr)0x4004B000u)
/** Peripheral PORTD base pointer */
#define PORTD_BASE_PTR                           ((PORT_MemMapPtr)0x4004C000u)
/** Peripheral PORTE base pointer */
#define PORTE_BASE_PTR                           ((PORT_MemMapPtr)0x4004D000u)


(5)内存映射结构体(注:查看K60数据手册K60P144M100SF2RM(Rev.6-2011.11)257页与264页)

/** PORT - Peripheral register structure */
typedef struct PORT_MemMap {
  uint32_t PCR[32];                                /**< Pin Control Register n, array offset: 0x0, array step: 0x4 */引脚控制寄存器
  uint32_t GPCLR;                                  /**< Global Pin Control Low Register, offset: 0x80 */
  uint32_t GPCHR;                                 /**< Global Pin Control High Register, offset: 0x84 */
  uint8_t RESERVED_0[24];
  uint32_t ISFR;                                    /**< Interrupt Status Flag Register, offset: 0xA0 */
  uint8_t RESERVED_1[28];
  uint32_t DFER;                                   /**< Digital Filter Enable Register, offset: 0xC0 */
  uint32_t DFCR;                                   /**< Digital Filter Clock Register, offset: 0xC4 */
  uint32_t DFWR;                                  /**< Digital Filter Width Register, offset: 0xC8 */
} volatile *PORT_MemMapPtr;

注:以上结构体中定义了一系列寄存器,如引脚控制寄存器等,下面我们看如何调用这些寄存器,看下面的宏定义。


(6)调用内存映射结构体中的成员,即各种功能的寄存器,其中base为基址(对应(4)),对于引脚控制寄存器PCR来说,index为引脚号,即某端口的第几个引脚(内存上理解相当于偏移地址(offset))

#define PORT_PCR_REG(base,index)                 ((base)->PCR[index])          //引脚控制寄存器(PCR)

#define PORT_GPCLR_REG(base)                     ((base)->GPCLR)
#define PORT_GPCHR_REG(base)                    ((base)->GPCHR)
#define PORT_ISFR_REG(base)                       ((base)->ISFR)
#define PORT_DFER_REG(base)                      ((base)->DFER)
#define PORT_DFCR_REG(base)                      ((base)->DFCR)
#define PORT_DFWR_REG(base)                      ((base)->DFWR)


(7)更改PCR寄存器指定位的值

#define PORT_PCR_MUX_MASK                    0x700u

#define PORT_PCR_MUX_SHIFT                    8
#define PORT_PCR_MUX(x)                          (((uint32_t)(((uint32_t)(x))<<PORT_PCR_MUX_SHIFT))&PORT_PCR_MUX_MASK)

时间: 2024-09-28 17:41:53

K60——寄存器的相关文章

ARM寄存器

ARM寄存器 一.ARM工作状态下的寄存器组织 ARM微处理器共有37个32位寄存器,其中31个为通用寄存器,6个位状态寄存器.但是这些寄存器不能被同时访问,具体哪些寄存器是可以访问的,取决ARM处理器的工作状态及具体的运行模式.但在任何时候,通用寄存器R14~R0.程序计数器PC(即R15).一个状态寄存器都是可访问的. 通用寄存器通用寄存器包括R0~R15,可以分为3类:(1)未分组寄存器R0~R7(2)分组寄存器R8~R14(3)程序计数器PC(R15) 1.未分组寄存器R0~R7在所有运

kobox : dma_s3c.ko -v1 操作寄存器方式操作S3C2440的DMA

平台:TQ2440 linux版本:Linux EmbedSky 3.16.1-svn57 #56 Sat Oct 18 21:46:22 PDT 2014 armv4tl GNU/Linux 目标:v2中改成s3c2410_dma_xxx方式来操作DMA,看这里的寄存器映射是怎么使用系统接口来操作的! #include "dma.h" #define MEM_CPY_NO_DMA 0 #define MEM_CPY_DMA 1 //#define BUF_SIZE (512*1024

寄存器调试 (2):应用层通过C代码访问(待完善)

除了前面所述通过shell命令访问寄存器外, 还支持通过C代码访问. 驱动层通过注册miscdevice设备, 实现了对应用层open/write/read等标准api的支持. static DEVICE_ATTR(dump, 0644, misc_dump_show, misc_dump_store); static DEVICE_ATTR(compare, 0644, misc_compare_show, misc_compare_store); static DEVICE_ATTR(wri

x64 寄存器使用

http://blog.csdn.net/cosmoslife/article/details/8771773 http://blog.csdn.net/herx1/article/details/3134889 x64 结构提供了 16 个通用寄存器(以后称为整数寄存器),以及 16 个可供浮点使用的 XMM 寄存器.易失寄存器是由调用方假想的临时寄存器,并要在调用过程中销毁.非易失寄存器需要在整个函数调用过程中保留其值,并且一旦使用,则必须由被调用方保存. 下表说明了每种寄存器在整个函数调用

STM32 寄存器库和固件库

寄存器和固件库开发的差别和联系 固件库就是函数的集合,固件库函数的作用是向下负责与寄存器直接打交道.向上提供用户函数调用的接口(API). 在 51 的开发中我们经常的作法是直接操作寄存器,比方要控制某些 IO 口的状态,我们直 接操作寄存器: P0=0x11; 而在 STM32 的开发中,我们相同能够操作寄存器: GPIOx->BRR = 0x0011; 这样的方法当然能够,可是这样的方法的劣势是你须要去掌握每一个寄存器的使用方法.你才干正确使用 STM32,而对于 STM32 这样的级别的

被遗忘的寄存器

CPU 里有一种名为寄存器的存储电路, 相当于机器语言中的变量. 具有代表性的寄存器有以下 8 个. 各个寄存器本来都是有名字的, 但现在知道这些名字的机会已经不多了, 所以在这里顺便介绍下. AX accumulator, 累加寄存器 CX counter, 计数寄存器 DX data, 数据寄存器 BX base, 基址寄存器 SP stack pointer, 栈指针寄存器 BP base pointer, 基址指针寄存器 SI source index, 源变址寄存器 DI destin

寄存器

寄存器 多个数连加,除了一开始,以后每次都有一个中间结果参与计算,这就需要一个保存中间结果的寄存器.一个触发器可以保存一个比特.一个寄存器通常由好多个边沿D触发器组成.如下图这个寄存器包含了5个上升沿D触发器,所有能用来保存一个5比特长的二进制数. 不管一个二进制数包含多少个比特,要保存它,只需要把每一个比特都保存起来即可.所有的触发器CP端都连在一起,这样就可以接收同一个控制命令.一旦"保存"开关按下,在CP脉冲的上升沿,所有触发器同时开始干活,二进制数的每一位都在同一时间被保存起来

[转载]ARM协处理器CP15寄存器详解

用于系统存储管理的协处理器CP15  原地址:http://blog.csdn.net/gameit/article/details/13169405 MCR{cond}     coproc,opcode1,Rd,CRn,CRm,opcode2 MRC {cond}    coproc,opcode1,Rd,CRn,CRm,opcode2 coproc         指令操作的协处理器名.标准名为pn,n,为0~15 opcode1      协处理器的特定操作码. 对于CP15寄存器来说,

ARM处理器寄存器

参考:ARM Architecture Reference Manual的39页 1.ARM处理器寄存器纵览 ARM微处理器共有37个32位寄存器,其中31个为通用寄存器(R13和R13_svc不是同一个寄存器),6个为状态寄存器.但是这些寄存器不能被同时访问,具体哪些寄存器是可以访问的,取决ARM处理器的工作状态及具体的运行模式.但在任何时候,通用寄存器R14-R0.程序计数器PC.一个状态寄存器都是可访问的. 1.1.通用寄存器     R0-R15     R13_svc.R14_svc