TMS320F28379D笔记3:CPU定时器+SCi串口通信+micro_print

配置一下CPU定时器和Sci串口通信

目录

开发板原理图

文件代码贴出:

#include "my_sci.h"

#include "my_tim.h"

#include "micro_printf.h"

主函数

测试结果:

完整工程:


开发板原理图

在写代码接线之前,我要先吐槽下这 launchpad 的丝印,就是瞎来,害得我浪费极多时间:

板子正面的这些数字,只是序号,根本不代表GPIOxx:


随后看板子反面,这些都是端子J1~8,需要看原理图来对应引脚:


文件代码贴出:

#include "my_sci.h"

初始化SCIA、B、C,三个串口:

|------|---------|----------|-------|
| | TX | RX | Baund |
| SCIA | GPIO 42 | GPIO 43 | 9600 |
| SCIB | GPIO 18 | GPIO 19 | 9600 |
| SCIC | GPIO 56 | GPIO 139 | 9600 |

cpp 复制代码
#include "my_sci.h"
#include "driverlib.h"
#include "device.h"
#include "board.h"
#include "c2000ware_libraries.h"
/*
    SCIA 发送:SCI_writeCharBlockingFIFO(SCIA_BASE, c);
    SCIB 发送:SCI_writeCharBlockingFIFO(SCIB_BASE, c);
    SCIC 发送:SCI_writeCharBlockingFIFO(SCIC_BASE, c);
 * */

void MY_sci_Board_init()
{
    EALLOW;
    MY_sci_PinMux_init();//GPIO的配置
    mySCIA_init();
    mySCIB_init();  // SCIB
    mySCIC_init();  // SCIC
    EDIS;
}



__interrupt void SCIA_RXFIFOISR(void)
{
    uint16_t i;
    SCI_clearInterruptStatus(SCIA_BASE, SCI_INT_RXFF);
    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);

    while(SCI_getRxFIFOStatus(SCIA_BASE)!=SCI_FIFO_RX0)
    {
        i=SCI_readCharNonBlocking(SCIA_BASE);
        SCI_writeCharBlockingFIFO(SCIA_BASE,i);
    }

}
__interrupt void SCIB_RXFIFOISR(void)
{
    uint16_t i;
    SCI_clearInterruptStatus(SCIB_BASE, SCI_INT_RXFF);
    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);

    while(SCI_getRxFIFOStatus(SCIB_BASE) != SCI_FIFO_RX0)
    {
        i = SCI_readCharNonBlocking(SCIB_BASE);
        SCI_writeCharBlockingFIFO(SCIB_BASE, i);
    }
}

__interrupt void SCIC_RXFIFOISR(void)
{
    uint16_t i;
    SCI_clearInterruptStatus(SCIC_BASE, SCI_INT_RXFF);
    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);

    while(SCI_getRxFIFOStatus(SCIC_BASE) != SCI_FIFO_RX0)
    {
        i = SCI_readCharNonBlocking(SCIC_BASE);
        SCI_writeCharBlockingFIFO(SCIC_BASE, i);
    }
}


