STM8串口打印调试信息

  • stm8S 串口输出调试信息
    • 自己写的API函数
    • printf 函数重映射

stm8S 串口输出调试信息

自己写的API函数

static void uart1SendMsg(char msg[], uint16_t length)
{
       uint16_t i;

    for (i =0 ;i < length;i++)
    {
        UART1_SendData8(msg[i]);
        while(UART1_GetFlagStatus(UART1_FLAG_TC) == RESET);
    }
}
"`
void myPrintfAscii(char *msg)
{
    while((*msg) != '\0')
    {
        uart1SendMsg(msg, 1);
        msg++;
    }
}

void myPrintfInt8(uint8_t msg[], int length)
{
    char int2Ascii[64];
    uint16_t i, m, intLength;
    int n;
    long temp;

    for (i = 0;i < length;i++)
    {
        m = 0;
        temp = msg[i];
        while(m <= 64)
        {
            int2Ascii[m++] = temp % 10;
            temp /= 10;
            if (0 == temp)
            {
                break;
            }
        }
        intLength = m;
        for (n = intLength - 1;n >= 0;n--)
        {
            int2Ascii[n] += '0';
            uart1SendMsg(int2Ascii + n, 1);
        }
        myPrintfAscii(" ");
    }
}

void myPrintfInt16(uint16_t msg[], int length)
{
    char int2Ascii[64];
    uint16_t i, m, intLength;
    int n;
    long temp;

    for (i = 0;i < length;i++)
    {
        m = 0;
        temp = msg[i];
        while(m <= 64)
        {
            int2Ascii[m++] = temp % 10;
            temp /= 10;
            if (0 == temp)
            {
                break;
            }
        }
        intLength = m;
        for (n = intLength - 1;n >= 0;n--)
        {
            int2Ascii[n] += '0';
            uart1SendMsg(int2Ascii + n, 1);
        }

        myPrintfAscii("\r\n");
    }
}

void myPrintfInt32(uint32_t msg[], int length)
{
    char int2Ascii[64];
    uint16_t i, m, intLength;
    int n;
    long temp;

    for (i = 0;i < length;i++)
    {
        m = 0;
        temp = msg[i];
        while(m <= 64)
        {
            int2Ascii[m++] = temp % 10;
            temp /= 10;
            if (0 == temp)
            {
                break;
            }
        }
        intLength = m;
        for (n = intLength - 1;n >= 0;n--)
        {
            int2Ascii[n] += '0';
            uart1SendMsg(int2Ascii + n, 1);
        }
        myPrintfAscii(" ");
    }
}

上述方法相对笨一点,而且无法打印负数,浮点数。下面直接使用printf标准输入输出函数,将调试信息串口打印出来。

printf 函数重映射

使用printf函数将调试信息用串口打印出来,首先在有printf函数的C文件下包含 #include ,其次将printf函数重定向串口输出1, 参考网址1。贴代码:

重映射代码,myPrintf.c

#include "stm8s.h"
#include 
/*
 由于不同的编译器 putcha 和 getchar 形参和返回值略有不同。
 因此此处采用宏定义的方式区别。
 _RAISONANCE_ 和 _COSMIC_ 这2个宏是由编译器自动添加的预编译宏
*/
#ifdef _RAISONANCE_
 #define PUTCHAR_PROTOTYPE int putchar (char c)
 #define GETCHAR_PROTOTYPE int getchar (void)
#elif defined (_COSMIC_)
 #define PUTCHAR_PROTOTYPE char putchar (char c)
 #define GETCHAR_PROTOTYPE char getchar (void)
#else /* _IAR_ */
 #define PUTCHAR_PROTOTYPE int putchar (int c)
 #define GETCHAR_PROTOTYPE int getchar (void)
#endif /* _RAISONANCE_ */


PUTCHAR_PROTOTYPE
{
 /* 发送一个字符 c 到UART1 */
 UART1_SendData8(c);
 /* 等待发送完毕 */
 while (UART1_GetFlagStatus(UART1_FLAG_TXE) == RESET);
 return (c);
}


GETCHAR_PROTOTYPE
{
 #ifdef _COSMIC_
  char c = 0;
 #else
  int c = 0;
 #endif
 /* 等待新数据到达  */
 while (UART1_GetFlagStatus(UART1_FLAG_RXNE) == RESET);
 /* 读取数据寄存器 */
 c = UART1_ReceiveData8();
 return (c);
}

main.c 主要输出部分:

#include 
void main(void)
{       
    myUart1Init (115200);

    printf ("STM8S Start.\r\n");
    while(1)
    {   
    }

}

你可能感兴趣的:(stm8,嵌入式)