微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM中断方式串口编程

ARM中断方式串口编程

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

  1. 程序中,修改设置
  2. 系统模式堆栈处的代码为"MSRCPSR_c,#0x5f"
  3. 测试成功,在上面上发送16进制数时,每个之间用空格隔开
  4. 不加前缀
  5. /
  6. #include"config.h"
  7. uint8recver_buffer[8];
  8. uint8rcv_new;
  9. /
  10. *名称:UART0_Init()
  11. *功能:UART0初始化(通讯波特率115200,8位数据位,
  12. 1位停止位,无奇偶校验)
  13. *入口参数:bps串口波特率
  14. *出口参数:无
  15. /
  16. voidUART0_Init(uint32bps)
  17. {
  18. uint16Fdiv;
  19. PINSEL0=0x00000005;//设置串口引脚
  20. U0LCR=0x83;//置为除数锁存位,进行配置
  21. Fdiv=(Fpclk>>4)/bps;//设置波特率
  22. U0DLM=Fp>>8;
  23. U0DLL=Fdiv&0xff;
  24. U0LCR=0x03;//清除除数锁存位,并设置工作模式模式
  25. U0FCR=0x81;//使能FIFO,并设置触发点为8字节
  26. U0IER=0x01;//允许RBR中断,即接收中断
  27. }
  28. /*
  29. *名称:IRQ_UART0
  30. *功能:串口UART0中断接收8个字节的数据
  31. *入口参数:无
  32. *出口参数:无
  33. /
  34. void__irqIRQ_UART0(void)
  35. {uint8i;
  36. if(0x04==(U0IIR&0x0F))
  37. {
  38. rcv_new=1;//设置接收到新的数据标志,并清除中断标志位
  39. for(i=0;i<8;i++)
  40. {
  41. recver_buffer[i]=U0RBR;//读取FIFO的数据
  42. }
  43. VICVectAddr=0;
  44. }//清除中断
  45. }
  46. /
  47. *名称:Interrupt_Init
  48. *功能:初始化串口中断,给串口中断选择为向量中断,
  49. *分配向量通道号1给串口
  50. *入口参数:无
  51. *出口参数:无
  52. /
  53. voidInterrupt_Init(void)
  54. {
  55. VICIntSelect=0x00000000;//设置所有通道为IRQ中断
  56. VICVectCntl0=0x26;//UART0中断通道分配到IRQslot0,即优先级最高
  57. VICVectAddr0=(int)IRQ_UART0;//设置UART0向量地址
  58. VICIntEnable=0x00000040;//使能UART0中断
  59. }
  60. /
  61. *名称:UART0_SendByte
  62. *功能:向串口发送字节数据,并等待发送完毕。
  63. *入口参数:data要发送的数据
  64. *出口参数:无
  65. /
  66. voidUART0_SendByte(uint8data)
  67. {
  68. U0THR=data;
  69. while(0==(U0LSR&0x40));
  70. }
  71. /
  72. *名称:UART0_SendBuf()
  73. *功能:通过串口发送一帧数据
  74. *入口参数:*buffer存放一帧数据
  75. *出口参数:无
  76. /
  77. voidUART0_SendBuf(uint8*buffer)
  78. {
  79. uint8*pbuffer;
  80. uint8i;
  81. for(pbuffer=buffer,i=0;i<8;i++)
  82. UART0_SendByte(*(pbuffer++));
  83. }
  84. /
  85. *名称:main()函数
  86. *功能:上位机接收的数据开头两个字符为0x10,0x11,
  87. *则原样输出,否次输出0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27
  88. *入口参数:*buffer存放一帧数据
  89. *出口参数:无
  90. /
  91. intmain(void)
  92. {
  93. uint8send_buffer[8]={0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27};//定义发送帧缓冲区
  94. UART0_Init(115200);
  95. Interrupt_Init();
  96. while(1)
  97. {
  98. if(1==rcv_new)//是否已经接收到8Bytes的数据
  99. {
  100. rcv_new=0;//清除标志
  101. if(0x10==recver_buffer[0]&&0x11==recver_buffer[1])
  102. {
  103. UART0_SendBuf(send_buffer);
  104. }
  105. else
  106. {
  107. UART0_SendBuf(recver_buffer);
  108. }
  109. }
  110. }
  111. return0;
  112. }
  113. /*
  114. EndOfFile
  115. /

四.用中断编写发送函数

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 = Fp>>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. ---------------------------------------------

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

网站地图

Top