//*****************************************************************************
//
// PINMUX 配置
//
//*****************************************************************************
void MY_sci_PinMux_init()
{
    //
    // 分配给CPU1的模块的PinMux
    //
    //
    // SCIA -> mySCI0 Pinmux
    //
    GPIO_setMasterCore(mySCI0_SCIRX_GPIO, GPIO_CORE_CPU1);//配置控制核心为CPU1
    GPIO_setPinConfig(mySCI0_SCIRX_PIN_CONFIG);//配置片内外设
    GPIO_setPadConfig(mySCI0_SCIRX_GPIO, GPIO_PIN_TYPE_STD | GPIO_PIN_TYPE_PULLUP);
    GPIO_setQualificationMode(mySCI0_SCIRX_GPIO, GPIO_QUAL_ASYNC);//无采样滤波


    GPIO_setMasterCore(mySCI0_SCITX_GPIO, GPIO_CORE_CPU1);//配置控制核心为CPU1
    GPIO_setPinConfig(mySCI0_SCITX_PIN_CONFIG);//配置片内外设
    GPIO_setPadConfig(mySCI0_SCITX_GPIO, GPIO_PIN_TYPE_STD | GPIO_PIN_TYPE_PULLUP);
    GPIO_setQualificationMode(mySCI0_SCITX_GPIO, GPIO_QUAL_ASYNC);//无采样滤波

    //=========================================================================
    // SCIB 引脚初始化 (TX14, RX15)
    //=========================================================================
    GPIO_setMasterCore(mySCI1_SCIRX_GPIO, GPIO_CORE_CPU1);
    GPIO_setPinConfig(mySCI1_SCIRX_PIN_CONFIG);
    GPIO_setPadConfig(mySCI1_SCIRX_GPIO, GPIO_PIN_TYPE_STD | GPIO_PIN_TYPE_PULLUP);
    GPIO_setQualificationMode(mySCI1_SCIRX_GPIO, GPIO_QUAL_ASYNC);

    GPIO_setMasterCore(mySCI1_SCITX_GPIO, GPIO_CORE_CPU1);
    GPIO_setPinConfig(mySCI1_SCITX_PIN_CONFIG);
    GPIO_setPadConfig(mySCI1_SCITX_GPIO, GPIO_PIN_TYPE_STD | GPIO_PIN_TYPE_PULLUP);
    GPIO_setQualificationMode(mySCI1_SCITX_GPIO, GPIO_QUAL_ASYNC);

    //=========================================================================
    // SCIC 引脚初始化 (TX56, RX57)
    //=========================================================================
    GPIO_setMasterCore(mySCI2_SCIRX_GPIO, GPIO_CORE_CPU1);
    GPIO_setPinConfig(mySCI2_SCIRX_PIN_CONFIG);
    GPIO_setPadConfig(mySCI2_SCIRX_GPIO, GPIO_PIN_TYPE_STD | GPIO_PIN_TYPE_PULLUP);
    GPIO_setQualificationMode(mySCI2_SCIRX_GPIO, GPIO_QUAL_ASYNC);

    GPIO_setMasterCore(mySCI2_SCITX_GPIO, GPIO_CORE_CPU1);
    GPIO_setPinConfig(mySCI2_SCITX_PIN_CONFIG);
    GPIO_setPadConfig(mySCI2_SCITX_GPIO, GPIO_PIN_TYPE_STD | GPIO_PIN_TYPE_PULLUP);
    GPIO_setQualificationMode(mySCI2_SCITX_GPIO, GPIO_QUAL_ASYNC);
}


void mySCIA_init(){
    //配置SCI
    SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SCIA);//使能相应时钟,打开外设

    //一些初始化操作
    //清除所有SCI中断源
    SCI_clearInterruptStatus(mySCI0_BASE, SCI_INT_RXFF | SCI_INT_TXFF | SCI_INT_FE | SCI_INT_OE | SCI_INT_PE | SCI_INT_RXERR | SCI_INT_RXRDY_BRKDT | SCI_INT_TXRDY);
    //清除接收FIFO溢出标志状态
    SCI_clearOverflowStatus(mySCI0_BASE);
    SCI_resetTxFIFO(mySCI0_BASE);//复位TX FIFO
    SCI_resetRxFIFO(mySCI0_BASE);//复位RX FIFO
    SCI_resetChannels(mySCI0_BASE);//重置SCI发送和接收通道

    // 配置SCIA参数
    SCI_setConfig(mySCI0_BASE, DEVICE_LSPCLK_FREQ/2, mySCI0_BAUDRATE, (SCI_CONFIG_WLEN_8|SCI_CONFIG_STOP_ONE|SCI_CONFIG_PAR_NONE));
    //执行一个软件复位的SCI和清除所有报告的接收器状态标志。
    SCI_performSoftwareReset(mySCI0_BASE);// 初始化SCIA及其FIFO

    //配置FIFO
    SCI_setFIFOInterruptLevel(mySCI0_BASE, SCI_FIFO_TX2, SCI_FIFO_RX1);//配置FIFO
    SCI_enableFIFO(mySCI0_BASE);////使能SCIA_FIFO
    //使能 SCI
    SCI_enableModule(mySCI0_BASE);//使能发送和接收。

    //配置中断
    Interrupt_register(INT_SCIA_RX, SCIA_RXFIFOISR);        //注册SCIA_RX
    SCI_enableInterrupt(SCIA_BASE, SCI_INT_RXFF);           //使能RX_FIFO中断
    SCI_disableInterrupt(SCIA_BASE, SCI_INT_RXERR);         //失能RX_ERR中断
    Interrupt_enable(INT_SCIA_RX);                          //使能SCIA中断
    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);          //清除GROUP9请求

}


