ARM寄存器指令总结(二)

来源:互联网 发布:淘宝上店铺状态非正常 编辑:程序博客网 时间:2024/06/10 15:14

      存储器加速模块

存储器加速模块MAM是将下一个需要的ARM指令锁存起来,以防止CPU取指暂停。

MAM所用的方法是将FLASH存储器分成两组,每一组都可以独立进行访问  ,这两个FLASH组都有自己的预取指缓冲区和分支跟踪缓冲区(每次获取128位指令行)。若关闭MAM,所有存储器请求都会直接对FLASH操作。

 

MAMCR   -0xE01FC000-0     存储器加速器模块控制寄存器

Bit0-1 00时,MAM被禁止;01时,部分功能使能;10时,完全使能,11保留

Bit2-7保留

MAMTIM  -0xE01FC004-0x07  存储器加速器定时控制

Bit0-2 000时,保留;001-111 MAM取指周期分别为1-7个处理器时钟。

Bit3-7 保留

 

程序示例:

 

MAMCR = 0;   //要先关闭,才能设置。

if( Fcclk < 20000000 )

{

   MAMTIM = 1;

}

Else if( Fcclk < 40000000 )

{

   MAMTIM = 2;

}

Else

{

   MAMTIM = 3;

}

MAMCR = 2;

 

      外部存储器控制

4个存储器组 bank0-bank3,片选信号分别为CS0-CS3;每个16MB空间;为AMBA AHB总线上的从设备。地址输出线 A[23:0],地址位A25,A24用于4个存储器组的译码。数据线为D[31:0]OE输出使能信号,低有效。BLS[3:0]输出字节定位选择信号,低有效。WE 输出,写使能信号,低有效。

 

外部存储器的地址范围:

BANK0  80000000 – 80FFFFFF    BCFG0   CS0

BANK1  81000000 – 81FFFFFF    BCFG1   CS1

BANK2  82000000 – 82FFFFFF    BCFG2   CS2

BANK3  83000000 – 83FFFFFF    BCFG3   CS3

寄存器描述

BCFG0 -0xFFE00000-0x2000FBEF 存储器组0的配置寄存器

BCFG1 -0xFFE00004-0x2000FBEF 存储器组1的配置寄存器

BCFG2 -0xFFE00008-0x2000FBEF 存储器组2的配置寄存器

BCFG3 -0xFFE0000C-0x2000FBEF 存储器组3的配置寄存器

每个位的定义看手册吧,太多了。。。

 

启动代码中的总线的初始化设置,程序清单:

LDR     R0, =PINSEL2

    IF :DEF: EN_CRP              ;选择芯片是否加密

        LDR     R1, =0x0f814910

    ELSE

        LDR     R1, =0x0f814914

ENDIF

0x0f814914

;保留位0000 ;地址线 A23-0 11111 ;使能P2.31,P2.30,P2.29P2.28 000;保留位00 ;01 使能CS3;使能CS2 01;? 0;保留 0;使能CS1 1;保留 00; 使能WE 1;使能P3.28,P3.29 00; 01 ?;0100 调试。

        STR     R1, [R0]

        LDR     R0, =BCFG0

        LDR     R1, =0x1000ffef

        STR     R1, [R0]

        ;0x1000ffef

0001 16位,0000 不是BRUST ROM,不写保护,

0000 0000 保留 11111 WST2  1 RBLE 11111 WST1

0 保留 1111 IDCY

 

      UART控制

U0RBR -0xE000C000 接收器缓存寄存器 (RO

如果要访问U0RBRU0LCRDLAB 必须为0

U0THR -0xE000C000 发送器保存寄存器  (WO)

如果要访问U0THRU0LCRDLAB 必须为0

 

U0IER - 0xE000C004-0中断使能寄存器

Bit0  RBRRDA+CTI)中断使能     1 使能,为0禁止。

