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

发布者:boczsy2018最新更新时间:2015-06-12 来源: eepw关键字:niosII  串口RS232  结构体  联合体结合 手机看文章 扫描二维码
随时随地手机看文章
这一节,我们针对大家提出的有关定义寄存器结构体的问题进行解析。在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. 为什么里面的变量都定义成unsigned long int?

      首先需要说明一点,在NIOS II中,unsigned long int是32位,跟unsigned int是一样的,unsigned long long int才是64位的。

有人会问,在寄存器的表格中,寄存器的位数是0到15的,也就是16位,那你为什么定义成32位的呢?其实,这个问题涉及到了NIOS II的地址对齐问题,它是属于硬件构架的范畴。

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

     我们要将寄存器定义为unsigned long int类型,就跟这个静态地址对齐有关系了。现在我们是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. 为什么要建立这样一个共用体呢,又有位域结构体又有一个volatile unsigned long int WORD变量,WORD有啥用呢?

      共用体的特点就是其中的成员占用同一个存储空间。也就说,由位域组成的结构体跟WORD是占用同一存储空间,而且他们都是volatile unsigned long int类型,那么,结构体中的每一个位域成员都对应WORD的一个位。当我们需要单独处理一个位的时候,我们就可以用位域,如下所示

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

如果我们想要对状态寄存器整体清零呢,我们就可以用到WORD了,如下所示

RS232->STATUS.WORD=0;//清除状态寄存器

对于其他的寄存器都是一样的,在这里不再重复了。

关键字:niosII  串口RS232  结构体  联合体结合 引用地址:niosII中串口RS232程序使用结构体和联合体结合的用法

上一篇:RS-232接口与单片机串行通信程序
下一篇:什么是RS485通信RS485接口RS232接口

推荐阅读最新更新时间:2024-05-02 23:44

寄存器物理地址映射到结构封装的寄存器的过程
一、 STM32头文件中 结构体封装寄存器的方式 typedef struct { vu32 CR; vu32 CFGR; vu32 CIR; vu32 APB2RSTR; vu32 APB1RSTR; vu32 AHBENR; vu32 APB2ENR; vu32 APB1ENR; vu32 BDCR; vu32 CSR; } RCC_TypeDef; #define PERIPH_BASE ((u32)0x40000000) #define AHBPERIPH_BASE (PERIPH_BASE + 0x20000) #define RCC_BA
[单片机]
低码率语音编码MELP声码器的SOPC实现
  摘 要: 讨论了低码率语音编码MELP的编解码过程,有效降低了语音编码码率并能使说话者个人语音特征减弱,特别适合需要弱化说话者语音特点的场合。给出了其FPGA的硬件实现框图,据此可进行具体的硬件设计。同时给出了MELP编解码框图,可用于进一步的软件编制。   语音编码技术在当今数字通信尤其在无线系统中发挥着越来越重要的作用。利用语音编码技术可有效降低信息存储量、提高信道利用率。混合激励线性预测(MELP)语音编码算法能在较低码率下提供较高的语音质量、自然度和清晰度,已成为美国国防部新的2.4 Kb/s的语音编码标准。   Nios II处理器是Intel公司为Altera公司推出的32位精简指令处理器软核。在Altera公
[嵌入式]
低码率语音编码MELP声码器的SOPC实现
RS232串口转RS422接口电路图
RS232串口转RS422接口电路图 
[嵌入式]
21.从0学ARM-为什么使用结构效率会高?一文给你讲透
作为过来人,我发现很多程序猿新手,在编写代码的时候,特别喜欢定义很多独立的全局变量,而不是把这些变量封装到一个结构体中,主要原因是图方便,但是要知道,这其实是一个不好的习惯,而且会降低整体代码的性能。 另一方面,最近有幸与大神【公众号:裸机思维】的傻孩子交流的时候,他聊到:“其实Cortex在架构层面就是更偏好面向对象的(哪怕你只是使用了结构体),其表现形式就是:Cortex所有的寻址模式都是间接寻址——换句话说一定依赖一个寄存器作为基地址。 举例来说,同样是访问外设寄存器,过去在8位和16位机时代,人们喜欢给每一个寄存器都单独绑定地址——当作全局变量来访问,而现在Cortex在架构上更鼓励底层驱动以寄存器页(也就是结构体
[单片机]
21.从0学ARM-为什么使用<font color='red'>结构</font><font color='red'>体</font>效率会高?一文给你讲透
基于NIOS II的BCMO4蓝牙通信模块的设计
      引言   在工业现场中,大多的通信设备是通过加装通信模块来实现的,而大多的通信模块的处理器采用ARM核。随着微电子学和计算机科学的迅速发展,电子系统已经从电路板级系统集成发展成为包括ASIC、FPGA和嵌入式系统的多种模式。SOPC由于集成了硬核或软核CPU、DSP、存储器、外围I/O及可编程逻辑模块,在设计和应有的灵活性及其成本方面有较大的优势。   NIOSⅡ系列处理器是Altera公司的第二代FPGA嵌入式处理器。同前一代软核的CPU相比,NIOSⅡ的性能得到很大提高,体积更小,其最大处理能力是第一代软核的三倍。逻辑功能方面具有32位的精简指令集CPU。实现方式是在FPGA上通过编程的方式实现,这是与传
[嵌入式]
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved