您的位置 首页 设计

niosII中串口RS232程序运用结构体和联合体结合的用法

这一节,我们针对大家提出的有关定义寄存器结构体的问题进行解析。在NIOSII软件开发过程中,如果使用我们提出的寄存器操作方式的话,首先

这一节,咱们针对咱们提出的有关界说寄存器结构体的问题进行解析。在NIOS II软件开发过程中,假如运用咱们提出的寄存器操作方法的话,首要需求界说一个寄存器结构体,之所以这样做是为了在软件书写过程中操作便利,更是为了增强程序的可读性。咱们就拿UART来举例阐明。

首要,咱们看一下UART的寄存器阐明,如下表所示

咱们经过上表能够看到,UART包含6个寄存器(因为最终一个寄存器一般不必,所以树立的结构体中没有参加它),假定基地址为0x00的话,那么他们的地址分别为0x00,0x01,0x02,0x03,0x04,0x05。也便是说,各个寄存器之间是存在次序的。那么,在咱们树立结构体过程中也要留意他们的次序问题。树立的结构体如下所示

view source

print?

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

关于这样一个大的结构体,咱们来逐层剖析一下:

榜首, 整个结构体由5个共用体组成,共同体的次序是由寄存器的偏移量决议的,这一点前面现已有所叙说。

第二, 每个共用体由一个结构体和一个volatile unsigned long int型的变量组成。

第三, 共用体中的结构体由位域构成,位域中的内容也是存在次序的,这个次序是由寄存器的结构决议,并且是由低到高摆放。其间,NC表明该位为空位或保存,不能对其进行操作。

经过咱们的反应,除了语法问题以外,有两个问题需求阐明一下:

1. 为什么里边的变量都界说成unsignedlongint?

首要需求阐明一点,在NIOS II中,unsignedlongint是32位,跟unsignedint是相同的,unsignedlonglongint才是64位的。

有人会问,在寄存器的表格中,寄存器的位数是0到15的,也便是16位,那你为什么界说成32位的呢?其实,这个问题触及到了NIOS II的地址对齐问题,它是归于硬件构架的领域。

当体系中存在数据宽度不匹配的主从端口时就要考虑地址对齐的问题。地址对齐分为两类,一类是静态地址对齐,另一类便是动态地址对齐。一般来说存储器外设运用动态地址对齐,而寄存器外设运用静态地址对齐,之所以是这样,是由动态地址对齐和静态地址对齐的特色决议的,在静态地址对齐方法下,主端单次传输对应从端口的一次传输,而在动态地址对齐方法下,一个主端口读传输,则要引起屡次从端口读传输。想要愈加具体的了解他们特色的,咱们自行查找吧,我在这里就不具体叙说了。

咱们要将寄存器界说为unsignedlongint类型,就跟这个静态地址对齐有关系了。现在咱们是UART端口16位,而NIOS II主端口32位的状况,在这种状况下,NIOS II主端口与16位UART端口进行数据传输时,只要32位的低16位有用,可是高16位也占用了地址空间,也便是说,UART端口的16位实际上是占用了32位的。假定咱们现在的基地址是0X00,那么6个寄存器他们相对基地址的偏移分别为0X00,0X01,0X02,0X03,0X04,0X05;那么,从主端口看,这6个寄存器的地址分别为0X00,0X04,0X08,0X0C,0X10,0X14,而不是0X00,0X01,0X02,0X03,0X04,0X05,也不是0X00,0X02,0X06,0X08,0X0A,0XC,这一点咱们要特别留意。

2. 为什么要树立这样一个共用体呢,又有位域结构体又有一个volatileunsignedlongintWORD变量,WORD有啥用呢?

共用体的特色便是其间的成员占用同一个存储空间。也就说,由位域组成的结构体跟WORD是占用同一存储空间,并且他们都是volatileunsignedlongint类型,那么,结构体中的每一个位域成员都对应WORD的一个位。当咱们需求独自处理一个位的时分,咱们就能够用位域,如下所示

RS232->CONTROL.BITS.IRRDY=1;//接纳准备好中止使能

假如咱们想要对状况寄存器全体清零呢,咱们就能够用到WORD了,如下所示

RS232->STATUS.WORD=0;//铲除状况寄存器

关于其他的寄存器都是相同的,在这里不再重复了。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/sheji/231837.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部