//=========================================================================
// SCIB 初始化函数
//=========================================================================
void mySCIB_init(void)
{
    // 使能时钟
    SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SCIB);

    // 清除中断与复位
    SCI_clearInterruptStatus(mySCI1_BASE, SCI_INT_RXFF | SCI_INT_TXFF | SCI_INT_FE | SCI_INT_OE | SCI_INT_PE | SCI_INT_RXERR | SCI_INT_RXRDY_BRKDT | SCI_INT_TXRDY);
    SCI_clearOverflowStatus(mySCI1_BASE);
    SCI_resetTxFIFO(mySCI1_BASE);
    SCI_resetRxFIFO(mySCI1_BASE);
    SCI_resetChannels(mySCI1_BASE);

    // 串口参数配置
    SCI_setConfig(mySCI1_BASE, DEVICE_LSPCLK_FREQ/2, mySCI1_BAUDRATE,
                  (SCI_CONFIG_WLEN_8|SCI_CONFIG_STOP_ONE|SCI_CONFIG_PAR_NONE));

    SCI_performSoftwareReset(mySCI1_BASE);

    // FIFO配置
    SCI_setFIFOInterruptLevel(mySCI1_BASE, SCI_FIFO_TX2, SCI_FIFO_RX1);
    SCI_enableFIFO(mySCI1_BASE);
    SCI_enableModule(mySCI1_BASE);

    // SCIB 中断
    Interrupt_register(INT_SCIB_RX, SCIB_RXFIFOISR);
    SCI_enableInterrupt(SCIB_BASE, SCI_INT_RXFF);
    SCI_disableInterrupt(SCIB_BASE, SCI_INT_RXERR);
    Interrupt_enable(INT_SCIB_RX);
    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);
}


//=========================================================================
// SCIC 初始化函数
//=========================================================================
void mySCIC_init(void)
{
    // 使能时钟
    SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SCIC);

    // 清除中断与复位
    SCI_clearInterruptStatus(mySCI2_BASE, SCI_INT_RXFF | SCI_INT_TXFF | SCI_INT_FE | SCI_INT_OE | SCI_INT_PE | SCI_INT_RXERR | SCI_INT_RXRDY_BRKDT | SCI_INT_TXRDY);
    SCI_clearOverflowStatus(mySCI2_BASE);
    SCI_resetTxFIFO(mySCI2_BASE);
    SCI_resetRxFIFO(mySCI2_BASE);
    SCI_resetChannels(mySCI2_BASE);

    // 串口参数配置
    SCI_setConfig(mySCI2_BASE, DEVICE_LSPCLK_FREQ/2, mySCI2_BAUDRATE,
                  (SCI_CONFIG_WLEN_8|SCI_CONFIG_STOP_ONE|SCI_CONFIG_PAR_NONE));

    SCI_performSoftwareReset(mySCI2_BASE);

    // FIFO配置
    SCI_setFIFOInterruptLevel(mySCI2_BASE, SCI_FIFO_TX2, SCI_FIFO_RX1);
    SCI_enableFIFO(mySCI2_BASE);
    SCI_enableModule(mySCI2_BASE);

    // SCIC 中断
    Interrupt_register(INT_SCIC_RX, SCIC_RXFIFOISR);
    SCI_enableInterrupt(SCIC_BASE, SCI_INT_RXFF);
    SCI_disableInterrupt(SCIC_BASE, SCI_INT_RXERR);
    Interrupt_enable(INT_SCIC_RX);
    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);
}
cpp 复制代码
#ifndef _MY_SCI_H_
#define _MY_SCI_H_


