DSP28377D项目实战 (4) - 高速串口打印波形

前言

在实际调试控制程序过程中,往往需要将关键变量实时输出为波形进行分析,通过对比理论模型与实际运行数据,评估系统的动态响应和稳态性能。本节基于一路 SCI 实现高速数据通信,波特率配置为 6.25 MHz,用于支撑高频采样数据的实时传输与调试验证。

代码

复制代码
#include "SciTest.h"

char TxBuf[20]={0};
char RxBuf[20]={0};
sci_test_t Sci_Data = {0};

void SciTest_Init(void)
{
    // 进入软件复位态:在复位态下做配置
    SciaRegs.SCICTL1.bit.SWRESET = 0;

    // 帧格式:1停止位,8位数据,无校验(8N1)
    SciaRegs.SCICCR.all = 0x0007;

    // 波特率:6.25Mhz
    // 在InitPeripheralClocks中修改一下低速外设时钟分频系数
    // ClkCfgRegs.LOSPCP.all = 0x0001

    SciaRegs.SCIHBAUD.all = 0x0000;
    SciaRegs.SCILBAUD.all = 0x0001;

    // 开启FIFO
    SciaRegs.SCIFFTX.bit.SCIFFENA   = 1;                               // 使能FIFO增强
    SciaRegs.SCIFFRX.bit.RXFIFORESET= 0; SciaRegs.SCIFFRX.bit.RXFIFORESET=1; // RX FIFO复位
    SciaRegs.SCIFFTX.bit.TXFIFORESET = 0;SciaRegs.SCIFFTX.bit.TXFIFORESET = 1;// TX FIFO复位

    // FIFO中断阈值与中断使能
    SciaRegs.SCIFFRX.bit.RXFFIL     = 16;                                // RX≥16触发中断
    SciaRegs.SCIFFRX.bit.RXFFIENA   = 0;                                // 使能RX FIFO阈值中断
    SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1;

    // 先清标志
    // 使能收发并退出软件复位
    SciaRegs.SCICTL1.bit.RXENA = 1;                                     // 开接收
    SciaRegs.SCICTL1.bit.TXENA = 1;                                     // 开接收
    SciaRegs.SCICTL1.bit.SWRESET = 1;

    EINT;

}

void SciTest_TxData(sci_test_t *p)
{
    if(p->Ch1Addr == 0)
        *p->TxCH1 = 0;
    else
        p->TxCH1 = (Uint16 *)p->Ch1Addr;

    if(p->Ch2Addr == 0)
        *(p->TxCH2) = 0;
    else
        p->TxCH2 = (Uint16 *)p->Ch2Addr;

    if(p->Ch3Addr == 0)
        *(p->TxCH3) = 0;
    else
        p->TxCH3 = (Uint16 *)p->Ch3Addr;

    if(p->Ch4Addr == 0)
        *(p->TxCH4) = 0;
    else
        p->TxCH4 = (Uint16 *)p->Ch4Addr;

    TxBuf[0] = 0xA5;

    TxBuf[1] = (Uint8)((*(p->TxCH1) & 0xFF00)>> 8);
    TxBuf[2] = (Uint8)(*(p->TxCH1) & 0x00FF);
    TxBuf[3] = (Uint8)((*(p->TxCH2) & 0xFF00)>> 8);
    TxBuf[4] = (Uint8)(*(p->TxCH2) & 0x00FF);
    TxBuf[5] = (Uint8)((*(p->TxCH3) & 0xFF00)>> 8);
    TxBuf[6] = (Uint8)(*(p->TxCH3) & 0x00FF);
    TxBuf[7] = (Uint8)((*(p->TxCH4) & 0xFF00)>> 8);
    TxBuf[8] = (Uint8)(*(p->TxCH4) & 0x00FF);

    TxBuf[9] = 0x5A;

    for(int i = 0; i < 10; i++)
    {
       SciaRegs.SCITXBUF.all = TxBuf[i] & 0xFF;
    }
}

