当前位置:   article > 正文

AVR单片机-ATMEGA64-UART1串口中断方式_avr 串口中断

avr 串口中断

        简单记录一下如何使用ATMEGA64-UART1串口中断方式。

一、main.c

  1. #include <iom64v.h>
  2. #include <macros.h>
  3. #include <string.h>
  4. #include "uart.h"
  5. void main(void)
  6. {
  7. CLI(); //总中断禁止
  8. uart1_init(); //uart1初始化
  9. SEI(); //总中断允许
  10. puts1("Atmega64 staring.......");
  11. while(1){
  12. }
  13. }

一定要记得开总中断允许:SEI();

 CLI(); //总中断禁止
 uart1_init(); //uart1初始化
 SEI(); //总中断允许

 二、uart.h

  1. #define true 1
  2. #define false 0
  3. #define cMaxRxLength 16
  4. #define cMaxTxLength 100
  5. struct SCI_Buffer
  6. {
  7. unsigned char bRxLength; //已经接收的字符长度
  8. unsigned char bTxLength; //已经发送的字符长度
  9. unsigned char bTxBufferLength; //缓冲区中的字符长度
  10. unsigned char bRxBuffer[cMaxRxLength];
  11. unsigned char bTxBuffer[cMaxTxLength];
  12. };
  13. extern struct SCI_Buffer stSciBuffer;
  14. void uart1_init(void);
  15. char putchar1(char c);
  16. unsigned char getchar1(void);
  17. void puts1(char *s);