#include "driverlib.h"
#include "device.h"
#include <stddef.h>
#include <stdarg.h>

//*****************************************************************************
//
// PinMux 复用配置
//
//*****************************************************************************

//
// SCIA -> mySCI0 Pinmux
//*****************************************************************************
//
// SCIA 配置
//
//*****************************************************************************
// SCIRXDA - GPIO 设置
//
#define GPIO_PIN_SCIRXDA 43
#define mySCI0_SCIRX_GPIO 43
#define mySCI0_SCIRX_PIN_CONFIG GPIO_43_SCIRXDA

//#define GPIO_PIN_SCIRXDA 28
//#define mySCI0_SCIRX_GPIO 28
//#define mySCI0_SCIRX_PIN_CONFIG GPIO_28_SCIRXDA
//
// SCITXDA - GPIO 设置
//
#define GPIO_PIN_SCITXDA 42
#define mySCI0_SCITX_GPIO 42
#define mySCI0_SCITX_PIN_CONFIG GPIO_42_SCITXDA

//#define GPIO_PIN_SCITXDA 29
//#define mySCI0_SCITX_GPIO 29
//#define mySCI0_SCITX_PIN_CONFIG GPIO_29_SCITXDA
#define mySCI0_BASE SCIA_BASE
#define mySCI0_BAUDRATE 9600
#define mySCI0_CONFIG_WLEN SCI_CONFIG_WLEN_8
#define mySCI0_CONFIG_STOP SCI_CONFIG_STOP_ONE
#define mySCI0_CONFIG_PAR SCI_CONFIG_PAR_NONE
#define mySCI0_FIFO_TX_LVL SCI_FIFO_TX0
#define mySCI0_FIFO_RX_LVL SCI_FIFO_RX0
void mySCIA_init();

//*****************************************************************************
//
// SCIB -> mySCI1 Pinmux  (TX=14, RX=15, CPU1)
//
//*****************************************************************************
#define mySCI1_BASE SCIB_BASE
#define mySCI1_BAUDRATE 9600
#define mySCI1_SCITX_GPIO 18
#define mySCI1_SCIRX_GPIO 19
#define mySCI1_SCITX_PIN_CONFIG GPIO_18_SCITXDB
#define mySCI1_SCIRX_PIN_CONFIG GPIO_19_SCIRXDB
void mySCIB_init(void);  // SCIB
//*****************************************************************************
//
// SCIC -> mySCI2 Pinmux  (TX=56, RX=57, CPU1)
//
//*****************************************************************************
#define mySCI2_BASE SCIC_BASE
#define mySCI2_BAUDRATE 9600
#define mySCI2_SCITX_GPIO 56
#define mySCI2_SCIRX_GPIO 139
#define mySCI2_SCITX_PIN_CONFIG GPIO_56_SCITXDC
#define mySCI2_SCIRX_PIN_CONFIG GPIO_139_SCIRXDC
void mySCIC_init(void);  // SCIC

//*****************************************************************************
//
// Board 配置
//
//*****************************************************************************
void    MY_sci_Board_init();
void    MY_sci_PinMux_init();



#endif /* USER_TIM_H_ */

#include "my_tim.h"

这个文件的作用是初始化三个CPU定时器,1s的中断频率

cpp 复制代码
#include "my_tim.h"


//主频200M
//#define DEVICE_SYSCLK_FREQ 200000000


//
// Function Prototypes
//
__interrupt void cpuTimer0ISR(void);
__interrupt void cpuTimer1ISR(void);
__interrupt void cpuTimer2ISR(void);

//全局变量
uint16_t cpuTimer0IntCount;
uint16_t cpuTimer1IntCount;
uint16_t cpuTimer2IntCount;

