- максимально убрана зависимость от HAL - можно использовать и без него, чисто на cmsis - документирован uart - документирован spi - добавлены примеры использования в general_periph - всякие фиксы документации
		
			
				
	
	
		
			394 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			394 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*********************************************************************
 | |
| *                    SEGGER Microcontroller GmbH                     *
 | |
| *                        The Embedded Experts                        *
 | |
| **********************************************************************
 | |
| *                                                                    *
 | |
| *            (c) 1995 - 2021 SEGGER Microcontroller GmbH             *
 | |
| *                                                                    *
 | |
| *       www.segger.com     Support: support@segger.com               *
 | |
| *                                                                    *
 | |
| **********************************************************************
 | |
| *                                                                    *
 | |
| *       SEGGER RTT * Real Time Transfer for embedded targets         *
 | |
| *                                                                    *
 | |
| **********************************************************************
 | |
| *                                                                    *
 | |
| * All rights reserved.                                               *
 | |
| *                                                                    *
 | |
| * SEGGER strongly recommends to not make any changes                 *
 | |
| * to or modify the source code of this software in order to stay     *
 | |
| * compatible with the RTT protocol and J-Link.                       *
 | |
| *                                                                    *
 | |
| * Redistribution and use in source and binary forms, with or         *
 | |
| * without modification, are permitted provided that the following    *
 | |
| * condition is met:                                                  *
 | |
| *                                                                    *
 | |
| * o Redistributions of source code must retain the above copyright   *
 | |
| *   notice, this condition and the following disclaimer.             *
 | |
| *                                                                    *
 | |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND             *
 | |
| * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,        *
 | |
| * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF           *
 | |
| * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE           *
 | |
| * DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR *
 | |
| * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR           *
 | |
| * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT  *
 | |
| * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;    *
 | |
| * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF      *
 | |
| * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT          *
 | |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE  *
 | |
| * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH   *
 | |
| * DAMAGE.                                                            *
 | |
| *                                                                    *
 | |
| **********************************************************************
 | |
| *                                                                    *
 | |
| *       RTT version: 7.54                                           *
 | |
| *                                                                    *
 | |
| **********************************************************************
 | |
| 
 | |
| ---------------------------END-OF-HEADER------------------------------
 | |
| File    : RTT_Syscalls_KEIL.c
 | |
| Purpose : Retargeting module for KEIL MDK-CM3.
 | |
|           Low-level functions for using printf() via RTT
 | |
| Revision: $Rev: 24316 $
 | |
| Notes   : (1) https://wiki.segger.com/Keil_MDK-ARM#RTT_in_uVision
 | |
| ----------------------------------------------------------------------
 | |
| */
 | |
| #if (defined __CC_ARM) || (defined __ARMCC_VERSION)
 | |
| 
 | |
| #include <stdio.h>
 | |
| #include <stdlib.h>
 | |
| #include <string.h>
 | |
| #include <rt_sys.h>
 | |
| #include <rt_misc.h>
 | |
| 
 | |
| #include "SEGGER_RTT.h"
 | |
| /*********************************************************************
 | |
| *
 | |
| *       #pragmas
 | |
| *
 | |
| **********************************************************************
 | |
| */
 | |
| #if __ARMCC_VERSION < 6000000
 | |
| #pragma import(__use_no_semihosting)
 | |
| #endif
 | |
| 
 | |
| #ifdef _MICROLIB
 | |
|   #pragma import(__use_full_stdio)
 | |
| #endif
 | |
| 
 | |
| /*********************************************************************
 | |
| *
 | |
| *       Defines non-configurable
 | |
| *
 | |
| **********************************************************************
 | |
| */
 | |
| 
 | |
| /* Standard IO device handles - arbitrary, but any real file system handles must be
 | |
|    less than 0x8000. */
 | |
| #define STDIN             0x8001    // Standard Input Stream
 | |
| #define STDOUT            0x8002    // Standard Output Stream
 | |
| #define STDERR            0x8003    // Standard Error Stream
 | |
| 
 | |
| /*********************************************************************
 | |
| *
 | |
| *       Public const
 | |
| *
 | |
| **********************************************************************
 | |
| */
 | |
| #if __ARMCC_VERSION < 5000000
 | |
| //const char __stdin_name[]  = "STDIN";
 | |
| const char __stdout_name[] = "STDOUT";
 | |
| const char __stderr_name[] = "STDERR";
 | |
| #endif
 | |
| 
 | |
| /*********************************************************************
 | |
| *
 | |
| *       Public code
 | |
| *
 | |
| **********************************************************************
 | |
| */
 | |
| 
 | |
| /*********************************************************************
 | |
| *
 | |
| *       _ttywrch
 | |
| *
 | |
| *  Function description:
 | |
| *    Outputs a character to the console
 | |
| *
 | |
| *  Parameters:
 | |
| *    c    - character to output
 | |
| *  
 | |
| */
 | |
