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

目录
开发板原理图
在写代码接线之前,我要先吐槽下这 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 //







