色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          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)體的問(wèn)題進(jìn)行解析。在NIOS II軟件開(kāi)發(fā)過(guò)程中,如果使用我們提出的寄存器操作方式的話(huà),首先需要定義一個(gè)寄存器結(jié)構(gòu)體,之所以這樣做是為了在軟件書(shū)寫(xiě)過(guò)程中操作方便,更是為了增強(qiáng)程序的可讀性。我們就拿UART來(lái)舉例說(shuō)明。

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

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

          我們通過(guò)上表可以看到,UART包括6個(gè)寄存器(由于最后一個(gè)寄存器一般不用,所以建立的結(jié)構(gòu)體中沒(méi)有加入它),假設(shè)基地址為0x00的話(huà),那么他們的地址分別為0x00,0x01,0x02,0x03,0x04,0x05。也就是說(shuō),各個(gè)寄存器之間是存在順序的。那么,在我們建立結(jié)構(gòu)體過(guò)程中也要注意他們的順序問(wèn)題。建立的結(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ǔ)法問(wèn)題以外,有兩個(gè)問(wèn)題需要說(shuō)明一下:

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

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

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

          當(dāng)系統(tǒng)中存在數(shù)據(jù)寬度不匹配的主從端口時(shí)就要考慮地址對(duì)齊的問(wèn)題。地址對(duì)齊分為兩類(lèi),一類(lèi)是靜態(tài)地址對(duì)齊,另一類(lèi)就是動(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類(lèi)型,就跟這個(gè)靜態(tài)地址對(duì)齊有關(guān)系了?,F(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類(lèi)型,那么,結(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ù)專(zhuān)區(qū)

          關(guān)閉