| void _ttywrch(int c) {
 | |
|   fputc(c, stdout); // stdout
 | |
|   fflush(stdout);
 | |
| }
 | |
| 
 | |
| /*********************************************************************
 | |
| *
 | |
| *       _sys_open
 | |
| *
 | |
| *  Function description:
 | |
| *    Opens the device/file in order to do read/write operations
 | |
| *
 | |
| *  Parameters:
 | |
| *    sName        - sName of the device/file to open
 | |
| *    OpenMode    - This parameter is currently ignored
 | |
| *  
 | |
| *  Return value:
 | |
| *    != 0     - Handle to the object to open, otherwise 
 | |
| *    == 0     -"device" is not handled by this module
 | |
| *
 | |
| */
 | |
| FILEHANDLE _sys_open(const char * sName, int OpenMode) {
 | |
|   (void)OpenMode;
 | |
|   // Register standard Input Output devices.
 | |
|   if (strcmp(sName, __stdout_name) == 0) {
 | |
|     return (STDOUT);
 | |
|   } else if (strcmp(sName, __stderr_name) == 0) {
 | |
|     return (STDERR);
 | |
|   } else
 | |
|   return (0);  // Not implemented
 | |
| }
 | |
| 
 | |
| /*********************************************************************
 | |
| *
 | |
| *       _sys_close
 | |
| *
 | |
| *  Function description:
 | |
| *    Closes the handle to the open device/file
 | |
| *
 | |
| *  Parameters:
 | |
| *    hFile    - Handle to a file opened via _sys_open
 | |
| *  
 | |
| *  Return value:
 | |
| *    0     - device/file closed
 | |
| *
 | |
| */
 | |
| int _sys_close(FILEHANDLE hFile) {
 | |
|   (void)hFile;
 | |
|   return 0;  // Not implemented
 | |
| }
 | |
| 
 | |
| /*********************************************************************
 | |
| *
 | |
| *       _sys_write
 | |
| *
 | |
| *  Function description:
 | |
| *    Writes the data to an open handle.
 | |
| *    Currently this function only outputs data to the console
 | |
| *
 | |
| *  Parameters:
 | |
| *    hFile    - Handle to a file opened via _sys_open
 | |
| *    pBuffer  - Pointer to the data that shall be written
 | |
| *    NumBytes      - Number of bytes to write
 | |
| *    Mode     - The Mode that shall be used
 | |
| *  
 | |
| *  Return value:
 | |
| *    Number of bytes *not* written to the file/device
 | |
| *
 | |
| */
 | |
| int _sys_write(FILEHANDLE hFile, const unsigned char * pBuffer, unsigned NumBytes, int Mode) {
 | |
|   int r = 0;
 | |
| 
 | |
|   (void)Mode;
 | |
|   if (hFile == STDOUT) {
 | |
|     SEGGER_RTT_Write(0, (const char*)pBuffer, NumBytes);
 | |
| 		return 0;
 | |
|   }
 | |
|   return r;
 | |
| }
 | |
| 
 | |
| /*********************************************************************
 | |
| *
 | |
| *       _sys_read
 | |
| *
 | |
| *  Function description:
 | |
| *    Reads data from an open handle.
 | |
| *    Currently this modules does nothing.
 | |
| *
 | |
| *  Parameters:
 | |
| *    hFile    - Handle to a file opened via _sys_open
 | |
| *    pBuffer  - Pointer to buffer to store the read data
 | |
| *    NumBytes      - Number of bytes to read
 | |
| *    Mode     - The Mode that shall be used
 | |
| *  
 | |
| *  Return value:
 | |
| *    Number of bytes read from the file/device
 | |
| *
 | |
| */
 | |
| int _sys_read(FILEHANDLE hFile, unsigned char * pBuffer, unsigned NumBytes, int Mode) {
 | |
|   (void)hFile;
 | |
|   (void)pBuffer;
 | |
|   (void)NumBytes;
 | |
|   (void)Mode;
 | |
|   return (0);  // Not implemented
 | |
| }
 | |
| 
 | |
| /*********************************************************************
 | |
| *
 | |
| *       _sys_istty
 | |
| *
 | |
| *  Function description:
 | |
| *    This function shall return whether the opened file 
 | |
| *    is a console device or not.
 | |
| *
 | |
| *  Parameters:
 | |
| *    hFile    - Handle to a file opened via _sys_open
 | |
| *  
 | |
| *  Return value:
 | |
| *    1       - Device is     a console
 | |
| *    0       - Device is not a console
 | |
| *
 | |
| */
 | |