//uint16_t per 周期值periodCount
//uint16_t psc 预分频值
void TIM_Init(void)
{
    //
    // 每个CPU定时器中断的isr
    //
    Interrupt_register(INT_TIMER0, &cpuTimer0ISR);
    Interrupt_register(INT_TIMER1, &cpuTimer1ISR);
    Interrupt_register(INT_TIMER2, &cpuTimer2ISR);


    //
    // 初始化设备外设。对于本例,只初始化Cpu计时器。
    //
    initCPUTimers();

    //
    // 配置CPU-Timer 0、1、2为每秒中断一次:周期(以us为单位)
    // DEVICE_SYSCLK_FREQ
    configCPUTimer(CPUTIMER0_BASE, DEVICE_SYSCLK_FREQ, 1000000);
    configCPUTimer(CPUTIMER1_BASE, DEVICE_SYSCLK_FREQ, 1000000);
    configCPUTimer(CPUTIMER2_BASE, DEVICE_SYSCLK_FREQ, 1000000);

    //
    // 为了确保精确的计时,请使用只写指令来写入整个寄存器。
    //因此,如果configCPUTimer和initCPUTimers中的配置位发生了变化,下面的设置也必须更新。
    //
    CPUTimer_enableInterrupt(CPUTIMER0_BASE);
    CPUTimer_enableInterrupt(CPUTIMER1_BASE);
    CPUTimer_enableInterrupt(CPUTIMER2_BASE);

    //
    // Enables CPU int1, int13, and int14 which are connected to CPU-Timer 0,
    // CPU-Timer 1, and CPU-Timer 2 respectively.
    // Enable TINT0 in the PIE: Group 1 interrupt 7 。。。
    //
    Interrupt_enable(INT_TIMER0);
    Interrupt_enable(INT_TIMER1);
    Interrupt_enable(INT_TIMER2);


    //
    // 启动CPU-Timer 0、CPU-Timer 1和CPU-Timer 2。
    //
    CPUTimer_startTimer(CPUTIMER0_BASE);
    CPUTimer_startTimer(CPUTIMER1_BASE);
    CPUTimer_startTimer(CPUTIMER2_BASE);

    //
    // 启用全局中断(INTM)和实时中断(DBGM)
    //
    EINT;
    ERTM;

}

//
// initCPUTimers - 这个函数初始化所有三个CPU定时器到一个已知状态。
//
void initCPUTimers(void)
{
    //
    // 初始化定时器周期为最大值
    //
    CPUTimer_setPeriod(CPUTIMER0_BASE, 0xFFFFFFFF);
    CPUTimer_setPeriod(CPUTIMER1_BASE, 0xFFFFFFFF);
    CPUTimer_setPeriod(CPUTIMER2_BASE, 0xFFFFFFFF);

    //
    // 初始化预缩放计数器以除以1 (SYSCLKOUT)
    //
    CPUTimer_setPreScaler(CPUTIMER0_BASE, 0);
    CPUTimer_setPreScaler(CPUTIMER1_BASE, 0);
    CPUTimer_setPreScaler(CPUTIMER2_BASE, 0);

    //
    // 确保计时器已停止
    //
    CPUTimer_stopTimer(CPUTIMER0_BASE);
    CPUTimer_stopTimer(CPUTIMER1_BASE);
    CPUTimer_stopTimer(CPUTIMER2_BASE);

    //
    // 用周期值重新加载所有计数器寄存器
    //
    CPUTimer_reloadTimerCounter(CPUTIMER0_BASE);
    CPUTimer_reloadTimerCounter(CPUTIMER1_BASE);
    CPUTimer_reloadTimerCounter(CPUTIMER2_BASE);

    //
    // 复位中断计数器
    //
    cpuTimer0IntCount = 0;
    cpuTimer1IntCount = 0;
    cpuTimer2IntCount = 0;
}
//
// configCPUTimer -该函数将所选定时器初始化为由"freq"和"period"参数指定的周期。"频率"以Hz输入,周期以us为单位输入。配置完成后,定时器保持在停止状态。
//
void configCPUTimer(uint32_t cpuTimer, float freq, float period)
{
    uint32_t temp;

    //
    // 初始化定时器周期:
    // DEVICE_SYSCLK_FREQ = 20000000U
    // freq = DEVICE_SYSCLK_FREQ  = ((DEVICE_OSCSRC_FREQ * 20 * 1) / 2
    temp = (uint32_t)(freq / 2000000 * period);//200 000 000 /1000 000 *x = xus
    CPUTimer_setPeriod(cpuTimer, temp);

    //
    // Set pre-scale counter to divide by 1 (SYSCLKOUT): 预分频系数?
    //
    CPUTimer_setPreScaler(cpuTimer, 0);//预分频系数为 0+1

    //
    // 初始化定时器控制寄存器。计时器停止,重新加载,自由运行禁用,中断启用。此外,还设置了自由位和软位
    //
    CPUTimer_stopTimer(cpuTimer);
    CPUTimer_reloadTimerCounter(cpuTimer);
    CPUTimer_setEmulationMode(cpuTimer,CPUTIMER_EMULATIONMODE_STOPAFTERNEXTDECREMENT);
    CPUTimer_enableInterrupt(cpuTimer);

    //
    // 重置三个cpuTimers的中断计数器
    //
    if (cpuTimer == CPUTIMER0_BASE)
    {
        cpuTimer0IntCount = 0;
    }
    else if(cpuTimer == CPUTIMER1_BASE)
    {
        cpuTimer1IntCount = 0;
    }
    else if(cpuTimer == CPUTIMER2_BASE)
    {
        cpuTimer2IntCount = 0;
    }
}


