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.

[参考译文] LAUNCHXL-F28069M:简单 UART 接收程序问题。

Guru**** 2604225 points
Other Parts Discussed in Thread: MSP430F5529

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/678463/launchxl-f28069m-simple-uart-receiving-program-problem

器件型号:LAUNCHXL-F28069M
主题中讨论的其他器件:MSP430F5529

您好!  

我正在尝试设置一个简单的 UART 程序、将发送到 C2000的数据存储到阵列中。 我之前发布了一个类似的问题、但我发现我的答案是这样的! 我修改了我的代码并清除了一些内容。

以下是一些功能 要求:

-9600波特

-当一个消息被接收时 CPU 中断(RXBUF 有一个字节)

-消息不频繁

-消息将由1-2个字组成、例如"Route 1"、"Go"或"Top"。

- C2000将连接到 HC06、它将通过蓝牙接收来自应用程序的数据。 这已经在 MSP430F5529 @ 9600波特下进行了测试和确认

我已经完成了两个示例项目、但我在这个应用中遇到了一些问题。

我让 HC06的 TX 进入引脚3、如果我理解正确、J1.3在跳线短接 JP6和 JP7时也是 GPIO28、这是对的吗?

这里是我的 SCI 代码(我知道没有包含什么、也不包含什么、这是因为它是一个更大的项目的一部分、其中包含计时器、ePWM、ECAP 等):

_interrupt void sciaRxFifoIsr (void);

volatile unsigned char RXParseData[256]={};//存储 RXBUF 中接收到的数据的数组

void main (void)

//-- CPU 初始化
InitSysCtrl();//初始化 CPU (文件:sysctrl.c)

InitPieCtrl();//初始化并启用 PIE (文件:PIECTRL.c)
InitWatchdog();//初始化看门狗计时器(文件:watchdog.c)

//-- SCI ----设置
EALLOW;

/*为所选引脚启用内部上拉*/
//用户可以启用或禁用上拉。
//这将启用指定引脚的上拉电阻。

GpioCtrlRegs.GPAPUD.bit.GPIO28 = 0;//为 GPIO28启用上拉(SCIRXDA)

/*将所选引脚的限定条件设置为仅异步*/
默认情况下、//输入与 SYSCLKOUT 同步。
//这将为所选引脚选择异步(无限定条件)。

GpioCtrlRegs.GPAQSEL2.bit.GPIO28 = 3;//异步输入 GPIO28 (SCIRXDA)

/*使用 GPIO 寄存器配置 SCI-A 引脚*/
//这指定哪些可能的 GPIO 引脚将是 SCI 功能引脚。

GpioCtrlRegs.GPAMUX2.bit.GPIO28=1;//为 SCIRXDA 操作配置 GPIO28

EDIS;

//结束 SCI 设置

//步骤3. 清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
Dint;

//将 PIE 控制寄存器初始化为默认状态。
//默认状态为禁用所有 PIE 中断和标志
//被清除。
//此函数位于 F2806x_PIECTRL.c 文件中。
InitPieCtrl();

//禁用 CPU 中断并清除所有 CPU 中断标志:
IER = 0x0000;
IFR = 0x0000;

//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//这将填充整个表,即使是中断也是如此
//在本例中未使用。 这对于调试很有用。
//可以在 F2806x_DefaultIsr.c 中找到 shell ISR 例程
//此函数可在 F2806x_PieVect.c 中找到
InitPieVectTable();

//此示例中使用的中断被重新映射到
//此文件中的 ISR 函数。
EALLOW;//这是写入 EALLOW 受保护寄存器所必需的
PieVectTable.SCIRXINTA =&sciaRxFifoIsr;
EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需的

//FIFO 设置
SciaRegs.SCICCR.all =0x0007;// 1停止位,无回路
//无奇偶校验,8个字符位,
//异步模式,空闲线协议

SciaRegs.SCICTL1.all =0x0001;//启用 RX、内部 SCICLK、
//禁用 TX、RX ERR、睡眠、TXWAKE
SciaRegs.SCICTL2.bit.RXBKINTENA=1;
SciaRegs.SCIHBAUD = 0x0000;
SciaRegs.SCILBAUD = 0x00C2;// 9600 baud ->在常见波特率中找到、BRR = 0xC2或194 (十进制)

SciaRegs.SCIFFRX.All=0x0022;
SciaRegs.SCIFFCT.All=0x00;

SciaRegs.SCICTL1.all =0x0021;//从复位中撤回 SCI
SciaRegs.SCIFFRX.bit.RXFIFORESET=1;

//启用此示例所需的中断
PieCtrlRegs.PIECTRL.bit.ENPIE = 1;//启用 PIE 块
PieCtrlRegs.PIEIER9.bit.INTx1=1;// PIE 组9,INT1
PieCtrlRegs.PIEIER9.bit.INTx2=1;// PIE 组9,int2
IER = 0x100;//启用 CPU INT
EINT;

