请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号:LAUNCHXL-F2.8379万D 工具/软件:Code Composer Studio
您好,
通过运行“Example_F2.8379万D_LaunchPadDemo”示例,SCI波特率为11.52万:
void scia_init()
{
//
//注:时钟已打开到SCIA外围设备
//在InitSysCtrl()函数中
//
//
// 1停止位,无回送,无奇偶校验,8个字符位,异步模式,
//空闲线路协议
//
SciaRegs.SCICCR.ALL =0x0007;
//
//启用TX,RX,内部SCICLK,禁用RX ERR,睡眠, TXWAKE
//
SciaRegs.SCICTL1.all =0x0003;
SciaRegs.SCICT2.bit.TXINTENA =1;
SciaRegs.SCICT2.bit.RXBKINTENA =1;
//
// 11.52万波特率@LSPCLK = 22.5MHz (90 MHz SYSCLK)
//
SciaRegs.SCIHBAUD.ALL =0x0000;
SciaRegs.SCILBAUD.ALL =53;
SciaRegs.SCICTL1.ALL =0x0023;//从重置中放弃SCI
返回;
}
但通过集成此程序和“2837x_rfft_ADC_RT”示例,数据传输速率为5.76万。 为什么? 如何提高波特率?
主要c
#include "FPU_rfft.h" //主包含文件
#include "mathmation.h"
#include "examples_setup.h"
#include "sci_io.h"
//!
//! \addtogroup RFFT_examples Real FFT of the ADC Input (实时)
//@{
//*************************************************************************************************
//定义
//*****************************************************************************************
#define RFFT_stages 9
#define RFFT_size (1 << RFFT_STEENS)
#define F_PER_SAMPLE (ADC_SAMPLE_FREQ/(FLOAT) RFFT_SIZE)
#define use_test_input 1 //如果未处于测试模式,请务必排除SIGNAL.ASM
//从版本
#define Epsilon
0.1 //*********************************************************************************************************
// globals
//*****************************************************************************************
#ifdef __cplusplus
#pragma data_section("RFFTdata1")
#else
#pragma data_section(RFFTin1Buff,"RFFTdata1")
#endif //__cplusplus
uint16_t RFpragin1Buff[2*RFFT_size];#ifdef_cplusa1")#FTpragf_data/#ftma_for_
\볲 뛌 Magnitude Calculation Buffer
//!
FLOAT RFFTmagBuff[RFFT_Size/2+1];
#ifdef __cplusplus
#pragma data_section("RFFTdata2")
#else
#pragma data_section(RFFTmagBuff,"RFFTdata2")
#endif //__cplusplus
//! \볲 뛌 Phase Calculation Buffer
//!
float RFFTphaseBuff[RFFT_size/2];
#ifdef __cplusplus
#pragma data_section("RFFTdata3")
#else
#pragma data_section(RFFToutBuff,"RFFTdata3")
#endif //__cplusplus
//! \brief FFT Calculation Buffer
//!(FFT计算缓冲区简介//! 注意:如果FFT阶段的数量为偶数,则FFT的结果将
//! 写入此缓冲区
//!
float RFFToutBuff[RFFT_size];
#ifdef __cplusplus
#pragma data_section("RFFTdata4")
#else
#pragma data_section(RFFTF32Coef,"RFFTdata4")
#endif //__cplusplus
//! \简短的范围因素
//!
浮点RFFTF32Coef[RFFT_size];
//! \brief RFFT_ADC_F32_structt对象
//!
RFFT_ADC_F32_structt rfft_ADC;
//! \RFFT_ADC_F32_structt对象的简短句柄
//!
RFFT_ADC_F32_struct_handle HND_rfft_ADC =&rfft_ADC;
//! \brief RFFT_F32_struct对象
//!
RFFT_F32_structt rfft;
//! \RFFT_F32_struct对象的简短句柄
//!
RFFT_F32_struct_handle HND_rfft =&rfft;
//! \brief标志,表示ADC已完成采样和存储,
//! FFT输入缓冲区中的N个点
//!
volatile uint16_t flagInputReady =0;
//! \FFT输入缓冲区的简要索引
//!
volatile uint16_t sampleIndex = 0;
//*****************************************************************************************
//函数原型
//*****************************************************************************************
__interrupt void adcaIsr();
/////////////////////////////////////////////////////////////////////// SCI///////////////////////////////// ~
void scia_init(void);
void scia_fifo_init(void);
void scia_xmit(int a);
void scia_msg(car *msg);
//////////////////////////////////////////////// ~
Int16_t主要(无效)
{
//本地
浮点频率= 0.0 ;
uINT16_t i,j;
char *msg;//<--- SCI
#ifdef闪存
EALLOW;
Flash0EccRegs.ecc_enable.bit.enable = 0;
memcpy(UINT32_t *)&RamfuncsRunStart,(UINT32_t *)&RamfuncsLoadStart,
(UINT32_t)&RamfuncsLoadSize );
FPU_initFlash();
#endif //flash
FPU_initSystemClocks();
fpu_initEpie();
//设置ADC-A
fpu_initADCA();
//将EPWM1A设置为采样时钟,将EPWM2A设置为信号
//已采样
FPU_initEPWM();
////////////////////////////////////////////////////////// SCI/////////////////////////////////////////// ~
InitGpio();////
在此示例中,仅初始化SCI-A端口的引脚。
// gPIO_SetupPinMux()-设置GPxMUX1/2和GPyMUX1/2寄存器位
// gPIO_SetupPinOptions()-设置GPIO的方向和配置
//这些函数位于F2837xD_gPI.c文件中。
//
EALLOW;
gpioCtrlRegs.GPBMUX1.bit.GPIO42 = 3;
gpioCtrlRegs.GPBMUX1.bit.GPIO43 = 3;
gpioCtrlRegs.GPBGMUX1.bit.GPIO42 = 3;
gpioCtrlRegs.GPBGMUX1.bit.GPIO43 = 3;
EDIS;
////
步骤3。 清除所有__interrupts并初始化PIE矢量表:
//禁用CPU __interrupts
//
// DINT;
////
将PIE控制寄存器初始化为其默认状态。
//默认状态为禁用所有PIE __interrupts并
清除标志//。
//此函数位于F2837xD_PIECTRL.c文件中。
//
// InitPieCtrl();
////
禁用CPU __interrupts并清除所有CPU __interrupt标志:
//
// IER = 0x0000;
// IFR = 0x0000;
////
使用指向shell Interrupt
//服务例程(ISR)的指针初始化PIE矢量表。
//这将填充整个表,即使本
例中未使用__interrupt //。 这对于调试非常有用。
// shell ISR例程位于F2837xD_DefaultIsr.C.中
//此函数位于F2837xD_PieVect.C.中
//
// InitPieVectorTable();
scia_init();
scia_fifo_init(); //初始化SCI FIFO
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ~
//映射ISR功能
EALLOW;
PieVectorTable.ADCA1_INT = ADCAIsr;// ADCA中断1的函数
EDIS;
//启用全局中断和更高优先级的实时调试事件:
PieCtrlRegs.PIEIER1.bit.INTx1 = 1;//启用ADC1INT
IER || M_INT1;//启用组1中断
EINT; //启用全局中断INTM
ERTM; //启用全局实时中断DBGM
//启动ePWM
fpu_startepwm();
//将RFFT_ADC_F32_struct链接到RFFT_F32_struct。 尾指针
RFFT_ADC_F32_structt的//被 传递到的OutBuf指针
//RFFT_F32_struct
hnd_rfft_adC->Tail =&(hnd_rfft->OutBuf);
hnd_rfft->FFTSize = RFFT_size; //FFT大小
hnd_rfft->FFTStages = RFFT_stages; //FFT阶段
HND_rfft_ADC->InBuf =&RFFTin1Buff[0];//输入缓冲区(12位ADC输入)
hnd_rfft->OutBuf =&RFFToutBuff[0];//输出缓冲区
HND_rfft->CosSinBuf =&RFFTF32Coef[0];//twiddle因子
hnd_rfft->MagBuf =&RFFTmagBuff[0];//幅值输出缓冲区
hnd_rfft->PhaseBuf =&RFFTphaseBuff[0];//相位输出缓冲区
RFFT_F32_sincostable (HND_rfft); //计算宽度因子
对于(i=0;i < RFFT_SIZE;i++){
RFFToutBuff[i]= 0; //清除输出缓冲
区}
用于(i=0;i <= RFFT_SIZE/2;i++){
RFFTmagBuff[i]= 0; //清除量级缓冲
区}
对于(i=0;i < RFFT_SIZE/2;i++){
RFFTphaseBuff[i]= 0; //清除相位缓冲
区}
而(1){
MSG ="\r\n\n\nHello World!\0";
scia_msg (msg);
while (flagInputReady == 0){};//等待ADC ISR设置标志
//继续之前
RFFT_ADC_F32 (HND_Rfft_ADC);//计算实际FFT (12位ADC输入)
FlagInputReady =0; //重置标志
#ifdef __TMS320C28XX_TMU__//在项目中定义时间--TMU_support=tmu0
//属性
RFFT_F32_MAG_TMU0 (HND_Rfft); //计算幅度
RFFT_F32_PHASE TMU0 (HND_Rfft); //计算阶段
#else
RFFT_F32_MAG (HND_Rfft); //计算幅度
RFFT_F32_PHASE (HND_Rfft); //计算相位
#endif //__TMS320C28XX_TMU__
//找出信号频率的最大频率分量
//组件信号。 此算法仅用于查找频率
//一个组件的频率信号;在本例中,它给出
//采样方波的基本频率
J = 1;
Freq = RFFTmagBuff[1];
用于(i=2;i<RFFT_size=2+1;i++){
//查找频谱的最大分量
IF (RFFTmagBuff[i]> freq){
J = I;
Freq = RFFTmagBuff[i];
}
}
//将标准化数字频率转换为实际模拟频率
//f = m * FS/N
//其中m是具有最大值的容器,FS是采样
// frequency和N FFT中的点数
Freq = F_per样品*(float) j;
//执行从未达到此点
返回1;
}//
主
//结束 \볲 뛌 ADC中断服务例程
//! ISR将每个采样值存储在FFT缓冲区中,并且
//! 缓冲区已满
时升起标志//!
__interrupt void adcaIsr()
{
RFFTin1Buff[sampleIndex+]= AdcaResultRegs.ADCRESULT0;//sampleIndex++,用于单通道
IF (sampleIndex ==(RFFT_size -1)){
样本索引=0;
标志输入就绪=1;}
ADcaRegs.ADCINTFLGCLL.bit.ADCINT1 = 1;//清除INT1标志
PieCtrlRegs.PIEACK.ALL = PIEACK_Group1;
}
//@}//addtogroup
//文件结尾
/////////////////////////////////////////////////////////////// Sci//////////////////////////////////////////////// ~
////
scia_xmit -从SCI
//
void scia_xmit (int A)
{
while (SciaRegs.SCIFFTX.Bit.TXFFST !=0){}
SciaRegs.SCITXBUF.ALL =A;
}////
scia_msg -通过SCIA
//
void scia_msg(car * msg)传送消息
{
int i;
I = 0;
while (msg[i]!='\0')
{
scia_xmit (msg[i]);
I++;
}
}////
scia_fifo_init -初始化SCI FIFO
//
void scia_fifo_init()
{
SciaRegs.SCIFFTX.ALL = 0xE040;
SciaRegs.SCIFFRX.ALL = 0x2044;
SciaRegs.SCIFFCT.ALL = 0x0;
}////
scia_init - SCIA 8位字,波特率0x000F,默认值,1个停止位
,//无奇偶校验
//
void scia_init()
{
//
//注:时钟已打开到SCIA外围设备
//在InitSysCtrl()函数中
//
//
// 1停止位,无回送,无奇偶校验,8个字符位,异步模式,
//空闲线路协议
//
SciaRegs.SCICCR.ALL =0x0007;
//
//启用TX,RX,内部SCICLK,禁用RX ERR,睡眠, TXWAKE
//
SciaRegs.SCICTL1.all =0x0003;
SciaRegs.SCICT2.bit.TXINTENA =1;
SciaRegs.SCICT2.bit.RXBKINTENA =1;
//
// 11.52万波特率@LSPCLK = 22.5MHz (90 MHz SYSCLK)
//
SciaRegs.SCIHBAUD.ALL =0x0000;
SciaRegs.SCILBAUD.ALL =53;
SciaRegs.SCICTL1.ALL =0x0023;//从重置中放弃SCI
return;
}//////////////////////////////////////////////////////////////////////////////////////////////////
~
感谢你的帮助。
此致,
Amin