您的位置 首页 FPGA

ARM中止方法串口编程

串口编程(UART0)之中断方式———————————————————from:blog.csdn.net/tigerjbE

串口编程(UART0)之中止办法

———————————————————

from:blog.csdn.net/tigerjb

Email:jibo.tiger@gmail.com

———————————————————

三.中止办法的串口编程

1.用中止办法编写串口程序由那几部分组成

2.硬件上的支撑

1>UART0发送FIFO缓冲区

A.UART0含有1个16字节的发送FIFO缓冲区

B.U0THR是UART0发送FIFO的最高字节

C.UART的发送FIFO是一向使能的

2>UART0接纳FIFO缓冲区

A.UART0含有一个16字节的接纳FIFO缓冲区。

B.软件设置接纳FIFO缓冲区的触发字节。

3>中止接口:UART0的中止接口包括中止使能寄存器(U0IER)和中止标识寄存器(U0IIR)。

lU0IIR:供给状况码用于指示一个挂起中止的中止源和优先级。

lU0IER能够操控UART0的4个中止源。

4>UART0有4个中止源:

A.RLS(接纳线状况)中止:

(1)优先级最高

(2)它在以下条件发生时发生过错

l帧过错(FE)

l溢出过错(OE)

l奇偶过错(PE)

l距离中止(BI)

注:

Ø能够经过检查U0LSR[4:1]中的值看到发生该中止的过错条件

Ø读取U0LSR寄存器时铲除该中止。

B.RDA(接纳数据可用)中止:

(1)与CTI中止并排第二优先级。

(2)在以下状况触发中止:

l当接纳的有用数据抵达接纳FIFO设置寄存器(U0FCR)中设置的触发点时,RDA被激活。当接纳FIFO中的有用数据少于触发点时,RDA复位。

l中止过程:

1>移位寄存器(U0RSR)从RxD引脚接纳串行数据后,送入接纳FIFO中

2>当接纳FIFO中的有用数据数量抵达预订的触发点时,置位RDA中止。

3>从U0RBR寄存器中读取FIFO中最早抵达的数据,当FIFO中的有用数据小于触发点时,清零RDA中止。

C.CTI(字符超时指示)中止

(1)优先级为2.

(2)在以下状况发生中止:

l当接纳FIFO中的有用数据少于预订的触发点数量时,假如在必定时刻内仍没有接纳到新的数据,那将触发该中止。

(3)上面的时刻指的是:3.5~4.5个字节所需求的时刻。

(4)对接纳FIFO的任何操作都会清零该中止标志。

(5)中止过程:

l移位寄存器(U0RSR)从RxD0引脚接纳串行数据后,送入接纳FIFO中。

l当接纳FIFO中的有用数据少于触发个数,但假如长时刻没有数据抵达,则触发CTI中止。

l从U0RBR中读取接纳FIFO中的数据,或许有新的数据送入接纳FIFO,都将清零CTI中止。

注:

Ø3.5~4.5个字节的时刻:指在串口当时的波特率下,发送3.5~4.5个字节所需求的时刻。

Ø当接纳FIFO中寄存多个数据,从U0RBR读取数据,可是没有读完一切数据,那么在经过3.5~4.5个字节的时刻后触发CTI中止。

D.THRE(发送)中止

(1)优先级为第三级优先级。

(2)当FIFO为空并且在以下状况触发中止:

l体系启动时,尽管发送FIFO为空,但不会发生THRE中止。

l在上一次发生THRE中止后,向发送FIFO中写入1个字节数据,将在一个字节加上一个中止位后发生THRE中止

