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
//

测试结果:

完整工程:

相关推荐
xian_wwq2 小时前
【学习笔记】提示词注入完全指南:五种变体,一套防御体系
笔记·学习·ai安全
元直数字电路验证2 小时前
云计算实验笔记(二):PaaS 与容器化 —— 从 Docker 命令到 Kubernetes 全景图
笔记·云计算·paas
chushiyunen2 小时前
php包管理工具composer笔记
笔记·php·composer
做cv的小昊2 小时前
计算机图形学:【Games101】学习笔记06——几何(曲线和曲面、网格处理)、阴影图
c++·笔记·学习·游戏·图形渲染·几何学·光照贴图
2601_961194022 小时前
2026初级会计实务电子书pdf|官方教材+精讲笔记PDF
笔记·pdf
会编程的土豆2 小时前
网络基础核心笔记(HTTP、TCP、前后端通信)
网络·笔记·http
AOwhisky2 小时前
MySQL 学习笔记(第二期):SQL 语言之库表操作与数据类型
linux·运维·数据库·笔记·sql·学习·mysql
chushiyunen3 小时前
php笔记、下载安装等
开发语言·笔记·php
元直数字电路验证3 小时前
云计算实验笔记(一):IaaS 与虚拟化全景 —— 从 VirtualBox 到云上 EC2 的完整映射
笔记·云计算·perl