Bit1  THRE中断使能    1 使能,为0禁止。

Bit2  Rx线状态中断使能 为1 使能,为0禁止。

Bit3-7 保留

如果要访问U0IERU0LCRDLAB 必须为0

 

U0DLL  0xE000C000-0x01  除数锁存LSB寄存器

U0DLM  0xE000C004-0  除数锁存MSB寄存器

这两个寄存器一次构成一个16位的除数,用于产生波特率。

要访问他们,U0LCRDLAB 必须为1

UXDLMUXDLL = Fpclk/16/baud

 

U0IIR 0xE000C008-0x01 中断标志寄存器 (RO

Bit0   中断挂起,0时,有中断被挂起; 1时,无中断被挂起。

Bit1-3 中断标志,011 RLS 010 RDA 110 CTI 001 THRE.

Bit4-5 保留

Bit6-7 FIFO使能,等效于U0FCRDE bit0

在退出中断服务程序前,必须读U0IIR来清除中断。

 

U0FCR 0xE000C008-0     FIFO控制寄存器

Bit0 FIFO使能,置位才能实现正确的UART0操作,该位的任何变化都降清空FIFO

Bit1 Rx FIFO复位,该位置位会自动清零RXFIFO,并该位自动清零

Bit2 Tx FIFO复位,该位置位会自动清零TXFIFO,并该位自动清零

Bit3-5 保留

Bit6-7 RX触发选择,00 触发点01字节,014字节,108字节,1114字节。

 

U0LCR 0xE000C00C-0    线控制寄存器

Bit0-1  字长度选择 00 5位 01 6位 10 7位 11 8

Bit2    停止位选择 0 时 1停止位 1时 2停止位

Bit3    奇偶使能   0 禁止奇偶产生和校验 1 使能

Bit4-5  奇偶选择   00 奇数 01 偶数 10 强制为1 11 强制为0

Bit6    间隔控制   0 禁止间隔发送 1 使能间隔发送

Bit7    除数锁存访问位  0 禁止访问除数锁存寄存器 1 使能

 

U0LSR 0xE000C014-0    线状态寄存器

Bit0    接收数据就绪RDR  0时,U0RBR为空, 1时,包含有效数据

Bit1    溢出错误OE       0时,溢出错误状态未激活,1时,溢出错误状态激活

Bit2    奇偶错误PE       0时,奇偶错误状态未激活,1时,奇偶错误状态激活

Bit3    帧错误PE         0时,帧错误状态未激活,1时,帧错误状态激活

Bit4    奇偶错误PE       0时,奇偶错误状态未激活,1时,奇偶错误状态激活

Bit5    发送保存寄存器THRE空 0时,U0THR包含有效数据 1时,为空

Bit6    发送器TEMT   0时,U0THRU0TSR包含有效数据 1时,为空

Bit7    RXFIF0错误      0时,无错误, 1时,有RX错误

 

U0SCR 0xE000C01C-0    高速缓存寄存器 ???

 

程序代码示例:

UART0 初始化:

#define  UART_BPS 115200                // 定义通讯波特率

void  UART0_Init(void)

    uint16 Fdiv;

    U0LCR = 0x83;                                     // DLAB = 1,可设置波特率

    Fdiv = (Fpclk / 16) / UART_BPS;          // 设置波特率

    U0DLM = Fdiv / 256;                                                

    U0DLL = Fdiv % 256;                                        

    U0LCR = 0x03;

}

2 查询方式发送数据

void  UART0_SendByte(uint8 data)

    U0THR = data;                                  // 发送数据

    while( (U0LSR&0x40)==0 );             // 等待数据发送完毕

}

3查询方式接收数据

Uint8 UART0_RevByte(void)

{

Uint8 rcv_data;

While((U0LSR&0X01)==0);

Rcv_data = U0RBR;

Return (rcv_data);
}


       包含中断的初始化(开接收中断)

 

  

