前言
在实际调试控制程序过程中,往往需要将关键变量实时输出为波形进行分析,通过对比理论模型与实际运行数据,评估系统的动态响应和稳态性能。本节基于一路 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-labview-2024-runtime-engine-x86-24.1-online.exe资源-CSDN下载