This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/LAUNCHXL-F2.8379万D:Sci波特率

Guru**** 2563960 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/630132/ccs-launchxl-f28379d-sci-baud-rate

部件号: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

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Amin:

    我想您会希望在设备上跟随时钟,达到SCI波特。

    *检查PLL设置,确保PLL已根据需要进行设置
    *使用XCLKOUT引脚验证SYSCLK是否符合预期
    *验证LSPCLK分配器设置
    *验证两个不同程序之间的SCI设置
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好Devin:

    谢谢你。 基于BRR公式,在“2837x_rfft_ADC_RT”项目中,LSPCLK=2488.32万,我可以将buad率更改为11.52万和23.04万。 但92.16万和46.08万无法正常工作。 我无法在此项目中找到LSPCLK设置和PLL设置!

    此致,
    Amin
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Amin:

    在代码运行后,您可以实际检查“表达式”窗口中的设置。 一些有关的登记册如下:

    ClkCfgRegs.SYSPLLMULT
    ClkCfgRegs,SYSPLLCTL1
    ClkCfgRegs.SYSPLLSTS
    ClkCfgRegs.SYSCLKDIVSEL
    ClkCfgRegs.LOSPCP

    最好在GPIO上启用XCLKOUT并检查系统频率。 SYSCLK到XCLKOUT的分压器为

    ClkCfgRegs.XCLKOUTDIVSEL
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,Devin,

    ClkCfgRegs.SYSPLLMULT:0x0.0014万.
    ClkCfgRegs,SYSPLLCTL1:0x0.0003万
    ClkCfgRegs.SYSPLLSTS:0x0.0001万
    ClkCfgRegs.SYSCLKDIVSEL:0x0.0001万
    ClkCfgRegs.LOSPPCP:0x0.0002万
    ClkCfgRegs.XCLKOUTDIVSEL:0x0.0003万
    如何在GPIO上启用XCLKOUT并检查系统频率? 我需要一个示例代码来添加项目。
    谢谢你。

    此致,
    Amin
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Amin:

    您应该了解这些寄存器的价值,并将其与您的期望进行比较。 请注意,在“表达式”窗口中,您可以在寄存器名称后附加".bit",以便单独查看每个寄存器的每个字段中的内容。

    您应该将此值与PLL上的TRM部分一起使用,以确定SYSCLK频率*应基于您所需的设置和代码。 然后,您可以将其与您从XCLKOUT引脚中观察到的内容进行比较。

    同样,您也可以查看低速时钟和SCI波特率设置的设置,并根据TRM的SCI部分计算波特率。 将其与观察到的波特率进行比较,并相应地调整寄存器。

    XCLKOUT在位置3上粘在GPIO73上。 要了解如何设置GPIO mux以启用此功能,请参见表4-3. GPIO Muxed引脚"非常有用。 请注意,您还应该配置(或至少查找默认行为) XCLKOUTDIVSEL和XCLKOUTSEL寄存器。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,Devin,

    感谢你的帮助。 我对项目进行了更改(2837x_rfft_ADC_RT和SCI组合)。
    通过将以下设置更改为IMULT_40,我能够以92.16万波特传输数据。
    F2837xD_sysctrl.c:
    “InitSysPll (XTAL_OSC,IMULT_20,FMULT_1,PLLCLK_BY_2);”

    但测量的频率为一半。 例如,使用此设置测得的6 kHz真实输入信号为3 kHz:

    Examples_setup.h:
    #define CPU_FRQ_200MHz 1.
    #define ADC_Sampling_FREQ 10万.0L
    #define ePWM_CLK 1亿UL // ePWM_CLK从SYSCLK/2开始
    #define ePWM_CLKDIV 1.
    #define ePWM_HSPCLKDIV 4.
    #define EPWM1_Period ePWM_CLK/(2*8*10万UL)
    #define EPWM1_Duty_cycle EPWM1_Period/2UL
    #define EPWM2_period (ePWM_CLK)/(2*8*10万UL)
    #define EPWM2_Duty_cycle EPWM2_Period/2UL

    然后,通过以下更改,我可以看到正确的频率测量量(具有相同实际值和波特率的频率测量值为92.16万):

    #define CPU_FRQ_200MHz 1.
    #define ADC_Sampling_FREQ 10万.0L
    #define ePWM_CLK 1亿UL // ePWM_CLK从SYSCLK/2开始
    #define ePWM_CLKDIV 1.
    #define ePWM_HSPCLKDIV 4.
    #define EPWM1_Period ePWM_CLK/(1*8*10万UL)<--
    #define EPWM1_Duty_cycle EPWM1_Period/2UL
    #define EPWM2_period (ePWM_CLK)/(1*8*10万UL)<---
    #define EPWM2_Duty_cycle EPWM2_Period/2UL

    这是正确的方法吗?
    如何获得CPU的速度是最大速度? 如何确保?

    此致,
    Amin
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Amin:

    XCLKOUT将告诉您CPU的运行速度。 如果PLL输入时钟为10MHz,PLL倍频为40,PLL分配器为2,则CPU频率应为:10MHz*40/2=200MHz,这是目标频率。 同样,如果PLL输入时钟为20MHz,则您可能希望20MHz*20/2达到200MHz。 您可以使用XCLKOUT引脚上的示波器或频率计数器来检查此情况。 默认分频器为/8,因此,如果启用XCLKOUT并在引脚上测量25MHz,则CPU将以预期的200MHz运行。 如果您测量的是12.5MHz,则它仅以100MHz运行...等
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,Devin,

    感谢你的最大帮助。 您能给我一个启动XCLKOUT引脚的代码示例吗? 我需要使用示波器查看此引脚。

    此致,
    Amin
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Amin:

    您是否能够获得引脚上的XCLKOUT或以其他方式获得正确的波特率? 您可以使用以下代码在PIN上启用XCLKOUT:

    gpioCtrlRegs.GPCGMUX1.bit.GPIO73 = 0;
    GpioCtrlRegs.GPCMUX1.bit.GPIO73 = 3;
    GpioCtrlRegs.GPCDIR.bit.GPIO73 = 0;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,Devin,

    感谢你的帮助。

    此致,
    Amin