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/TMS320F28377S:CCS 中的数据类型问题

Guru**** 2482225 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/669629/ccs-tms320f28377s-data-type-probleum-in-ccs

器件型号:TMS320F28377S

工具/软件:Code Composer Studio

尊敬的所有人:

我正在使用 CCS、在我的项目中、我在数据类型方面遇到了问题。

UNION DATA{

unsigned char d;

}检查;

int main (void){

check.d=32000;

当我将大值放入无符号字符时、它不会发出任何警告、即使在调试器窗口中、它也会显示32000。 实际上、我通过在调试器上获取该负值(-32576)来读取串行端口中的数据。 当我想将其与 fix char 进行比较时、我无法获得正确的结果。

我的串行端口驱动程序如下所示(从电源套件)。

void scib_fifo_init()

EALLOW;
ScibRegs.SCICCR.all = 0x0007;// 1停止位,无环回
//无奇偶校验,8个字符位,
//异步模式,空闲线协议
ScibRegs.SCICTL1.all = 0x0003;//启用 TX、RX、内部 SCICLK、
//禁用 RX ERR、睡眠、TXWAKE
ScibRegs.SCICTL2.bit.TXINTENA=0;
ScibRegs.SCICTL2.bit.RXBKINTENA=1;
ScibRegs.SCIHBAUD.ALL = 0x0002;
ScibRegs.SCILBAUD.ALL = 0x008B;;
ScibRegs.SCICCR.bit.LOOPBKENA=0;//启用回路
SCIFFTX.ALL = 0xC021;
ScibRegs.SCIFFRX.ALL = 0x0021;
ScibRegs.SCIFFCT.all = 0x00;

ScibRegs.SCICTL1.ALL = 0x0023;//从复位中撤回 SCI
ScibRegs.SCIFFTX.bit.TXFIFORESET = 1;
ScibRegs.SCIFFRX.bit.RXFIFORESET = 1;
EDIS;

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

    由于 C28x 上最小的可寻址单元为16位、我认为"char"将是如此宽、可以容纳32000。

    可以在结构中定义一个更小的位置-例如、请参阅头文件如何定义在看起来像 register.bit.field 的结构中几位宽的寄存器

    您将 SCI 接收到的数据读取到什么数据类型? 还有一个'data'联合体?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    它是字符类型我正在读取表单 UART,我认为如果我使用 UNION,那么当从 UART 接收到32000时它应该给出255,那么什么是错误的??
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Sam:

    很抱歉耽误你的时间。

    小于16位的大小使用以下格式在头文件中定义(例如、以下是一组单个位定义):

    结构 ECEINT_BITS{ //位描述
    uint16 rsvd1:1; // 0保留
    UINT16 CEVT1:1; // 1捕获事件1中断使能
    UINT16 CEVT2:1; // 2捕获事件2中断使能
    UINT16 CEVT3:1; // 3捕获事件3中断使能
    UINT16 CEVT4:1; // 4捕获事件4中断使能
    UINT16 CTROVF:1; // 5计数器溢出中断使能
    UINT16 CTR_EQ_PRD:1; // 6周期相等中断使能
    UINT16 CTR_EQ_CMP:1; // 7比较等效中断使能
    uint16 rsvd2:8; // 15:8保留
    };
    
    UNION EINT_REG{
    uint16全部;
    结构 ECEINT_BITS 位;
    }; 

    因此、您可以尝试将"d"定义为

    uint16 d:8; 

    您是否希望它限制为8位?