///////////////////////中断服务函数/////////////////////////////
//
// cpuTimer0ISR - Counter for CpuTimer0
//
__interrupt void cpuTimer0ISR(void)
{
    cpuTimer0IntCount++;
    //
    // 确认此中断 以接收来自 组1的 更多中断
    //
    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1);
}
//1,2定时器独立yu PIE
//
// cpuTimer1ISR - Counter for CpuTimer1
//
__interrupt void cpuTimer1ISR(void)
{
    //
    // CPU确认中断。
    //
    cpuTimer1IntCount++;
}
//
// cpuTimer2ISR - Counter for CpuTimer2
//
__interrupt void cpuTimer2ISR(void)
{
    //
    // CPU确认中断。
    //
    cpuTimer2IntCount++;
}
cpp 复制代码
#ifndef _MY_TIM_H_
#define _MY_TIM_H_



#include "driverlib.h"
#include "device.h"


extern uint16_t cpuTimer0IntCount;
extern uint16_t cpuTimer1IntCount;
extern uint16_t cpuTimer2IntCount;


void TIM_Init(void);


void initCPUTimers(void);
//
// configCPUTimer -该函数将所选定时器初始化为由"freq"和"period"参数指定的周期。"频率"以Hz输入,周期以us为单位输入。配置完成后,定时器保持在停止状态。
//
void configCPUTimer(uint32_t cpuTimer, float freq, float period);


__interrupt void cpuTimer0ISR(void);
__interrupt void cpuTimer1ISR(void);
__interrupt void cpuTimer2ISR(void);

#endif /* USER_TIM_H_ */

#include "micro_printf.h"

这个文件的作用是封装一个 打印函数,可以调用串口打印数据,发挥printf格式化输出的功能

micro_print(SCIA_BASE,"hello_world 666 !");

micro_print(SCIB_BASE,"hello_world 888 !");

micro_print(SCIC_BASE,"hello_world 999 !");

cpp 复制代码
//******************************************************************************/

//******************************************************************************/
#include "micro_printf.h"

const char MY_digits[] = "0123456789ABCDEF";

u32 Float_to_u32(float data)
{
    float_to_u32 temp;
    temp._float_=data;
    return temp._u32_;
}

static void _micro_PutChar(uint32_t SCI_base,char c)
{
    SCI_writeCharBlockingFIFO(SCI_base,c);
}

static void _micro_PutStr(uint32_t SCI_base,const char *str)
{
    while ( *str != '\0' )
        _micro_PutChar(SCI_base,*str++);
}