typedef struct UartMode  

 

    uint8 datab;        // 字长度,5/6/7/8可选   

    uint8 stopb;        // 停止位,1/2可选   

    uint8 parity;       // 奇偶校验位,0-无校验,1-奇校验,2-偶校验   

}UARTMODE;   

uint8 rcv_buf[8];       // UART0数据接收缓冲区   

volatile uint8 rcv_new;  // 接收新数据标志 

 

*********************************************************************

** 函数名称 :UART0_Init() 

** 函数功能 :串口初始化,设置工作模式和波特率。 

** 入口参数 :baud   波特率 

**            set   模式设置(UARTMODE数据结构

** 出口参数 :1-初始化成功 0-初始化失败 

*********************************************************************

int8 UART0_Init (uint32 baud, UARTMODE set)  

 

    uint32 bak;  

      

    if ((baud ==0 ) || (baud > 115200))  return (0);  

    if ((set.datab <5) || (set.datab > 8))    return (0);  

    if ((set.stopb == 0) || (set.stopb > 2))     return (0);  

    if (set.parity > 4)  return (0); 

      

    U0LCR = 0x80;                       // DLAB = 1    

    bak   = (Fpclk >> 4) / baud;  

    U0DLM = bak >> 8;  

    U0DLL = bak & 0xFF; 

      

    bak   = set.datab - 5;              // 设置字长   

    if (set.stopb == 2) bak |= 0x04;       // 判断是否为2位停止位  

    if (set.parity != 0)  

    {  

        set.parity = set.parity - 1;  

        bak |= 0x08;  

    }  

    bak |= set.parity << 4;               // 设置奇偶校验   

    U0LCR = bak; 

    return (1);  

 

在主函数里面;

UARTMODE set; 

    set.datab  = 8;  

    set.stopb  = 1;  

    set.parity = 0; 

    rcv_new = 0;  

    PINSEL0 = 0x00000005;            // 设置I/O连接到UART0  

    UART0_Init(115200, set);           // 串口初始化   

    U0FCR = 0x81;                   // 使能FIFO,并设置触发点为8字节   

    U0IER = 0x01;                   // 允许RBR中断,即接收中断   

      

    VICIntSelect = 0x00000000;     // 设置所有的通道为IRQ中断   

    VICVectCntl1 = 0x20 | 0x06;    // UART0分配到IRQ slot0,即最高优先级   

    VICVectAddr1 = (uint32)IRQ_UART0;   // 设置UART0向量地址   

    VICIntEnable = 1 << 0x06;             // 使能UART0中断   

 

5         对应的接收中断处理函数

void __irq IRQ_UART0 (void)  

 

    uint8 i;  

    if ((U0IIR & 0x0F) == 0x04)   

        rcv_new = 1;            // 设置接收到新的数据标志   

    for (i=0; i<8; i++)  

    {  

        rcv_buf[i] = U0RBR;     // 读取FIFO的数据,并清除中断

    }  

    VICVectAddr = 0x00;         // 中断处理结束   

 

4 I2C接口控制

I2C总线上存在以下两种类型的数据传输:

(1)   从主发送器向从接收器发送数据。主机发送的第一个字节是从机地址。接下来是数据字节流。从机每接收一个字节返回一个应答位。

(2)   从发送器向主接收器发送数据。第一个字节(从地址)由主机发送。从机返回一个应答位。接下来从机向主机发送数据字节。主机每接收一个字节返回一个应答位。接收完最后一个字节,主机返回一个“非应答位”。主器件产生所有串行时钟脉冲和起始以及停止条件。出现停止条件或重复的起始条件时传输结束。由于重复的起始条件同时是下一个串行发送的开始,因此I2C总线不会被释放。

 

I2C控制寄存器

I2CONSET   I2C控制置位寄存器    /置位           0xE001C000

Bit0-1       保留  

Bit2         AA     应答标志,           写入1 置1

Bit3         SI      I2C中断标志位,     写入1 置1

Bit4         STO    停止标志            写入1 置1

Bit5         STA    起始标志            写入1 置1

Bit6         I2EN   I2C接口使能         写入1 置1

Bit7         保留

 

I2CONCLR  I2C控制清零寄存器    只清零  NA    0xE001C018

Bit0-1       保留  

Bit2         AAC         写入1 清I2CONSET对应位

Bit3         SIC          写入1I2CONSET对应位

Bit4         保留

Bit5         STAC        写入1I2CONSET对应位

Bit6         I2ENC       写入1I2CONSET对应位

Bit7         保留

 

I2STAT      I2C状态寄存器       只读     0xF8   0xE001C004

Bit0-2       这三个位总为0

Bit3-7       状态位(查手册,太多了)

 

I2DAT       I2C数据寄存器       /         0xE001C008

包含发送和接收的数据,只能在SI置位的情况下访问

I2ADR       I2C从地址寄存器     /         0xE001C00C

Bit0         GC        通用调用位   该位置位 则通用调用地址00被识别

Bit1-7       地址       从模式地址

只能在从模式下使用

 

I2SCLH  SCL占空比寄存器高半字   读/   0x04   0xE001C010

SCL高电平保持的pclk周期数,必须大于4

I2SCLL  SCL占空比寄存器低半字   读/   0x04   0xE001C014

SCL低电平保持的pclk周期数,必须大于4

位频率/总线速率 = Fpclk/( I2SCLH+ I2SCLL)

要保证I2C通信速率在0-400khz

 

4种操作模式:主发送器模式、主接收器模式、从发送器模式和从接收器模式。

 

主模式的配置

I2CONSET 必须配置为 I2EN 1 STA 0 STO 0 SI 0 AA 0;

主模式下初始化代码

void  I2C_Init(uint32 fi2c)

    if(fi2c>400000) fi2c = 400000;

    PINSEL0 = (PINSEL0&0xFFFFFF0F) | 0x50; // 设置I2C控制口有效

    I2SCLH = (Fpclk/fi2c + 1) / 2;               // 设置I2C时钟为fi2c

    I2SCLL = (Fpclk/fi2c) / 2;

    I2CONCLR = 0x2C;

    I2CONSET = 0x40;                                     // 使能主I2C

   

    VICIntSelect = 0x00000000;          // 设置所有通道为IRQ中断

    VICVectCntl0 = 0x29;                    // I2C通道分配到IRQ slot 0,即优先级最高

    VICVectAddr0 = (int)IRQ_I2C;                // 设置I2C中断向量地址    

    VICIntEnable = 0x0200;                    // 使能I2C中断

}

 

主发送模式的格式:

S(起始位) + 从地址 + R(1)/W(0) + A +  数据 + A + 数据 + A/~A + P(停止位)

 

从模式的配置

I2CONSET 必须配置为 I2EN 1 STA 0 STO 0 SI 0 AA 1;

从模式下的初始化代码

void  I2C_SlaveInit(uint8 addr)

    PINSEL0 = (PINSEL0&0xFFFFFF0F) | 0x50; // 设置I2C控制口有效

    I2ADR = adr&0xFE;                 //设置丛机地址

    I2CONCLR = 0x28;

    I2CONSET = 0x44;                                     // 配置为丛机模式

   

    VICIntSelect = 0x00000000;          // 设置所有通道为IRQ中断

    VICVectCntl0 = 0x29;                    // I2C通道分配到IRQ slot 0,即优先级最高

    VICVectAddr0 = (int)IRQ_I2C;                // 设置I2C中断向量地址    

    VICIntEnable = 0x0200;                    // 使能I2C中断

}

 

从接收模式的格式:

S(起始位) + 从地址 + W(0) + A +  数据 + A + 数据 + ~A /A+ P(停止位)/RS


原创粉丝点击