dbgu.c
上传用户:xukun0987
上传日期:2022-07-16
资源大小:216k
文件大小:6k
源码类别:

微处理器开发

开发平台:

C/C++

  1. /* ----------------------------------------------------------------------------
  2.  *         ATMEL Microcontroller Software Support 
  3.  * ----------------------------------------------------------------------------
  4.  * Copyright (c) 2008, Atmel Corporation
  5.  *
  6.  * All rights reserved.
  7.  *
  8.  * Redistribution and use in source and binary forms, with or without
  9.  * modification, are permitted provided that the following conditions are met:
  10.  *
  11.  * - Redistributions of source code must retain the above copyright notice,
  12.  * this list of conditions and the disclaimer below.
  13.  *
  14.  * Atmel's name may not be used to endorse or promote products derived from
  15.  * this software without specific prior written permission.
  16.  *
  17.  * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
  18.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  19.  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
  20.  * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
  21.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  22.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
  23.  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  24.  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  25.  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  26.  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27.  * ----------------------------------------------------------------------------
  28.  */
  29. //------------------------------------------------------------------------------
  30. //         Headers
  31. //------------------------------------------------------------------------------
  32. #include "dbgu.h"
  33. #include <stdarg.h>
  34. #include <board.h>
  35. //------------------------------------------------------------------------------
  36. //         Global functions
  37. //------------------------------------------------------------------------------
  38. //------------------------------------------------------------------------------
  39. /// Initializes the DBGU with the given parameters, and enables both the
  40. /// transmitter and the receiver. The mode parameter contains the value of the
  41. /// DBGU_MR register.
  42. /// Value DBGU_STANDARD can be used for mode to get the most common configuration
  43. /// (i.e. aysnchronous, 8bits, no parity, 1 stop bit, no flow control).
  44. /// param mode  Operating mode to configure.
  45. /// param baudrate  Desired baudrate (e.g. 115200).
  46. /// param mck  Frequency of the system master clock in Hz.
  47. //------------------------------------------------------------------------------
  48. void DBGU_Configure(
  49.     unsigned int mode,
  50.     unsigned int baudrate,
  51.     unsigned int mck)
  52. {   
  53.     // Reset & disable receiver and transmitter, disable interrupts
  54.     AT91C_BASE_DBGU->DBGU_CR = AT91C_US_RSTRX | AT91C_US_RSTTX;
  55.     AT91C_BASE_DBGU->DBGU_IDR = 0xFFFFFFFF;
  56.     
  57.     // Configure baud rate
  58.     AT91C_BASE_DBGU->DBGU_BRGR = mck / (baudrate * 16);
  59.     
  60.     // Configure mode register
  61.     AT91C_BASE_DBGU->DBGU_MR = mode;
  62.     
  63.     // Disable DMA channel
  64.     AT91C_BASE_DBGU->DBGU_PTCR = AT91C_PDC_RXTDIS | AT91C_PDC_TXTDIS;
  65.     // Enable receiver and transmitter
  66.     AT91C_BASE_DBGU->DBGU_CR = AT91C_US_RXEN | AT91C_US_TXEN;
  67. }
  68. //------------------------------------------------------------------------------
  69. /// Outputs a character on the DBGU line.
  70. /// note This function is synchronous (i.e. uses polling).
  71. /// param c  Character to send.
  72. //------------------------------------------------------------------------------
  73. void DBGU_PutChar(unsigned char c)
  74. {
  75.     // Wait for the transmitter to be ready
  76.     while ((AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_TXEMPTY) == 0);
  77.     
  78.     // Send character
  79.     AT91C_BASE_DBGU->DBGU_THR = c;
  80.     
  81.     // Wait for the transfer to complete
  82.     while ((AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_TXEMPTY) == 0);
  83. }
  84. //------------------------------------------------------------------------------
  85. /// Return 1 if a character can be read in DBGU
  86. //------------------------------------------------------------------------------
  87. unsigned int DBGU_IsRxReady()
  88. {
  89.     return (AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_RXRDY);
  90. }
  91. //------------------------------------------------------------------------------
  92. /// Reads and returns a character from the DBGU.
  93. /// note This function is synchronous (i.e. uses polling).
  94. /// return Character received.
  95. //------------------------------------------------------------------------------
  96. unsigned char DBGU_GetChar(void)
  97. {
  98.     while ((AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_RXRDY) == 0);
  99.     return AT91C_BASE_DBGU->DBGU_RHR;
  100. }
  101. #ifndef NOFPUT
  102. #include <stdio.h>
  103. //------------------------------------------------------------------------------
  104. /// exclude
  105. /// Implementation of fputc using the DBGU as the standard output. Required
  106. /// for printf().
  107. /// param c  Character to write.
  108. /// param pStream  Output stream.
  109. /// param The character written if successful, or -1 if the output stream is
  110. /// not stdout or stderr.
  111. //------------------------------------------------------------------------------
  112. signed int fputc(signed int c, FILE *pStream)
  113. {
  114.     if ((pStream == stdout) || (pStream == stderr)) {
  115.     
  116.         DBGU_PutChar(c);
  117.         return c;
  118.     }
  119.     else {
  120.         return EOF;
  121.     }
  122. }
  123. //------------------------------------------------------------------------------
  124. /// exclude
  125. /// Implementation of fputs using the DBGU as the standard output. Required
  126. /// for printf(). Does NOT currently use the PDC.
  127. /// param pStr  String to write.
  128. /// param pStream  Output stream.
  129. /// return Number of characters written if successful, or -1 if the output
  130. /// stream is not stdout or stderr.
  131. //------------------------------------------------------------------------------
  132. signed int fputs(const char *pStr, FILE *pStream)
  133. {
  134.     signed int num = 0;
  135.     while (*pStr != 0) {
  136.         if (fputc(*pStr, pStream) == -1) {
  137.             return -1;
  138.         }
  139.         num++;
  140.         pStr++;
  141.     }
  142.     return num;
  143. }
  144. #undef putchar
  145. //------------------------------------------------------------------------------
  146. /// exclude
  147. /// Outputs a character on the DBGU.
  148. /// param c  Character to output.
  149. /// return The character that was output.
  150. //------------------------------------------------------------------------------
  151. signed int putchar(signed int c)
  152. {
  153.     return fputc(c, stdout);
  154. }
  155. #endif //#ifndef NOFPUT