static void _micro_PrintNum(uint32_t SCI_base,long num, char base)
{
    char numStr[PRINTF_MAX_NUM_LEN];            /*数值字符串缓冲区---*/
    char i = 0;                                 /*for numStr---------*/

    if (base < 2 || base > 16)
        return;
    while (num)                          /*将数值转换成字符串--*/
    {
        numStr[i++] = MY_digits[num % base]; /*得到的是颠倒的串--*/
        num /= base;                      /*去掉最低位---------*/
    }
    while (i--)                          /*反向打印----------*/
    {
        _micro_PutChar(SCI_base,numStr[i]);
    }
}

static void _micro_Printint(uint32_t SCI_base,long num)
{
    long temp;
    if(num<0)
    {
        _micro_PutChar(SCI_base,'-');
        temp=-num;
    }
    else
        temp=num;
    _micro_PrintNum(SCI_base,temp,10);

}

static void _micro_Printfloat(uint32_t SCI_base,unsigned long num)
{
    float_to_u32 temp;
    temp._u32_=num;
    u16 j=0;

    u32 data_int;
    u32 data_dot;
    if(temp._float_ >= 0)
    {
        data_int=temp._float_;
        data_dot=(temp._float_-(float)data_int)*100000.f;
    }
    else
    {
        data_int=-temp._float_;
        data_dot=(-temp._float_-(float)data_int)*100000.f;
    }

    u16 output_char[16];
    output_char[0]=data_int/10000%10;
    output_char[1]=data_int/1000%10;
    output_char[2]=data_int/100%10;
    output_char[3]=data_int/10%10;
    output_char[4]=data_int%10;
    output_char[5]='.';
    output_char[6]=data_dot/10000%10;
    output_char[7]=data_dot/1000%10;
    output_char[8]=data_dot/100%10;
    output_char[9]=data_dot/10%10;
    output_char[10]=data_dot%10;

    if(temp._float_ <= 0)
        _micro_PutChar(SCI_base,'-');
    u16 flag=0;
    for(j=0;j<5;j++)
    {
        if(flag==0 && output_char[j]!=0)
            flag=1;
        if(flag)
            _micro_PutChar(SCI_base,MY_digits[output_char[j]]);
    }
    if(flag==0 && output_char[4]==0)
        _micro_PutChar(SCI_base,'0');
    _micro_PutChar(SCI_base,output_char[5]);
    for(j=6;j<11;j++)
        _micro_PutChar(SCI_base,MY_digits[output_char[j]]);
}

void micro_print(uint32_t SCI_base,const char *fmt, ...)
{
    char c;
    va_list var_arg;

    /**
    **@准备访问可变参数
    */
    va_start( var_arg, fmt );
    while ( (c = *fmt++) != '\0' )
    {
        if (c != '%')
        {
            _micro_PutChar(SCI_base,c);
            continue;
        }
        switch (*fmt++)
        {
            case 'C':
            case 'c':              /*字符型-----------------*/
            {
                _micro_PutChar(SCI_base, va_arg(var_arg, int) );
            }
            break;
            case 'D':
            case 'd':             /*整型-------------------*/
            {
                _micro_Printint(SCI_base,va_arg(var_arg, int));
            }break;
            case 'S':
            case 's':            /*字符串型----------------*/
            {
                _micro_PutStr(SCI_base,va_arg(var_arg, char *));
            }break;
            case 'X':            /*十六进制----------------*/
            case 'x':
            {
                _micro_PrintNum(SCI_base,va_arg(var_arg, int), 16);
            }break;
            case 'O':            /*八进制-----------------*/
            case 'o':
            {
                _micro_PrintNum(SCI_base,va_arg(var_arg, int), 8);
            }break;
            case 'B':
            case 'b':           /*二进制------------------*/
            {
                _micro_PrintNum(SCI_base,va_arg(var_arg, int), 2);
            }break;

            case 'F':
            case 'f':           /*float------------------*/
            {
                _micro_Printfloat(SCI_base,va_arg(var_arg, unsigned long));
            }break;

            default:
            {
                _micro_PutChar(SCI_base,c);   /*未定义,直接打印----------*/
            }

        }
    }
    /**
    **@完成处理可变参数
    */
    va_end ( var_arg );
}
cpp 复制代码
//******************************************************************************/
//******************************************************************************/
#ifndef MICRO_PRINTF_H_
#define MICRO_PRINTF_H_