(because:假如发送移位寄存器为空,那么写入发送FIFO的数据将直接进入发送移位寄存器。此刻发送FIFO依然为空,假如当即发生THRE中止,就会影响紧接着写入发送FIFO的数据。

所以在发送完该一个字节以及一个中止位后,才发生THRE中止。

l假如在发送FIFO中有过两个字节以上的数据,可是现在发送FIFO为空时,将当即触发THRE中止。

l当THRE中止为当时有用的最高优先级中止时,往U0THR写数或许对U0IIR的读操作,将使THRE中止复位

咱们来看看这些中止源与存储器之间的联系:

注:

Ø由上图可知:UART0有4个中止源:分别是RLS(线状况)中止,RDA(接纳数据)中止,CTI(字符超时)中止,THRE(发送数据)中止。

Ø4个中止源的优先级如下图所示:

3.串口中止接纳初始化

1>串口中止接纳初始化流程

l设置I/O引脚连接到UART0

l置位除数锁存位,装备UART0帧数据格局

l依据波特率核算分频值

l设置波特率

l铲除除数锁存位,并设置作业形式

l使能FIFO,并设置触发点

l答应RBR中止

注:咱们能够发现与轮训办法比较,中止办法仅仅增加了使能FIFO,并设置中止触发点和答应RBR中止两步。

2>中止串口初始化需求装备的寄存器

(与轮循办法装备办法相同的寄存器在此处不在触及)

lU0FCR(FIFO操控寄存器):U0FCR操控UART0 Rx和Tx FIFO的操作。

lU0IER(中止使能寄存器):U0IER用于使能4个UART0中止源。

3>详细寄存器的装备

(1)U0FCR

A效果:操控UART0 Rx和Tx的操作。

B长度:8位寄存器。

C:每一位的意义:

l第0位:表明FIFO使能

置1:表明使能对UART0 Rx和Tx的FIFO以及U0FCR[7:1]的拜访。

置0:表明不能运用Rx和Tx的FIFO以及步能对U0FCR[7:1]的拜访。

注:该位的任何改变都将使UART0 FIFO清空。

l第1位:表明Rx FIFO的复位。

置1:会清零UART0 RxFIFO中的一切字节并复位指针逻辑。该位主动清零。

l第2位:表明Tx FIFO的复位。

置1:会清零UART0 TxFIFO中的一切字节并复位指针逻辑。改位主动清零。

l第[5:3]位:保存位,用户不能对其进行操作。从保存位读出的值未被界说。

l第[7:6]位:表明Rx触发挑选

00:触发点为0(默以为1字节)

01:触发点为1(默以为4字节)

10:触发点为2(默以为8字节)

11:触发点为3(默以为14字节)

注:这两个位决定在激活中止之前,接纳UART0 FIFO有必要写入个字符。

(2)U0IER(中止使能寄存器)

A效果:U0IER用于使能4个UART0中止源

B长度:8位寄存器

C每一位的意义:

l第0位:表明RBR中止使能

置1:使能RDA中止

置0:制止RDA中止

注:U0IEER第零位使能UART0接纳数据可用中止。它还操控(CTI)字符接纳超时中止。

l第1位:表明THRE中止使能

置1:使能THRE中止

置0:制止THRE中止

l第2位:表明Rx线状况中止使能

置1:使能Rx线状况中止

置0:制止RX线状况中止

注:U0IER第二位使能UART0 Rx线状况中止。该中止的状况可从U0LSR[4:1]读出

l第[7:3]位:是保存位

注:用户不能向其写入1.

4>串口初始化程序:

*

*作者:tiger-john

*时刻:2011年1月18日

*称号:UART0_Init

*功用:UART0初始化通讯波特率115200,8位数据位,1位中止位,无奇偶校验

*接纳FIFO触发点为8字节,使能RDR(接纳数据)中止

*进口参数:bps串口波特率

*出口参数:无

/

voidUART0_Init(uint32 bps)

{

uint16Fdiv;

PINSEL0 = (PINSEL0 & ~(0xf) | 0x05) ;//设置UART0的引脚

U0LCR = 0x83;//置为除数锁存位,进行装备

Fdiv = (Fpclk>>4)/bps;

U0DLM = Fdiv>>8;

U0DLL = Fdiv%256;

U0LCR = 0x03;//铲除除数锁存位,并设置作业形式

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

U0IER = 0x01;//答应RBR中止,即接纳中止

}

5.中止初始化

先来看一下UART0和VIC之间的联系:

1>中止初始化流程:

l挑选中止为向量中止或快速中止

l分配中止通道

l设置UART0向量地址

l使能UART0中止

2>关于ARM中止编程办法和寄存器的运用在此不做触及(假如想知道的话,能够看这篇文章http://blog.csdn.net/tigerjb/archive/2010/11/30/6045409.aspx

3>中止初始化程序:

/

*作者:tiger-john

*时刻:2011年1月18日

*称号:Interrupt_Init

*功用:初始化串口中止,给串口中止挑选为向量中止,分配向量通道号1给串口

*进口参数:无

*出口参数:无

/

void Interrupt_Init (void)

{

VICIntSelect = 0x00000000;//设置一切通道为IRQ中止

VICVectCntl1 = (0x20 | 6);// UART0中止通道分配到IRQ slot 1

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

VICIntEnable = 1 << 6;//使能串口中止

}

6.用中止编写接纳函数

1>中止服务函数流程

l铲除串口中止标识寄存器(U0IIR)

l铲除中止标志

l读取接纳FIFO中的数据

2>中止函数服务函数中需求装备的寄存器

(1)U0IIR中止标识寄存器。

l第0位:表明中止挂起

置1:表明没有挂起的中止

置0:表明至少有一个中止挂起

l第[3:1]位:中止标识,这三位表明了对应UART0 Rx FIFO的中止。

001:表明发送中止(THRE)

010:表明接纳数据可用中止(RDA)

011:表明接纳线状况中止(RLS)

110:表明字符超时中止(CTI)

l第[7:4]:是保存位

注:

1.U0IIR供给的状况码可用于指示一个挂起中止的中止源和优先级。

2.在拜访U0IIR过程中,中止被冻住

3.假如在拜访U0IIR时,发生了中止,该中止被记载。在下次拜访U0IIR时能够读出,防止中止的丢掉。

3>中止服务函数程序:

/* *称号:IRQ_UART0()

*功用:串口UART0中止接纳8个字节的数据

*进口参数:无

*出口参数:无

/

uint8rcv_buf[8];// UART0数据接纳缓冲区

void__irq IRQ_UART0(void)

{uint8i;

uint32 data;

data = U0IIR;//铲除中止表明寄存器标志

VICVectAddr = 0;//铲除中止

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

{

rcv_buf[i] = U0RBR;//读取FIFO的数据

}

}

7.看一个总程序:

view plaincopy to clipboardprint?
  1. /Copyright(c)
  2. 西安邮电学院
  3. graduateschool
  4. XNMS实验室
  5. Author:冀博
  6. Time:2011年1月20日
  7. http://blog.csdn.net/tigerjb
  8. ————–FileInfo——————————————————————————-
  9. Filename:UART0_while
  10. LastmodifiedDate:2011-01-20
  11. LastVersion:1.0
  12. Descriptions:经过上位机给串口发送8字节数据,ARM2200接纳到串口数据后,把数据又发送回上位机
  13. ——————————————————————————————————*/
  14. /
  15. Modifiedby:TIGER0-JOHN
  16. Modifieddate:2011-1-21
  17. Version:2.0
  18. Descriptions:测验成功
  19. 在用中止的时分在Startup.S文件中的InitStack子程序中,修正设置
  20. 体系形式仓库处的代码为”MSRCPSR_c,#0x5f”
  21. 测验成功,在上面上发送16进制数时,每个之间用空格离隔
  22. 不加前缀
  23. /
  24. #include”config.h”
  25. uint8recver_buffer[8];
  26. uint8rcv_new;
  27. /
  28. *称号:UART0_Init()
  29. *功用:UART0初始化(通讯波特率115200,8位数据位,
  30. 1位中止位,无奇偶校验)
  31. *进口参数:bps串口波特率
  32. *出口参数:无
  33. /
  34. voidUART0_Init(uint32bps)
  35. {
  36. uint16Fdiv;
  37. PINSEL0=0x00000005;//设置串口引脚
  38. U0LCR=0x83;//置为除数锁存位,进行装备
  39. Fdiv=(Fpclk>>4)/bps;//设置波特率
  40. U0DLM=Fdiv>>8;
  41. U0DLL=Fdiv&0xff;
  42. U0LCR=0x03;//铲除除数锁存位,并设置作业形式形式
  43. U0FCR=0x81;//使能FIFO,并设置触发点为8字节
  44. U0IER=0x01;//答应RBR中止,即接纳中止
  45. }
  46. /*
  47. *称号:IRQ_UART0
  48. *功用:串口UART0中止接纳8个字节的数据
  49. *进口参数:无
  50. *出口参数:无
  51. /
  52. void__irqIRQ_UART0(void)
  53. {uint8i;
  54. if(0x04==(U0IIR&0x0F))
  55. {
  56. rcv_new=1;//设置接纳到新的数据标志,并铲除中止标志位
  57. for(i=0;i<8;i++)
  58. {
  59. recver_buffer[i]=U0RBR;//读取FIFO的数据
  60. }
  61. VICVectAddr=0;
  62. }//铲除中止
  63. }
  64. /
  65. *称号:Interrupt_Init
  66. *功用:初始化串口中止,给串口中止挑选为向量中止,
  67. *分配向量通道号1给串口
  68. *进口参数:无
  69. *出口参数:无
  70. /
  71. voidInterrupt_Init(void)
  72. {
  73. VICIntSelect=0x00000000;//设置一切通道为IRQ中止
  74. VICVectCntl0=0x26;//UART0中止通道分配到IRQslot0,即优先级最高
  75. VICVectAddr0=(int)IRQ_UART0;//设置UART0向量地址
  76. VICIntEnable=0x00000040;//使能UART0中止
  77. }
  78. /
  79. *称号:UART0_SendByte
  80. *功用:向串口发送字节数据,并等候发送结束。
  81. *进口参数:data要发送的数据
  82. *出口参数:无
  83. /
  84. voidUART0_SendByte(uint8data)
  85. {
  86. U0THR=data;
  87. while(0==(U0LSR&0x40));
  88. }
  89. /
  90. *称号:UART0_SendBuf()
  91. *功用:经过串口发送一帧数据
  92. *进口参数:*buffer寄存一帧数据
  93. *出口参数:无
  94. /
  95. voidUART0_SendBuf(uint8*buffer)
  96. {
  97. uint8*pbuffer;
  98. uint8i;
  99. for(pbuffer=buffer,i=0;i<8;i++)
  100. UART0_SendByte(*(pbuffer++));
  101. }
  102. /
  103. *称号:main()函数
  104. *功用:上位机接纳的数据最初两个字符为0x10,0x11,
  105. *则原样输出,否次输出0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27
  106. *进口参数:*buffer寄存一帧数据
  107. *出口参数:无
  108. /
  109. intmain(void)
  110. {
  111. uint8send_buffer[8]={0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27};//界说发送帧缓冲区
  112. UART0_Init(115200);
  113. Interrupt_Init();
  114. while(1)
  115. {
  116. if(1==rcv_new)//是否现已接纳到8Bytes的数据
  117. {
  118. rcv_new=0;//铲除标志
  119. if(0x10==recver_buffer[0]&&0x11==recver_buffer[1])
  120. {
  121. UART0_SendBuf(send_buffer);
  122. }
  123. else
  124. {
  125. UART0_SendBuf(recver_buffer);
  126. }
  127. }
  128. }
  129. return0;
  130. }
  131. /*
  132. EndOfFile
  133. /

四.用中止编写发送函数

1.中止初始化

同上和用中止接纳函数时的中止初始化是相同的

2.串口初始化

1>串口初始化流程:

l设置I/O引脚连接到UART0

l置位除数锁存位,装备UART0帧格局

l依据波特率核算分频值

l设置波特率

l铲除除数锁存位,并设置作业形式

l使能FIFO,并使TxFIFO复位

l使能THRE中止

2>串口初始化函数:

/

*称号:UART0_Init

*功用:UART0初始化通讯波特率115200,8位数据位,1位中止位,无奇偶校验

*使能TxFIFO,和THRE中止

*进口参数:bps串口波特率

*出口参数:无

/

voidUART0_Init(uint32 bps)

{

uint16Fdiv;

PINSEL0 = (PINSEL0 & ~(0xf) | 0x05) ;//设置UART0的引脚

U0LCR = 0x83;//置位除数锁存位,装备UART0帧格局

Fdiv = (Fpclk>>4)/bps;//依据波特率核算分频值

U0DLM = Fdiv>>8;//设置波特率

U0DLL = Fdiv%256;

U0LCR = 0x03;//铲除除数锁存位,并设置作业形式

U0FCR = 0x05;//使能TxFIFO,并使TxFIFO复位

U0IER = 0x02;//使能THRE中止

}

3中止服务函数:

1>中止服务函数流程:

l铲除串口中止标识寄存器

l铲除中止操控标识寄存器

2>中止发送服务函数程序:

/

*称号:UART0_Exception

*功用:串口发送中止

*进口参数:无

*出口参数:data发送的数据

/

void__irq IRQ_UART0(void)

{

uint32 data;

data = U0IIR;//铲除中止表明寄存器标志

VICVectAddr = 0;//铲除中止

}

4.用串口中止发送函数的总程序:

view plaincopy to clipboardprint?
  1. /Copyright(c)
  2. 西安邮电学院
  3. graduateschool
  4. XNMS实验室
  5. Author:冀博
  6. Time:2011年1月20日
  7. http://blog.csdn.net/tigerjb
  8. ————–FileInfo——————————————————————————-
  9. Filename:UART0_while
  10. LastmodifiedDate:2011-01-20
  11. LastVersion:1.0
  12. Descriptions:经过上位机给串口发送8字节数据,ARM2200接纳到串口数据后,用中止办法把数据又发送回上位机
  13. ——————————————————————————————————*/
  14. /
  15. Modifiedby:TIGER0-JOHN
  16. Modifieddate:2011-1-21
  17. Version:2.0
  18. Descriptions:测验成功
  19. 在用中止的时分在Startup.S文件中的InitStack子程序中,修正设置
  20. 体系形式仓库处的代码为”MSRCPSR_c,#0x5f”
  21. 测验成功,在上面上发送16进制数时,每个之间用空格离隔
  22. 不加前缀
  23. /
  24. #include”config.h”
  25. uint8recver_buffer[8];
  26. uint8rcv_new;
  27. /
  28. *称号:UART0_Init
  29. *功用:UART0初始化通讯波特率115200,8位数据位,1位中止位,无奇偶校验
  30. *使能TxFIFO,和THRE中止
  31. *进口参数:bps串口波特率
  32. *出口参数:无
  33. /
  34. voidUART0_Init(uint32bps)
  35. {
  36. uint16Fdiv;
  37. PINSEL0=(PINSEL0&~(0xf)|0x05);//设置UART0的引脚
  38. U0LCR=0x83;//置位除数锁存位,装备UART0帧格局
  39. Fdiv=(Fpclk>>4)/bps;//依据波特率核算分频值
  40. U0DLM=Fdiv>>8;//设置波特率
  41. U0DLL=Fdiv%256;
  42. U0LCR=0x03;//铲除除数锁存位,并设置作业形式
  43. U0FCR=0x05;//使能TxFIFO,并使TxFIFO复位
  44. U0IER=0x02;//使能THRE中止
  45. }
  46. /
  47. *称号:UART0_Exception
  48. *功用:串口发送中止
  49. *进口参数:无
  50. *出口参数:data发送的数据
  51. /
  52. void__irqIRQ_UART0(void)
  53. {
  54. uint32data;
  55. data=U0IIR;//铲除中止表明寄存器标志
  56. VICVectAddr=0;//铲除中止
  57. }
  58. /
  59. *称号:Interrupt_Init
  60. *功用:初始化串口中止,给串口中止挑选为向量中止,
  61. *分配向量通道号1给串口
  62. *进口参数:无
  63. *出口参数:无
  64. /
  65. voidInterrupt_Init(void)
  66. {
  67. VICIntSelect=0x00000000;//设置一切通道为IRQ中止
  68. VICVectCntl0=0x26;//UART0中止通道分配到IRQslot0,即优先级最高
  69. VICVectAddr0=(int)IRQ_UART0;//设置UART0向量地址
  70. V%&&&&&%IntEnable=0x00000040;//使能UART0中止
  71. }
  72. /
  73. *称号:UART0_RcvByte
  74. *功用:用查询办法接纳一字节的数据
  75. *进口参数:无
  76. *出口参数:data要接纳的数据
  77. /
  78. uint8UART0_RcvByte(void)
  79. {
  80. uint8rcv_data;
  81. while((U0LSR&0X01)==0);//等候数据抵达
  82. rcv_data=U0RBR;//从U0RBR中读出接纳到的数据
  83. returnrcv_data;//回来接纳到的数据
  84. }
  85. /
  86. *称号:UART0_RecBuf()
  87. *功用:接纳串口发送过来的帧数据,
  88. *进口参数:*buffer寄存一帧数据
  89. *出口参数:无
  90. /
  91. voidUART0_RecBuf(uint8*buffer)
  92. {
  93. uint8*pbuffer;
  94. uint8i;
  95. for(pbuffer=buffer,i=0;i<8;i++)
  96. {
  97. *(pbuffer++)=UART0_RcvByte();
  98. }
  99. }
  100. /
  101. *称号:main()函数
  102. *功用:上位机接纳的数据最初两个字符为0x10,0x11,
  103. *则原样输出,否次输出0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27
  104. *进口参数:*buffer寄存一帧数据
  105. *出口参数:无
  106. /
  107. intmain(void)
  108. {
  109. uint8i;
  110. uint8send_buffer[8]={0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27};//界说发送帧缓冲区
  111. UART0_Init(115200);
  112. Interrupt_Init();
  113. while(1)
  114. {
  115. UART0_RecBuf(recver_buffer);//接纳8字节数据
  116. if(0x10==recver_buffer[0]&&0x11==recver_buffer[1])
  117. {
  118. for(i=0;i<8;i++)
  119. {
  120. U0THR=send_buffer[i];//用中止发送每次8字节
  121. }
  122. }
  123. else
  124. {
  125. for(i=0;i<8;i++)//用中止发送每次8字节
  126. {
  127. U0THR=recver_buffer[i];
  128. }
  129. }
  130. }
  131. return0;
  132. }
  133. /*
  134. EndOfFile
  135. /

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/fpga/277145.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部