三、uart.c

  1. /* Code adapted from Atmel AVR Application Note AVR306
  2. * Interrupt mode driver for UART.
  3. */
  4. #include <iom64v.h>
  5. #include <macros.h>
  6. #include "uart.h"
  7. /***********************************宏定义**********************************/
  8. #define fosc 16000000 //晶振16MHZ,晶振是多少就设多少
  9. #define baud 115200 //波特率 115200
  10. struct SCI_Buffer stSciBuffer;
  11. //********************************************************************
  12. // Function : SciBuffer_Init
  13. // Input : ptr-pointer to SCI Buffer
  14. // Output : none
  15. // Description : Initialization of SCI Buffer
  16. //********************************************************************
  17. void SciBuffer_Init(struct SCI_Buffer *ptr)
  18. {
  19. ptr->bRxLength = 0;
  20. ptr->bTxLength = 0;
  21. ptr->bTxBufferLength = 0;
  22. //memset(ptr->bRxBuffer,0,16);
  23. sprintf(ptr->bRxBuffer,"万里悲秋常作客,");
  24. }
  25. //********************************************************************
  26. // Function : sbGetRxBufferEmptyStatus
  27. // Input : ptr-pointer to SCI Buffer
  28. // Output : Status of SCI TX Buffer
  29. // Description : Check whether the SCI TX Buffer is empty or not
  30. //********************************************************************
  31. unsigned char sbGetRxBufferEmptyStatus(struct SCI_Buffer *ptr)
  32. {
  33. if(ptr->bRxLength == 0)
  34. {
  35. return(true);
  36. }
  37. return(false);
  38. }
  39. //********************************************************************
  40. // Function : SciBuffer_Rx_Reset
  41. // Input : ptr-pointer to SCI Buffer
  42. // Output : none
  43. // Description : Reset RX Buffer Length to zero
  44. //********************************************************************
  45. void SciBuffer_Rx_Reset(struct SCI_Buffer *ptr)
  46. {
  47. ptr->bRxLength = 0;
  48. }
  49. //********************************************************************
  50. // Function : SciBuffer_Rx_In
  51. // Input : ptr-pointer to SCI Buffer
  52. // Output : none
  53. // Description : Add data into the SCI RX Buffer
  54. //********************************************************************
  55. void SciBuffer_Rx_In(struct SCI_Buffer *ptr,unsigned char bData)
  56. {
  57. if(ptr->bRxLength < cMaxRxLength)
  58. {
  59. ptr->bRxBuffer[ptr->bRxLength] = bData;
  60. ptr->bRxLength++;
  61. }
  62. else
  63. {
  64. ptr->bRxBuffer[0] = bData;
  65. ptr->bRxLength = 1;
  66. }
  67. }
  68. //38400
  69. /****************************************************************************
  70. 函数功能:uart1初始化程序
  71. 入口参数:
  72. 出口参数:
  73. 注:只开了接收中断
  74. ****************************************************************************/
  75. void uart1_init(void)
  76. {
  77. UCSR1A = 0x00;
  78. UCSR1B = 0x00;//设置波特率前,要关闭USART0的所有使用,包括使能和中断.
  79. UCSR1C = (1<<UCSZ11)|(1<<UCSZ10); //异步 8-bit ,停止位1位
  80. UBRR1L=(fosc/16/(baud+1))%256;
  81. UBRR1H=(fosc/16/(baud+1))/256;
  82. //RXCIE1-RX完成中断,
  83. UCSR1B =(1<<RXCIE1)|(1<<RXEN1)|(1<<TXEN1); //位4—RXEN接收使能,置为后将启动USART接收器 位3—TXEN:发送使能,置为后将启动USART发送器
  84. UCSR1B |= 0x80;//上一条语句已经包括了
  85. SciBuffer_Init(&stSciBuffer);
  86. }
  87. //********************************************************************
  88. // Function : UART_RX_DATA
  89. // Input : none
  90. // Output : data received
  91. // Description : Get Received Data from Register
  92. //********************************************************************
  93. unsigned char UART_RX_DATA(void)
  94. {
  95. //while(!(UCSR1A& (1<<RXC1)));
  96. return UDR1;
  97. }
  98. //********************************************************************
  99. // Function : sUART_RX_ISR
  100. // Input : none
  101. // Output : none
  102. // Description : UART RX Interrupt Service Routine
  103. //********************************************************************
  104. //iv_USART1_RX 是UART1的接收中断号 ,ATMEGA64 的UART1接收中断号应该是31
  105. #pragma interrupt_handler sUART_RX_ISR:iv_USART1_RX //31
  106. void sUART_RX_ISR(void)
  107. {
  108. unsigned char data;
  109. //step1:read receive register to clear interrupt flag
  110. data = UART_RX_DATA();
  111. //step2:report event or store received char to buffer
  112. if((data == 0x0A) || (data == 0x0D))
  113. {
  114. if(sbGetRxBufferEmptyStatus(&stSciBuffer) == false)
  115. {
  116. SciBuffer_Rx_Reset(&stSciBuffer);
  117. //sSet_SCI_Event(1);
  118. }
  119. }
  120. else
  121. {
  122. SciBuffer_Rx_In(&stSciBuffer,data);
  123. putchar1(data);
  124. }
  125. }
  126. /****************************************************************************
  127. 函数功能:uart1发送单字节数据
  128. 入口参数:c
  129. 出口参数:
  130. ****************************************************************************/
  131. char putchar1(char c)
  132. {
  133. while (!(UCSR1A&(1<<UDRE1)));
  134. UDR1=c;
  135. return c;
  136. }
  137. /****************************************************************************
  138. 函数功能:uart1接收单字节数据
  139. 入口参数:
  140. 出口参数:
  141. ****************************************************************************/
  142. unsigned char getchar1(void)
  143. {
  144. while(!(UCSR1A& (1<<RXC1)));
  145. return UDR1;
  146. }
  147. /****************************************************************************
  148. 函数功能:uart1发送字符串数据
  149. 入口参数:*s
  150. 出口参数:
  151. ****************************************************************************/
  152. void puts1(char *s)
  153. {
  154. while (*s)
  155. {
  156. putchar1(*s);
  157. s++;
  158. }
  159. putchar1(0x0a);
  160. putchar1(0x0d);
  161. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/635807
推荐阅读
相关标签
  

闽ICP备14008679号