2015-04-30 48 views
1

我做了一個有點聲明的dsPIC30F4011的位申報了兩個寄存器

我宣佈一個部分

typedef struct tagCxTXxSIDBITS_tagCxTXxEIDBITS { 
    unsigned  : 2; 
    unsigned SRC7_2 : 6; 
    unsigned  : 8; 
    unsigned  : 14; 
    unsigned SRC1_0 : 2; 
} CxTXxSRCBITS; 

extern volatile unsigned int C1TX0SRC __attribute__((__sfr__)); 
extern volatile CxTXxSRCBITS C1TX0SRCbits __attribute__((__sfr__)); 
extern volatile unsigned int C1TX1SRC __attribute__((__sfr__)); 
extern volatile CxTXxSRCBITS C1TX1SRCbits __attribute__((__sfr__)); 
extern volatile unsigned int C1TX2SRC __attribute__((__sfr__)); 
extern volatile CxTXxSRCBITS C1TX2SRCbits __attribute__((__sfr__)); 

這是正確的嗎?前兩個CxTXxSID位是0還是1?那麼CxTXxSID位2-7和8是CxTXxSID位8-15是CxTXxEID位0-13的14位?而最後兩個CxTXxEID位14和15?

如果是,我做了正確

如果我寫在我的代碼

C1TX0SRC = 0x0001; 

我會得到下面的寄存器?

C1TX0SID = 0b0000000000000000 
C1TX0EID = 0b0100000000000000 

回答

0

位順序應該是正確的。但是你爲什麼不自己測試一下呢?幾天前我做了這樣的事情:

#include <stdint.h> 
    typedef union { 
    uint8_t byte; 
    struct { 
     unsigned bit0:1; 
     unsigned bit1:1; 
     unsigned bit2:1; 
     unsigned bit3:1; 
     unsigned bit4:1; 
     unsigned bit5:1; 
     unsigned bit6:1; 
     unsigned bit7:1; 
    }; 
    } byte_t; 


/* 
         Main application 
*/ 
void main(void) 
{ 
    byte_t testbyte; 
    testbyte.byte = 0b01100011; 
    while (1) 
    { 
     uint8_t bit0 = testbyte.bit0; 
     uint8_t bit1 = testbyte.bit1; 
     uint8_t bit2 = testbyte.bit2; 
     uint8_t bit3 = testbyte.bit3; 
     uint8_t bit4 = testbyte.bit4; 
     uint8_t bit5 = testbyte.bit5; 
     uint8_t bit6 = testbyte.bit6; 
     uint8_t bit7 = testbyte.bit7; 

     uint8_t temp = 0; 
    } 
} 

你可以在mplabx模擬器中測試這個,甚至不需要硬件。最後只需設置一個調試斷點即可。

編輯:我的答案可能有點太快了。重讀你的問題後,我明白你的主要擔心不是位順序,而是你的結構是否與你的寄存器對齊的問題。我不明白sfr屬性是如何工作的。在xc8中有一個「@」運算符,它可以爲特定的內存區域分配一些值。但是您可以使用調試器來獲取您寫入值的實際地址。

編輯編輯:現在我對sfr屬性有一些瞭解。因爲你沒有說明你做了什麼,我假設你沒有改變你的鏈接文件,是嗎?要將結構放置在特殊功能寄存器之上,必須更改 Microchip \ xc16 \ vx.xx \ support \ dsPIC30F中的鏈接器腳本(* .gld文件)。 下面是標準p30F4011.gld鏈接腳本有點提取物:

C1TX2SID  = 0x340; 
_C1TX2SID  = 0x340; 
_C1TX2SIDbits = 0x340; 
C1TX2EID  = 0x342; 
_C1TX2EID  = 0x342; 
_C1TX2EIDbits = 0x342; 

添加自己的聲明對他們來說,修改makefile,包括修改後的鏈接腳本,你應該是好去(但還沒我自己嘗試過)。

0

該位的順序不是由標準規定的,也不是字節順序,也沒有關於位字段的其他內容,see this

CxTXxSID位的前兩位是0還是1?

沒有人知道,因爲沒有標準的保證。您必須檢查您的編譯器文檔以獲取此特定系統。

然後CxTXxSID位2-7位8位是CxTXxSID位8-15位是CxTXxEID位的0-13位?而最後兩個CxTXxEID位14和15?

沒有人知道。位順序,字節順序,字節順序,位/字節填充...一切都可能是一個問題,標準沒有任何規定。

我在寄存器中得到以下內容嗎?

沒有人知道。你必須檢查編譯器文檔。在實踐中,你可以得到任何二進制goo。便攜,安全的解決方案是根本不使用位域。