微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM S3C2410硬件手册上的重要部分

ARM S3C2410硬件手册上的重要部分

时间:11-11 来源:互联网 点击:

Modem control register ):设为0x00 本实验不使用流控,设为默认值0

f.UBRdiv0 ( R/W Baud rate divisior register 0 ):设为12 本实验未使用PLL, PCLK=12MHz,设置波特率为57600,则由公式 UBRdivn = (int)(PCLK / (bps x 16) ) –1 可以计算得UBRdiv0 = 12,请使用S3C2410数据手册第314页的误差公式验算一下此波特率是否在可容忍的误差范围之内,如果不在,则需要更换另一个波特率(本实验使用的 57600是符合的)。

void init_uart( )

{//初始化UART

GPHCON |= 0xa0; //GPH2,GPH3 used as TXD0,RXD0

GPHUP = 0x0c; //GPH2,GPH3内部上拉

ULCON0 = 0x03; //8N1(8个数据位,无校验位,1个停止位)

UCON0 = 0x05; //查询方式

UFCON0 = 0x00; //不使用FIFO

UMCON0 = 0x00; //不使用流控

UBRdiv0 = 12; //波特率为57600 10 }

2、发送数据:

a.UTRSTAT0 ( UART channel 0 Tx/Rx status register ):位[2]:无数据发送时,自动设为1。当我们要使用串口发送数据时,先读此位以判断是否有数据正在占用发送口。位[1]:发送FIFO是否为空,本实验未用此位位[0]:接收缓冲区是否有数据,若有,此位设为1。本实验中,需要不断查询此位一判断是否有数据已经被接收。

b.UTXH0 (UART channel 0 transmit buffer register ): 把要发送的数据写入此寄存器。

void putc(unsigned char c)

{

while( ! (UTRSTAT0 & TXD0READY) ); //不断查询,直到可以发送数据

UTXH0 = c; //发送数据

}

3、接收数据:

a.UTRSTAT0:如同上述“2、发送数据”所列,我们用到位[0]

b.URXH0 (UART channel 0 receive buffer register ): 当查询到UTRSTAT0 位[0]=1时,读此寄存器获得串口接收到的数据。

unsigned char getc( )

{

while( ! (UTRSTAT0 & RXD0READY) ); //不断查询,直到接收到了数据

return URXH0; //返回接收到的数据

}

Interrrupt

SUBSRCPND和SRCPND寄存器表明有哪些中断被触发了,正在等待处理(pending);

SUBMASK(INTSUBMSK寄存器)和MASK(INTMSK寄存器)用于屏蔽某些中断。

1、“Request sources(without sub -register)”中的中断源被触发之后,SRCPND寄存器中相应位被置1,如果此中断没有被INTMSK寄存器屏蔽、或者是快中断(FIQ)的话,它将被进一步处理

2、对于“Request sources(with sub -register)”中的中断源被触发之后,SUBSRCPND寄存器中的相应位被置1,如果此中断没有被INTSUBMSK寄存器屏蔽的话,它在 SRCPND寄存器中的相应位也被置1,之后的处理过程就和“Request sources(without sub -register)”一样了

请打开S3C2410数据手册357页,“Figure 14-2. Priority Generating Block”显示了各中断源先经过6个一级优先级仲裁器选出各自优先级最高的中断,然后再经过二级优先级仲裁器选从中选出优先级最高的中断。IRQ的中断优先级由RIORITY寄存器设定,请参考数据手册365页,RIORITY寄存器中ARB_SELn(n从0到6)用于设定仲裁器n各输入信号的中断优先级,例如ARB_SEL6[20:19](0最高,其后各项依次降低):

00 = REQ 0-1-2-3-4-5 01 = REQ 0-2-3-4-1-5

10 = REQ 0-3-4-1-2-5 11 = REQ 0-4-1-2-3-5

RIORITY寄存器还有一项比较特殊的功能,如果ARB_MODEn设为1,则仲裁器n中输入的中断信号的优先级别将会轮换。例如ARB_MODE6设为1,则仲裁器6的6个输入信号的优先级将如下轮换(见数据手册358页)

使用中断的步骤:

1、当发生中断IRQ时,CPU进入“中断模式”,这时使用“中断模式”下的堆栈;当发生快中断FIQ时,CPU进入“快中断模式”,这时使用“快中断模式”下的堆栈。所以在使用中断前,先设置好相应模式下的堆栈。

2、对于“Request sources(without sub -register)”中的中断,将INTSUBMSK寄存器中相应位设为0

3、将INTMSK寄存器中相应位设为0

4、确定使用此的方式:是FIQ还是IRQ。

a.如果是FIQ,则在INTMOD寄存器设置相应位为1

b.如果是IRQ,则在RIORITY寄存器中设置优先级

使用中断的步骤:

5、准备好中断处理函数,

a.中断向量: 在中断向量设置好当FIQ或IRQ被触发时的跳转函数, IRQ、FIQ的中断向量地址分别为0x00000018、0x0000001c

b.对于IRQ,在跳转函数中读取INTPND寄存器或INTOFFSET寄存器的值来确定中断源,然后调用具体的处理函数

c.对于FIQ,因为只有一个中断可以设为FIQ,无须判断中断源

d.中断处理函数进入和返回

6、设置CPSR寄存器中的F-bit(对于FIQ)或I-bit(对于IRQ)为0,开中断

使用中断的步骤:

IRQ进入和

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top