void SciTest_RxData(sci_test_t *p)
{
    Uint16 temp = 0;
    if (SciaRegs.SCIFFRX.bit.RXFFOVF == 1)
    {
        SciaRegs.SCIFFRX.bit.RXFFOVRCLR = 1;
        SciaRegs.SCIFFRX.bit.RXFIFORESET = 0;
        SciaRegs.SCIFFRX.bit.RXFIFORESET = 1;
        return;
    }

    if(SciaRegs.SCIFFRX.bit.RXFFST == 16 )
    {
        temp = SciaRegs.SCIFFRX.bit.RXFFST;
        for(int i = 0;i < temp;i++)
        {
            RxBuf[i] = SciaRegs.SCIRXBUF.all;
        }
        //控制指令
        p->RxCH1 = ((uint16_t)RxBuf[1] << 8) | RxBuf[0];
        p->RxCH2 = ((uint16_t)RxBuf[3] << 8) | RxBuf[2];
        p->RxCH3 = ((uint16_t)RxBuf[5] << 8) | RxBuf[4];
        p->RxCH4 = ((uint16_t)RxBuf[7] << 8) | RxBuf[6];
        //变量地址
        p->Ch1Addr = ((uint16_t)RxBuf[9] << 8) | RxBuf[8];
        p->Ch2Addr = ((uint16_t)RxBuf[11] << 8) | RxBuf[10];
        p->Ch3Addr = ((uint16_t)RxBuf[13] << 8) | RxBuf[12];
        p->Ch4Addr = ((uint16_t)RxBuf[15] << 8) | RxBuf[14];
    }
}



#ifndef APP_SCITEST_H_
#define APP_SCITEST_H_


#include "common.h"

typedef struct{
    Uint16 Ch1Addr;
    Uint16 Ch2Addr;
    Uint16 Ch3Addr;
    Uint16 Ch4Addr;

    Uint16 RxCH1;
    Uint16 RxCH2;
    Uint16 RxCH3;
    Uint16 RxCH4;

    Uint16 *TxCH1;
    Uint16 *TxCH2;
    Uint16 *TxCH3;
    Uint16 *TxCH4;

}sci_test_t;


extern sci_test_t Sci_Data;

extern void SciTest_Init(void);
extern void SciTest_TxData(sci_test_t *p);
extern void SciTest_RxData(sci_test_t *p);

#endif /* APP_SCITEST_H_ */

上位机

变量地址就填写CCS中创建的变量的内存地址就行(16进制地址)

调用

直接把上述的C文件和头文件放入工程中就行,在while中一直调用接收函数和发送函数即可。

验证

锁相环α和β分量的波形

锁相环Ud和Uq及补偿角的波形

资源

这个上位机使用labview开发的,需要下载labview相关资源

下载NI-VISA - NI

【免费】高速串口-6M.rar资源-CSDN下载

【免费】ni-labview-2024-runtime-engine-x86-24.1-online.exe资源-CSDN下载

相关推荐
chao1898441 小时前
STM32 HAL库驱动AT24C02 EEPROM例程
stm32·单片机·嵌入式硬件
不会武功的火柴3 小时前
SystemVerilog语法(8)-有限状态机(FSM)
嵌入式硬件·fpga开发·自动化·ic验证·rtl·uvm方法学
嵌入式小站5 小时前
STM32 零基础可移植教程 05:按键消抖,为什么按一次会触发好几次
chrome·stm32·嵌入式硬件
czhaii5 小时前
跟我动手学FX系列PLC GX2环境
嵌入式硬件
拾知_H6 小时前
STM32/Delay延时函数编程思路
stm32·单片机·时钟·延时
2zcode7 小时前
基于STM32的智能扫地机器人设计与实现
stm32·嵌入式硬件·机器人
jllllyuz8 小时前
单相并网逆变器控制代码实现(STM32版)
stm32·单片机·嵌入式硬件
冉卓电子9 小时前
GD32C103RBT6 misc 内核驱动库极简解析
单片机·嵌入式硬件
yongui478349 小时前
MAX6675 K型热电偶温度采集程序(Keil环境)
单片机·嵌入式硬件
豆包公子9 小时前
AUTOSAR CP XCP 移植到裸机 MCU-实践篇
单片机·嵌入式硬件