This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Getting FileSystem example working without ULINK

Hello,

I am trying FileSystem example on FRDM K64F. However I can't get it working without ULINK. It says I need it in order to get it working. Is there any work around? Can I use serial port instead to INPUT/OUTPUT commands. Any help will be appreciated! I just tried a simple printf but can't get it out to serial port or debug printf viewer.

Parents
  • Thanks for directions. It seems I made good progress. But I am still not able to see output.
    Used retarget template you provided. Added stdout_UART.c/stdin_UART/stderr_UART.c in
    project using templates. Now changed the functions in retarget.c to use them. Configured UART1 to
    be used in these function and then enabled UART1 in RTE_Device.c. I added below code
    to init UART. I can see them initialized properly as no error returned.
    But still I can't see printf output in serial viewer connect on same baud rate
    I configured. Based LED blicking seems like it's output but not sure where to see.
    I have serial viewer connected but nothing there. Not sure what I am missing.
    Can you please advise? Please note I am using FRDM K64F with MDK latest.

    status = stdout_init (); if(!status) { status = stdin_init (); if(!status) { status = stderr_init (); if(status){ printf ("Error Initializing stderr 0x%x\n> ", status); } else { printf ("All STDIO completed 0x%x\n> ", status); } } }

    UART init for stdout:

    /*----------------------------------------------------------------------------- * Name: stdout_USART.c * Purpose: STDOUT USART Template * Rev.: 1.0.0 *-----------------------------------------------------------------------------*/

    #include "Driver_USART.h"

    //-------- <<< Use Configuration Wizard in Context Menu >>> --------------------

    // <h>STDOUT USART Interface

    // <o>Connect to hardware via Driver_USART# <0-255>
    // Select driver control block for USART interface
    #define USART_DRV_NUM 1

    // <o>Baudrate
    #define USART_BAUDRATE 115200

    // </h>

    #define _USART_Driver_(n) Driver_USART##n
    #define USART_Driver_(n) _USART_Driver_(n)

    extern ARM_DRIVER_USART USART_Driver_(USART_DRV_NUM);
    #define ptrUSART (&USART_Driver_(USART_DRV_NUM))

    /** Initialize stdout

    \return 0 on success, or -1 on error.
    */
    int stdout_init (void) { int32_t status;

    status = ptrUSART->Initialize(NULL); if (status != ARM_DRIVER_OK) return (-1);

    status = ptrUSART->PowerControl(ARM_POWER_FULL); if (status != ARM_DRIVER_OK) return (-1);

    status = ptrUSART->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_DATA_BITS_8 | ARM_USART_PARITY_NONE | ARM_USART_STOP_BITS_1 | ARM_USART_FLOW_CONTROL_NONE, USART_BAUDRATE); if (status != ARM_DRIVER_OK) return (-1);

    status = ptrUSART->Control(ARM_USART_CONTROL_TX, 1); if (status != ARM_DRIVER_OK) return (-1);

    return (0);
    }

    /** Put a character to the stdout

    \param[in] ch Character to output \return The character written, or -1 on write error.
    */
    int stdout_putchar (int ch) { uint8_t buf[1];

    buf[0] = ch; if (ptrUSART->Send(buf, 1) != ARM_DRIVER_OK) { return (-1); } while (ptrUSART->GetTxCount() != 1); return (ch);
    }

    Here is my retarget.c:

    /******************************************************************************/
    /* RETARGET.C: 'Retarget' layer for target-dependent low level functions */
    /******************************************************************************/
    /* This file is part of the uVision/ARM development tools. */
    /* Copyright (c) 2005 Keil Software. All rights reserved. */
    /* This software may only be used under the terms of a valid, current, */
    /* end user licence from KEIL for a compatible version of KEIL software */
    /* development tools. Nothing else gives you the right to use this software. */
    /******************************************************************************/

    #include <stdio.h>
    #include <time.h>
    #include <rt_misc.h>

    #pragma import(__use_no_semihosting_swi)

    extern int stdout_putchar(int ch);
    extern int stdin_getchar(void);
    extern long timeval;

    struct __FILE { int handle; /* Add whatever you need here */ };
    //FILE __stdout;
    //FILE __stdin;

    int fputc(int ch, FILE *f) { return (stdout_putchar(ch));
    }

    int fgetc(FILE *f) { return (stdout_putchar(stdin_getchar()));
    }

    int ferror(FILE *f) { /* Your implementation of ferror */ return EOF;
    }

    void _ttywrch(int ch) { stdout_putchar (ch);
    }

    void _sys_exit(int return_code) { while (1); /* endless loop */
    }

