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

ARM中断方式串口编程

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

  1. ------------*/
  2. /
  3. Modifiedby:TIGER0-JOHN
  4. Modifieddate:2011-1-21
  5. Version:2.0
  6. Descriptions:测试成功
  7. 在用中断的时候在Startup.S文件中的InitStack子程序中,修改设置
  8. 系统模式堆栈处的代码为"MSRCPSR_c,#0x5f"
  9. 测试成功,在上面上发送16进制数时,每个之间用空格隔开
  10. 不加前缀
  11. /
  12. #include"config.h"
  13. uint8recver_buffer[8];
  14. uint8rcv_new;
  15. /
  16. *名称:UART0_Init
  17. *功能:UART0初始化通讯波特率115200,8位数据位,1位停止位,无奇偶校验
  18. *使能TxFIFO,和THRE中断
  19. *入口参数:bps串口波特率
  20. *出口参数:无
  21. /
  22. voidUART0_Init(uint32bps)
  23. {
  24. uint16Fdiv;
  25. PINSEL0=(PINSEL0&~(0xf)|0x05);//设置UART0的引脚
  26. U0LCR=0x83;//置位除数锁存位,配置UART0帧格式
  27. Fdiv=(Fpclk>>4)/bps;//根据波特率计算分频值
  28. U0DLM=Fp>>8;//设置波特率
  29. U0DLL=Fdiv%256;
  30. U0LCR=0x03;//清除除数锁存位,并设置工作模式
  31. U0FCR=0x05;//使能TxFIFO,并使TxFIFO复位
  32. U0IER=0x02;//使能THRE中断
  33. }
  34. /
  35. *名称:UART0_Exception
  36. *功能:串口发送中断
  37. *入口参数:无
  38. *出口参数:data发送的数据
  39. /
  40. void__irqIRQ_UART0(void)
  41. {
  42. uint32data;
  43. data=U0IIR;//清除中断表示寄存器标志
  44. VICVectAddr=0;//清除中断
  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_RcvByte
  62. *功能:用查询方式接收一字节的数据
  63. *入口参数:无
  64. *出口参数:data要接收的数据
  65. /
  66. uint8UART0_RcvByte(void)
  67. {
  68. uint8rcv_data;
  69. while((U0LSR&0X01)==0);//等待数据到达
  70. rcv_data=U0RBR;//从U0RBR中读出接收到的数据
  71. returnrcv_data;//返回接收到的数据
  72. }
  73. /
  74. *名称:UART0_RecBuf()
  75. *功能:接收串口发送过来的帧数据,
  76. *入口参数:*buffer存放一帧数据
  77. *出口参数:无
  78. /
  79. voidUART0_RecBuf(uint8*buffer)
  80. {
  81. uint8*pbuffer;
  82. uint8i;
  83. for(pbuffer=buffer,i=0;i<8;i++)
  84. {
  85. *(pbuffer++)=UART0_RcvByte();
  86. }
  87. }
  88. /
  89. *名称:main()函数
  90. *功能:上位机接收的数据开头两个字符为0x10,0x11,
  91. *则原样输出,否次输出0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27
  92. *入口参数:*buffer存放一帧数据
  93. *出口参数:无
  94. /
  95. intmain(void)
  96. {
  97. uint8i;
  98. uint8send_buffer[8]={0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27};//定义发送帧缓冲区
  99. UART0_Init(115200);
  100. Interrupt_Init();
  101. while(1)
  102. {
  103. UART0_RecBuf(recver_buffer);//接收8字节数据
  104. if(0x10==recver_buffer[0]&&0x11==recver_buffer[1])
  105. {
  106. for(i=0;i<8;i++)
  107. {
  108. U0THR=send_buffer[i];//用中断发送每次8字节
  109. }
  110. }
  111. else
  112. {
  113. for(i=0;i<8;i++)//用中断发送每次8字节
  114. {
  115. U0THR=recver_buffer[i];
  116. }
  117. }
  118. }
  119. return0;
  120. }
  121. /*
  122. EndOfFile
  123. /

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

网站地图

Top