//#include "Includes.h"
#include <stddef.h>
#include <stdarg.h>
#include "driverlib.h"
#define PRINTF_MAX_NUM_LEN   20                  /*最大显示位数-----*/

#define u16 unsigned int
#define u32 unsigned long
#define u64 unsigned long long

#define s16 signed int
#define s32 signed long
#define s64 signed long long

typedef union{
    float _float_;
    u16   _u16_[2];
}float_to_u16;

typedef union{
    float _float_;
    u32   _u32_;
}float_to_u32;
u32 Float_to_u32(float data);
void micro_print(uint32_t SCI_base,const char *fmt, ...);
#endif

主函数

cpp 复制代码
#include "driverlib.h"
#include "device.h"
#include "board.h"
#include "c2000ware_libraries.h"

#include "my_tim.h"
#include "my_sci.h"
#include "micro_printf.h"

#define delay_s(x) SysCtl_delay(((((long double)(x)) / (2.0L /(long double)DEVICE_SYSCLK_FREQ)) - 9.0L) / 5.0L)
#define delay_ms(x) SysCtl_delay(((((long double)(x)) / (2000.0L /(long double)DEVICE_SYSCLK_FREQ)) - 9.0L) / 5.0L)
#define delay_us(x) SysCtl_delay(((((long double)(x)) / (2000000.0L /(long double)DEVICE_SYSCLK_FREQ)) - 9.0L) / 5.0L)

void main(void)
{
    Device_init();
    Device_initGPIO();
    Interrupt_initModule();
    Interrupt_initVectorTable();
    Board_init();
    //C2000Ware_libraries_init();
    MY_sci_Board_init();
    TIM_Init();

    Interrupt_enableMaster(); //开启总中断
    EINT;
    ERTM;

    while(1)
    {

        micro_print(SCIA_BASE,"hello_world 666 !");
        micro_print(SCIB_BASE,"hello_world 888 !");
        micro_print(SCIC_BASE,"hello_world 999 !");
        delay_ms(1000);
    }
}

//SCI_writeCharBlockingFIFO(SCIA_BASE, 'A');
//SCI_writeCharBlockingFIFO(SCIA_BASE, 'A');
//SCI_writeCharBlockingFIFO(SCIA_BASE, '\r');
//SCI_writeCharBlockingFIFO(SCIA_BASE, '\n');


//SCI_writeCharBlockingFIFO(SCIB_BASE, 'B');
//SCI_writeCharBlockingFIFO(SCIB_BASE, 'B');
//SCI_writeCharBlockingFIFO(SCIB_BASE, '\r');
//SCI_writeCharBlockingFIFO(SCIB_BASE, '\n');
//
// End of File
//

测试结果:

完整工程:

相关推荐
Li_RuiQi14 小时前
DAgger方法演进_独立学习笔记
笔记·学习·计算机视觉
Li_RuiQi18 小时前
DAgger与交互式模仿学习_ACT学习笔记
笔记·学习
He BianGu18 小时前
【笔记】C# 中BindingFlags的详细作用
笔记·c#
AI视觉网奇19 小时前
turtle 入门教程笔记
笔记
跨知易知识产权19 小时前
美国专利确权是什么,和专利诉讼有什么不一样?
笔记
杨逢昌工厂6S管理19 小时前
126-杨逢昌6S三环体系:越做越乱的现场熵增机理与基准化治理——一线现场诊断笔记
经验分享·笔记·职场和发展·学习方法
悟道书生19 小时前
若依 RBAC 权限控制学习笔记
java·网络·笔记·sql·学习·vue
陈哈哈111120 小时前
折腾了半天,总算把 Vim 9.2 装明白了
笔记
陈哈哈111120 小时前
折腾了半天,总算把 OpenGL 的开发环境给装明白了
笔记
深圳老胡21 小时前
STM32F103 硬件 SPI 与软件 IO 模拟 SPI 最高速度差异详解
笔记·stm32·单片机·代码规范·1024程序员节