| int _sys_istty(FILEHANDLE hFile) {
 | |
|   if (hFile > 0x8000) {
 | |
|     return (1);
 | |
|   }
 | |
|   return (0);  // Not implemented
 | |
| }
 | |
| 
 | |
| /*********************************************************************
 | |
| *
 | |
| *       _sys_seek
 | |
| *
 | |
| *  Function description:
 | |
| *    Seeks via the file to a specific position
 | |
| *
 | |
| *  Parameters:
 | |
| *    hFile  - Handle to a file opened via _sys_open
 | |
| *    Pos    - 
 | |
| *  
 | |
| *  Return value:
 | |
| *    int       - 
 | |
| *
 | |
| */
 | |
| int _sys_seek(FILEHANDLE hFile, long Pos) {
 | |
|   (void)hFile;
 | |
|   (void)Pos;
 | |
|   return (0);  // Not implemented
 | |
| }
 | |
| 
 | |
| /*********************************************************************
 | |
| *
 | |
| *       _sys_ensure
 | |
| *
 | |
| *  Function description:
 | |
| *    
 | |
| *
 | |
| *  Parameters:
 | |
| *    hFile    - Handle to a file opened via _sys_open
 | |
| *  
 | |
| *  Return value:
 | |
| *    int       - 
 | |
| *
 | |
| */
 | |
| int _sys_ensure(FILEHANDLE hFile) {
 | |
|   (void)hFile;
 | |
|   return (-1);  // Not implemented
 | |
| }
 | |
| 
 | |
| /*********************************************************************
 | |
| *
 | |
| *       _sys_flen
 | |
| *
 | |
| *  Function description:
 | |
| *    Returns the length of the opened file handle
 | |
| *
 | |
| *  Parameters:
 | |
| *    hFile    - Handle to a file opened via _sys_open
 | |
| *  
 | |
| *  Return value:
 | |
| *    Length of the file
 | |
| *
 | |
| */
 | |
| long _sys_flen(FILEHANDLE hFile) {
 | |
|   (void)hFile;
 | |
|   return (0);  // Not implemented
 | |
| }
 | |
| 
 | |
| /*********************************************************************
 | |
| *
 | |
| *       _sys_tmpnam
 | |
| *
 | |
| *  Function description:
 | |
| *    This function converts the file number fileno for a temporary 
 | |
| *    file to a unique filename, for example, tmp0001.
 | |
| *
 | |
| *  Parameters:
 | |
| *    pBuffer    - Pointer to a buffer to store the name
 | |
| *    FileNum    - file number to convert
 | |
| *    MaxLen     - Size of the buffer
 | |
| *  
 | |
| *  Return value:
 | |
| *     1 - Error
 | |
| *     0 - Success  
 | |
| *
 | |
| */
 | |
| int _sys_tmpnam2(char * pBuffer, int FileNum, unsigned MaxLen) {
 | |
|   (void)pBuffer;
 | |
|   (void)FileNum;
 | |
|   (void)MaxLen;
 | |
|   return (1);  // Not implemented
 | |
| }
 | |
| 
 | |
| /*********************************************************************
 | |
| *
 | |
| *       _sys_command_string
 | |
| *
 | |
| *  Function description:
 | |
| *    This function shall execute a system command.
 | |
| *
 | |
| *  Parameters:
 | |
| *    cmd    - Pointer to the command string
 | |
| *    len    - Length of the string
 | |
| *  
 | |
| *  Return value:
 | |
| *    == NULL - Command was not successfully executed
 | |
| *    == sCmd - Command was passed successfully
 | |
| *
 | |
| */
 | |
| char * _sys_command_string(char * cmd, int len) {
 | |
|   (void)len;
 | |
|   return cmd;  // Not implemented
 | |
| }
 | |
| 
 | |
| /*********************************************************************
 | |
| *
 | |
| *       _sys_exit
 | |
| *
 | |
| *  Function description:
 | |
| *    This function is called when the application returns from main
 | |
| *
 | |
| *  Parameters:
 | |
| *    ReturnCode    - Return code from the main function
 | |
| *  
 | |
| *
 | |
| */
 | |
| void _sys_exit(int ReturnCode) {
 | |
|   (void)ReturnCode;
 | |
|   while (1);  // Not implemented
 | |
| }
 | |
| 
 | |
| #if __ARMCC_VERSION >= 5000000
 | |
| /*********************************************************************
 | |
| *
 | |
| *       stdout_putchar
 | |
| *
 | |
| *  Function description:
 | |
| *    Put a character to the stdout
 | |
| *
 | |
| *  Parameters:
 | |
| *    ch    - Character to output
 | |
| *  
 | |
| *
 | |
| */
 | |
| int stdout_putchar(int ch) {
 | |
|   (void)ch;
 | |
|   return ch;  // Not implemented
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #endif
 | |
| /*************************** End of file ****************************/ |