Reply
  • Thanks for directions. It seems I made good progress. But I am still not able to see output.
    Used retarget template you provided. Added stdout_UART.c/stdin_UART/stderr_UART.c in
    project using templates. Now changed the functions in retarget.c to use them. Configured UART1 to
    be used in these function and then enabled UART1 in RTE_Device.c. I added below code
    to init UART. I can see them initialized properly as no error returned.
    But still I can't see printf output in serial viewer connect on same baud rate
    I configured. Based LED blicking seems like it's output but not sure where to see.
    I have serial viewer connected but nothing there. Not sure what I am missing.
    Can you please advise? Please note I am using FRDM K64F with MDK latest.

    status = stdout_init (); if(!status) { status = stdin_init (); if(!status) { status = stderr_init (); if(status){ printf ("Error Initializing stderr 0x%x\n> ", status); } else { printf ("All STDIO completed 0x%x\n> ", status); } } }

    UART init for stdout:

    /*----------------------------------------------------------------------------- * Name: stdout_USART.c * Purpose: STDOUT USART Template * Rev.: 1.0.0 *-----------------------------------------------------------------------------*/

    #include "Driver_USART.h"

    //-------- <<< Use Configuration Wizard in Context Menu >>> --------------------

    // <h>STDOUT USART Interface

    // <o>Connect to hardware via Driver_USART# <0-255>
    // Select driver control block for USART interface
    #define USART_DRV_NUM 1

    // <o>Baudrate
    #define USART_BAUDRATE 115200

    // </h>

    #define _USART_Driver_(n) Driver_USART##n
    #define USART_Driver_(n) _USART_Driver_(n)

    extern ARM_DRIVER_USART USART_Driver_(USART_DRV_NUM);
    #define ptrUSART (&USART_Driver_(USART_DRV_NUM))

    /** Initialize stdout

    \return 0 on success, or -1 on error.
    */
    int stdout_init (void) { int32_t status;

    status = ptrUSART->Initialize(NULL); if (status != ARM_DRIVER_OK) return (-1);

    status = ptrUSART->PowerControl(ARM_POWER_FULL); if (status != ARM_DRIVER_OK) return (-1);

    status = ptrUSART->Control(ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_DATA_BITS_8 | ARM_USART_PARITY_NONE | ARM_USART_STOP_BITS_1 | ARM_USART_FLOW_CONTROL_NONE, USART_BAUDRATE); if (status != ARM_DRIVER_OK) return (-1);

    status = ptrUSART->Control(ARM_USART_CONTROL_TX, 1); if (status != ARM_DRIVER_OK) return (-1);

    return (0);
    }

    /** Put a character to the stdout

    \param[in] ch Character to output \return The character written, or -1 on write error.
    */
    int stdout_putchar (int ch) { uint8_t buf[1];

    buf[0] = ch; if (ptrUSART->Send(buf, 1) != ARM_DRIVER_OK) { return (-1); } while (ptrUSART->GetTxCount() != 1); return (ch);
    }

    Here is my retarget.c:

    /******************************************************************************/
    /* RETARGET.C: 'Retarget' layer for target-dependent low level functions */
    /******************************************************************************/
    /* This file is part of the uVision/ARM development tools. */
    /* Copyright (c) 2005 Keil Software. All rights reserved. */
    /* This software may only be used under the terms of a valid, current, */
    /* end user licence from KEIL for a compatible version of KEIL software */
    /* development tools. Nothing else gives you the right to use this software. */
    /******************************************************************************/

    #include <stdio.h>
    #include <time.h>
    #include <rt_misc.h>

    #pragma import(__use_no_semihosting_swi)

    extern int stdout_putchar(int ch);
    extern int stdin_getchar(void);
    extern long timeval;

    struct __FILE { int handle; /* Add whatever you need here */ };
    //FILE __stdout;
    //FILE __stdin;

    int fputc(int ch, FILE *f) { return (stdout_putchar(ch));
    }

    int fgetc(FILE *f) { return (stdout_putchar(stdin_getchar()));
    }

    int ferror(FILE *f) { /* Your implementation of ferror */ return EOF;
    }

    void _ttywrch(int ch) { stdout_putchar (ch);
    }

    void _sys_exit(int return_code) { while (1); /* endless loop */
    }

Children
  • Thanks again. I was able to figure out. I had to change to UART0.
    Now I can see IN/OUT but I have issue in INPUT. It doesn't flush the characters on ENTER.
    SO next time take last character entered. Below is my getc function and I use scanf to take string in.

    int fgetc(FILE *f) { int ch; ch = stdin_getchar(); fflush(stdin); stdout_putchar(ch); fflush(stdin); return ch;
    }

  • Thanks again. What I found is it only happens if in debug mode.
    If I take out of debug mode and connect board through serial,
    then is no issue at all. I am using CMSIS-DAP as a debugger.
    As I said issue is only with input. I have core clock frequency
    set to 120MHz. Operating system is set to RTX Kernel.
    Do I need to do some other debug setting to avoid this mis-behavior?