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


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

    一、main.c

    1. #include
    2. #include
    3. #include
    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
    5. #include
    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<1<//异步 8-bit ,停止位1位
    80. UBRR1L=(fosc/16/(baud+1))%256;
    81. UBRR1H=(fosc/16/(baud+1))/256;
    82. //RXCIE1-RX完成中断,
    83. UCSR1B =(1<1<1<//位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<
    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<
    134. UDR1=c;
    135. return c;
    136. }
    137. /****************************************************************************
    138. 函数功能:uart1接收单字节数据
    139. 入口参数:
    140. 出口参数:
    141. ****************************************************************************/
    142. unsigned char getchar1(void)
    143. {
    144. while(!(UCSR1A& (1<
    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. }

  • 相关阅读:
    Redis 主从搭建
    机器学习(二十七):批量机器学习算法训练选择与调优(进阶)
    jxTMS设计思想之流程追溯
    内存取证之NSSCTF-OtterCTF 2018(复现赛)
    Hive的文件合并
    Spring @Configuration 注解解析原理
    十、Ajax&Axios
    2024最新华为OD机试(C卷+D卷)真题目录+使用说明+在线评测
    前后端分离项目-基于springboot+vue的图书馆管理系统的设计与实现(内含代码+文档+报告)
    制作一个简单HTML传统端午节日网页(HTML+CSS)7页 带报告
  • 原文地址:https://blog.csdn.net/weixin_44067125/article/details/133938591