在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > niosII中串口RS232程序使用結(jié)構(gòu)體和聯(lián)合體結(jié)合的用法

            niosII中串口RS232程序使用結(jié)構(gòu)體和聯(lián)合體結(jié)合的用法

            作者: 時(shí)間:2016-12-16 來(lái)源:網(wǎng)絡(luò) 收藏
            這一節(jié),我們針對(duì)大家提出的有關(guān)定義寄存器結(jié)構(gòu)體的問題進(jìn)行解析。在NIOS II軟件開發(fā)過(guò)程中,如果使用我們提出的寄存器操作方式的話,首先需要定義一個(gè)寄存器結(jié)構(gòu)體,之所以這樣做是為了在軟件書寫過(guò)程中操作方便,更是為了增強(qiáng)程序的可讀性。我們就拿UART來(lái)舉例說(shuō)明。

            首先,我們看一下UART的寄存器說(shuō)明,如下表所示

            本文引用地址:http://www.biyoush.com/article/201612/330842.htm

            我們通過(guò)上表可以看到,UART包括6個(gè)寄存器(由于最后一個(gè)寄存器一般不用,所以建立的結(jié)構(gòu)體中沒有加入它),假設(shè)基地址為0x00的話,那么他們的地址分別為0x00,0x01,0x02,0x03,0x04,0x05。也就是說(shuō),各個(gè)寄存器之間是存在順序的。那么,在我們建立結(jié)構(gòu)體過(guò)程中也要注意他們的順序問題。建立的結(jié)構(gòu)體如下所示

            view source
            print?
            01typedef struct{
            02union{
            03struct{
            04volatile unsigned long int RECEIVE_DATA :8;
            05volatile unsigned long int NC :24;
            06} BITS;
            07volatile unsigned long int WORD;
            08} RXDATA;
            09
            10union{
            11struct{
            12volatile unsigned long int TRANSMIT_DATA :8;
            13volatile unsigned long int NC :24;
            14} BITS;
            15volatile unsigned long int WORD;
            16} TXDATA;
            17
            18union{
            19struct{
            20volatile unsigned long int PE :1;
            21volatile unsigned long int FE :1;
            22volatile unsigned long int BRK :1;
            23volatile unsigned long int ROE :1;
            24volatile unsigned long int TOE :1;
            25volatile unsigned long int TMT :1;
            26volatile unsigned long int TRDY :1;
            27volatile unsigned long int RRDY :1;
            28volatile unsigned long int E :1;
            29volatile unsigned long int NC :1;
            30volatile unsigned long int DCTS :1;
            31volatile unsigned long int CTS :1;
            32volatile unsigned long int EOP :1;
            33volatile unsigned long int NC1 :19;
            34} BITS;
            35volatile unsigned long int WORD;
            36} STATUS;
            37
            38union{
            39struct{
            40volatile unsigned long int IPE :1;
            41volatile unsigned long int IFE :1;
            42volatile unsigned long int IBRK :1;
            43volatile unsigned long int IROE :1;
            44volatile unsigned long int ITOE :1;
            45volatile unsigned long int ITMT :1;
            46volatile unsigned long int ITRDY :1;
            47volatile unsigned long int IRRDY :1;
            48volatile unsigned long int IE :1;
            49volatile unsigned long int TRBK :1;
            50volatile unsigned long int IDCTS :1;
            51volatile unsigned long int RTS :1;
            52volatile unsigned long int IEOP :1;
            53volatile unsigned long int NC :19;
            54} BITS;
            55volatile unsigned long int WORD;
            56} CONTROL;
            57
            58union{
            59struct{
            60volatile unsigned long int BAUD_RATE_DIVISOR :16;
            61volatile unsigned long int NC :16;
            62} BITS;
            63volatile unsigned long int WORD;
            64} DIVISOR;
            65
            66}UART_STR;

            對(duì)于這樣一個(gè)大的結(jié)構(gòu)體,我們來(lái)逐層分析一下:

            第一, 整個(gè)結(jié)構(gòu)體由5個(gè)共用體組成,共同體的順序是由寄存器的偏移量決定的,這一點(diǎn)前面已經(jīng)有所敘述。

            第二, 每個(gè)共用體由一個(gè)結(jié)構(gòu)體和一個(gè)volatile unsigned long int型的變量組成。

            第三, 共用體中的結(jié)構(gòu)體由位域構(gòu)成,位域中的內(nèi)容也是存在順序的,這個(gè)順序是由寄存器的結(jié)構(gòu)決定,而且是由低到高排列。其中,NC表示該位為空位或保留,不能對(duì)其進(jìn)行操作。

            通過(guò)大家的反饋,除了語(yǔ)法問題以外,有兩個(gè)問題需要說(shuō)明一下:

            1. 為什么里面的變量都定義成unsignedlongint?

            首先需要說(shuō)明一點(diǎn),在NIOS II中,unsignedlongint是32位,跟unsignedint是一樣的,unsignedlonglongint才是64位的。

            有人會(huì)問,在寄存器的表格中,寄存器的位數(shù)是0到15的,也就是16位,那你為什么定義成32位的呢?其實(shí),這個(gè)問題涉及到了NIOS II的地址對(duì)齊問題,它是屬于硬件構(gòu)架的范疇。

            當(dāng)系統(tǒng)中存在數(shù)據(jù)寬度不匹配的主從端口時(shí)就要考慮地址對(duì)齊的問題。地址對(duì)齊分為兩類,一類是靜態(tài)地址對(duì)齊,另一類就是動(dòng)態(tài)地址對(duì)齊。一般來(lái)說(shuō)存儲(chǔ)器外設(shè)使用動(dòng)態(tài)地址對(duì)齊,而寄存器外設(shè)使用靜態(tài)地址對(duì)齊,之所以是這樣,是由動(dòng)態(tài)地址對(duì)齊和靜態(tài)地址對(duì)齊的特點(diǎn)決定的,在靜態(tài)地址對(duì)齊方式下,主端單次傳輸對(duì)應(yīng)從端口的一次傳輸,而在動(dòng)態(tài)地址對(duì)齊方式下,一個(gè)主端口讀傳輸,則要引起多次從端口讀傳輸。想要更加具體的了解他們特點(diǎn)的,大家自行查找吧,我在這里就不詳細(xì)敘述了。

            我們要將寄存器定義為unsignedlongint類型,就跟這個(gè)靜態(tài)地址對(duì)齊有關(guān)系了。現(xiàn)在我們是UART端口16位,而NIOS II主端口32位的情況,在這種情況下,NIOS II主端口與16位UART端口進(jìn)行數(shù)據(jù)傳輸時(shí),只有32位的低16位有效,但是高16位也占用了地址空間,也就是說(shuō),UART端口的16位實(shí)際上是占用了32位的。假設(shè)我們現(xiàn)在的基地址是0X00,那么6個(gè)寄存器他們相對(duì)基地址的偏移分別為0X00,0X01,0X02,0X03,0X04,0X05;那么,從主端口看,這6個(gè)寄存器的地址分別為0X00,0X04,0X08,0X0C,0X10,0X14,而不是0X00,0X01,0X02,0X03,0X04,0X05,也不是0X00,0X02,0X06,0X08,0X0A,0XC,這一點(diǎn)大家要特別注意。

            2. 為什么要建立這樣一個(gè)共用體呢,又有位域結(jié)構(gòu)體又有一個(gè)volatileunsignedlongintWORD變量,WORD有啥用呢?

            共用體的特點(diǎn)就是其中的成員占用同一個(gè)存儲(chǔ)空間。也就說(shuō),由位域組成的結(jié)構(gòu)體跟WORD是占用同一存儲(chǔ)空間,而且他們都是volatileunsignedlongint類型,那么,結(jié)構(gòu)體中的每一個(gè)位域成員都對(duì)應(yīng)WORD的一個(gè)位。當(dāng)我們需要單獨(dú)處理一個(gè)位的時(shí)候,我們就可以用位域,如下所示

            RS232->CONTROL.BITS.IRRDY=1;//接收準(zhǔn)備好中斷使能

            如果我們想要對(duì)狀態(tài)寄存器整體清零呢,我們就可以用到WORD了,如下所示

            RS232->STATUS.WORD=0;//清除狀態(tài)寄存器

            對(duì)于其他的寄存器都是一樣的,在這里不再重復(fù)了。



            評(píng)論


            技術(shù)專區(qū)

            關(guān)閉