//--启用全局中断
asm (" CLRC INTM、DBGM");//启用全局中断和实时调试

_interrupt void sciaRxFifoIsr (void)

uint16 i = 0;
for (i=0;i<2;i++)

RXParseData[i]=SciaRegs.SCIRXBUF.all;//读取数据

while (i!= NULL)

RXParseData[i]=SciaRegs.SCIRXBUF.all;//读取数据 --- >第一个字符的 ASCII 代码与接收的内容不匹配。 例如 "停止"中的"S"最终为0x87
i++;//----------------- >我一直在递增


SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1;//清除溢出标志
SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;//清除中断标志

PieCtrlRegs.PIEACX.All|=0x100;//发出 PIE ACK

正如最后一个注释、当我更改波特率时、我注意到 RXBUF 中有不同的值。 我相信我的运行速度是90MHz (也许我不是这样、这是问题吗? 如何确认?)。 我在 MSP430上完成了这项工作、因此蓝牙模块很好!  

谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当您更改波特率时、SCI 将以该波特率解释字符。 这可能是字符不同的原因。

    您需要根据与 SYSCLK 相关的 LSPCLK 来配置波特率。

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

    是的、我理解这一点。 我相信我的运行频率是90MHz、上面的代码被配置为9600波特。 如何确认以90MHz 运行? 如果我发现我不是90MHz、您能指导我将芯片设置为以90MHz 运行、因为我不会对 LSPCLK 的 SYSCLK 时钟进行分频。

    此外、固有精确的时钟是否会使发送的 NULL 变得混乱? 在我的 ISR 中、我会永远卡住(而我!= NULL)。

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

    请参阅 TRM 和第1节-系统控制和中断。

    F2806x 具有 XCLKOUT 功能、在该功能中、您可以使用 SYSCLK 驱动外部 GPIO 引脚。

    第1.4.2.11节中的图1-42说明了这一点。

    此致、
    SAL
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    一定要来! 固有精确的时钟是否会使发送的 NULL 变得混乱? 在我的 ISR 中、我会永远卡住(而我!= NULL)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的。 所有字符都可能损坏。

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

    你好 Sal!

    我讨厌麻烦、但我在学校里很忙、我很好地看了将 SYSCLK 输出到引脚的寄存器配置、但让它仅用于测试时钟频率似乎有点麻烦。 默认频率是否为90MHz?

    我所做的唯一可能更改频率的操作是在计时器设置中从示例项目中提取的内容:

    //将 CPU 定时器0配置为中断:
    // 80MHz CPU 频率,1秒周期(以 uSeconds 为单位)
    ConfigCpuTimer (&CpuTimer0、80、100000);//100ms

    空 ConfigCpuTimer (struct CPUTIME_VARS *定时器、浮点频率、浮点周期)

    uint32 PeriodInClocks;

    //初始化计时器周期:
    Timer->CPUFreqInMHz =频率;
    Timer->PeriodInUSec =周期;
    PeriodInClocks =(long)(Freq * Period);
    Timer->RegsAddr->PRD.All = PeriodInClocks - 1;//计数器每个周期递减 PRD+1次

    //将预分频计数器设置为1分频(SYSCLKOUT):
    Timer->RegsAddr->TPR.All = 0;
    Timer->RegsAddr->TPRH。ALL = 0;

    //初始化计时器控制寄存器:
    timer->RegsAddr->TCR.bit.TSS = 1;// 1 =停止计时器,0 =启动/重新启动计时器
    timer->RegsAddr->TCR.bit.TRB = 1;// 1 =重新加载计时器
    Timer->RegsAddr->TCR.bit.Soft = 1;  
    Timer->RegsAddr->TCR.bit.FREE = 0;//禁用计时器自由运行
    Timer->RegsAddr->TCR.bit.tie = 1;// 0 =禁用/ 1 =启用计时器中断

    //复位中断计数器:
    Timer->InterruptCount = 0;



    这是否意味着我处于80MHz?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    唯一要接触的是 CPU 定时器寄存器。 这不会影响 CPU 或 SYSCLK 频率。

    默认情况下、我认为 LSPCLK 是 SYSCLK/4。 您的器件应以90MHz 运行、这正是我们的示例默认设置为配置的内容。

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

    很酷! 这就是我的想法。 如果是这种情况、那么我认为我的配置是正确的。

    我想我看到问题了!

    在参考指南(13.1.1.9)中、LSPCLK 为15MHz、我将以默认的22.5MHz 运行?

    寄存器值应为:

    ScibRegs.SCIHBAUD = 0x0000;
    ScibRegs.SCILBAUD = 0x0123;//9600波特

    使用:22500000/(9600*8)- 1.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    应为22.5MHz。 我认为默认值是 SYSCLK/4。

    SAL
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    嘿、Sal、抱歉、我不称职、但我已经设置了我的代码、我的 ISR 中没有任何东西会将接收缓冲区中的值移动到数组中。 尽管如此、我被打断并进入 ISR、您认为您看到了错误吗?

    我尝试了几个波特率、我在 MSP430上以9600波特工作、但我不明白为什么这不工作。

    _interrupt void sciaRxFifoIsr (void);
    char RXParseData[256]={};//将接收到的数据存储在 RXBUF 中的数组

    void main (void)



    //-- CPU 初始化
    InitSysCtrl();//初始化 CPU (文件:sysctrl.c)

    InitPieCtrl();//初始化并启用 PIE (文件:PIECTRL.c)
    InitWatchdog();//初始化看门狗计时器(文件:watchdog.c)

    //-- SCI ----设置
    EALLOW;

    /*为所选引脚启用内部上拉*/
    //用户可以启用或禁用上拉。
    //这将启用指定引脚的上拉电阻。

    GpioCtrlRegs.GPAPUD.bit.GPIO28 = 0;//为 GPIO28启用上拉(SCIRXDA)

    /*将所选引脚的限定条件设置为仅异步*/
    默认情况下、//输入与 SYSCLKOUT 同步。
    //这将为所选引脚选择异步(无限定条件)。

    GpioCtrlRegs.GPAQSEL2.bit.GPIO28 = 3;//异步输入 GPIO28 (SCIRXDA)


    /*使用 GPIO 寄存器配置 SCI-A 引脚*/
    //这指定哪些可能的 GPIO 引脚将是 SCI 功能引脚。

    GpioCtrlRegs.GPAMUX2.bit.GPIO28=1;//为 SCIRXDA 操作配置 GPIO28

    EDIS;

    //结束 SCI 设置

    //步骤3. 清除所有中断并初始化 PIE 矢量表:
    //禁用 CPU 中断
    Dint;

    //将 PIE 控制寄存器初始化为默认状态。
    //默认状态为禁用所有 PIE 中断和标志
    //被清除。
    //此函数位于 F2806x_PIECTRL.c 文件中。
    InitPieCtrl();

    //禁用 CPU 中断并清除所有 CPU 中断标志:
    IER = 0x0000;
    IFR = 0x0000;

    //使用指向 shell 中断的指针初始化 PIE 矢量表
    //服务例程(ISR)。
    //这将填充整个表,即使是中断也是如此
    //在本例中未使用。 这对于调试很有用。
    //可以在 F2806x_DefaultIsr.c 中找到 shell ISR 例程
    //此函数可在 F2806x_PieVect.c 中找到
    InitPieVectTable();

    //此示例中使用的中断被重新映射到
    //此文件中的 ISR 函数。
    EALLOW;//这是写入 EALLOW 受保护寄存器所必需的
    PieVectTable.SCIRXINTA =&sciaRxFifoIsr;
    EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需的

    //FIFO 设置
    SciaRegs.SCICCR.all =0x0007;// 1停止位,无回路
    //无奇偶校验,8个字符位,
    //异步模式,空闲线协议

    SciaRegs.SCICTL1.all =0x0001;//启用 RX、内部 SCICLK、
    //禁用 TX、RX ERR、睡眠、TXWAKE
    SciaRegs.SCICTL2.bit.RXBKINTENA=1;
    SciaRegs.SCIHBAUD = 0x0000;
    SciaRegs.SCILBAUD = 0x0492;// 9600波特,我还尝试了0x0123。

    SciaRegs.SCIFFRX.All=0x0022;
    SciaRegs.SCIFFCT.All=0x00;

    SciaRegs.SCICTL1.all =0x0021;//从复位中撤回 SCI
    SciaRegs.SCIFFRX.bit.RXFIFORESET=1;

    //启用此示例所需的中断
    PieCtrlRegs.PIECTRL.bit.ENPIE = 1;//启用 PIE 块
    PieCtrlRegs.PIEIER9.bit.INTx1=1;// PIE 组9,INT1
    PieCtrlRegs.PIEIER9.bit.INTx2=1;// PIE 组9,int2
    IER = 0x100;//启用 CPU INT
    EINT;

    //--启用全局中断
    asm (" CLRC INTM、DBGM");//启用全局中断和实时调试



    _interrupt void sciaRxFifoIsr (void)

    uint16 i = 0;

    while (1)

    RXParseData[I]=SciaRegs.SCIRXBUF.ALL;//读取数据'Sctop'结束为0x87
    i++;



    SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1;//清除溢出标志
    SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;//清除中断标志

    PieCtrlRegs.PIEACX.All|=0x100;//发出 PIE ACK