基于嵌入式NiosⅡ软核的串口直接读写寄存器方式编程

发布者:EtherealGaze最新更新时间:2011-07-08 关键字:软核  寄存器 手机看文章 扫描二维码
随时随地手机看文章
   

O 引言
    Altera公司的FPGA作为全定制芯片的一个代表正在得到日益广泛的应用。为了用户使用方便,Altera公司推出嵌入式软核NiosⅡ可以便利地使用工具生成并放人FPGA芯片中。NiosⅡ软核可以在用户的系统中处理一些诸如人机接口界面、内部时序逻辑控制、外部设备初始化等工作。通用异步收发器(UART),是嵌入式系统上很常用的一个串行接口,由于其方便、简单、易用等特性,在嵌入式系统中依然扮演着十分重要的角色。所以Altera才把UART作为一个连接Nios/NiosⅡ与其相关外设的IP放在SoPC Builder里面供用户使用。Nios一代调试甚至直接用串口。
    NiosⅡ处理器是Intel公司为Altera公司推出的一个32位精简指令处理器软核。在Altera公司推出的软件SoPC中加载NiosⅡ软核和相应的外围接口以及与定义相应的自定义指令,然后对设计进行综合,下载到FPGA中就可以方便地实现一个具有高速DSP功能的嵌入式处理器。
    NiosⅡ处理器的软件开发是建立在ANSI C基础上的。NiosⅡIDE是NiosⅡ系列嵌入式处理器的主要软件开发工具。用户可以在NiosⅡIDE中完成所有的软件开发任务,如编辑、编译、下载、调试和闪存编程。NiosⅡ嵌入式系统的一个重要问题就是软件代码量的大小,这关系到存放代码的存储器件容量大小,因此控制和减小程序代码量是降低系统成本的重要方法,必须首先从处理器的启动顺序开始研究。

1 串口C语言方式编程
    使用该方法要加上下面语句:

    执行上面程序可以得到串口输出结果。
    如果不调用alt_main()函数,则系统默认运行步骤如下:
    (1)调用alt_os_int()函数来执行任何操作系统所特有的初始化。如果HAL是在操作系统里运行的,那么初始化alt_fd_list_lock命令。它可以控制访问HAL文件系统,初始化中断控制器并执行中断。
    (2)调用alt_sys_init()函数,以初始化系统里所有的驱动装置和软件组成部分。
    (3)重新设置C标准I/O通道(stdin,stdout,stderr),以使用合适的器件。
    (4)调用main()。
    (5)调用exit()。main()的返回代码作为exit()的输入。
    该方式使用串口比较简单,但是占用的存储资源比较大,编译时间也较长。

[page]

2 串口直接读写寄存器方式编程
2.1 串口初始化

    NiosⅡ的串口编程有多种方式,比较多的是采用标准C语言写法,占用程序空间比较大。NiosⅡ处理器的启动可采用2种方式:自动初始化和用户自定义初始化。ANSI C标准定义应用程序可以通过调用main()来开始执行。在调用main()之前,应用程序假定运行环境和所有的服务系统都被初始化并准备运行。初始化可以被硬件抽象层(HAL)系统库自动执行。程序员不需要考虑系统的输出设备以及如何初始化每一个外设,HAL会自动初始化整个系统。
    另外,ANSI C标准也提供了一个可变的入口点程序,以避免自动初始化。ANSI C标准还定义程序员能手动初始化任何所用的硬件。alt_ main()函数提供了一个独立式的编程环境,能够完全控制系统的初始化。独立式编程环境可以使程序员手动编写初始化系统的代码。
    HAL提供的系统初始化代码按以下启动顺序运行:
    (1)启动指令和数据高速缓冲存储器;
    (2)配置堆栈;
    (3)配置全局指针;
    (4)通过链接器提供的_bss_start和_bss_end来零初始化BSS层,_bss_start和_bss_end是开始和结束BSS的命令;
    (5)如果当前系统没有启动下载器,就复制.rwdata,.rodata或者剩下的部分到RAM;
    (6)调用alt_main()。
    在NiosⅡIDE工程中,只需简单定义alt_main()就可以实现用户的启动顺序,而且能够选择HAL的服务程序。如果应用程序需要一个alt_ main()入口点程序,可以复制默认的执行作为开始点,根据要求来定制它。

    使用独立式编程环境会增加NiosⅡ程序编写的复杂性。独立式编程环境的主要作用在于减小代码量,但要使用这种方法,需要对NiosⅡ处理器的外设和驱动编写都非常熟悉才行。在NiosⅡIDE中也可以通过某些选项来减小HAL系统库容量,从而达到减小代码量的目的,比使用独立式编程环境容易得多。
    串口部分程序初始化代码如下:
    //串口中断初始化  

2.2 串口收发通信程序
    串口的收发可采用查询和中断方式,中断方式要更好一些。
    查询方式发送子程序代码如下:


    查询方式接收子程序代码如下:

    因为串口的中断号是惟一的,所以中断方式接收发送只能在一个中断函数内。中断方式接收发送子程序代码如下:

    该中断处理程序可进行中断方式接收发送,如果程序需要进行精确的接收发送,还需加上中断程序和主程序的相互控制变量。
2.3 串口通信调试
    在Nios中调试“Hello world!”范例的时候往往会出现这样的错误:nios2-terminal:can\'t open uart:Permission denied。这是因为在调试程序时,打开了另外的串口调试工具,或者可以说是串口侦听器。但实际上NIOS IDE中已经集成了串口调试工具,或者串口侦听器。在任务管理器中nios2-terminal.exe就是这个侦听串口的进程。
    所以,如果用NIOS IDE来观察发送的数据,就不要用其他的串口调试工具,如果在编译之前就打开了其他的串口侦听器,编译链接的时候就会出现上述的错误。而在程序编译链接后再去打开其他的串口侦听器,串口就会因为nios2-terminal.exe占用而无法打开。解决的方法,如果想用NIOS IDE观察的话就不要事先打开其他的串口调试工具。而如果想用其他的串口调试工具来观察数据,通过USB_BLASTER将数据下载到板子后,删除任务管理器中的nios2_terminal.exe,然后打开串口调试工具。如果程序没有问题,运行后就可以看到数据。

3 结果与讨论
    为证明以上程序的可运用性,特别制作了电路来验证,芯片使用EP3C40,PC端使用串口调试助手,波特率为19 200 b/s,8位数据位,1位停止位,无校验位。实验结果如图2所示。


    经实验证明,该方法简单可靠,可以生成比较小的代码。

4 结语
    本文讨论了嵌入式软核NiosⅡ中串口模块的编程方法,给出了串口模块编程的示例代码,经实际运用,效果良好,具有一定的参考意义。

关键字:软核  寄存器 引用地址:基于嵌入式NiosⅡ软核的串口直接读写寄存器方式编程

上一篇:基于Cypress的EZ-Color控制器的高亮LED照明混色方案
下一篇:基于NiosⅡ软核的嵌入式多路视频点播系统

推荐阅读最新更新时间:2024-05-02 21:29

51单片机-IO口
IO口寄存器是RAM中的一些特殊功能单元,映射到片上外设相应的功能。如P0就是寄存器的变量,代表的是一个8位的存储空间,它的每一位映射到单片机的P0口的每一位。寄存器是程序,单片机以及外设口发生联系的桥梁。IO口是可以将 0 或 1 转换为电压信号的端口。单片机中最常用的TTL电平:0V代表 0 ,+5V代表 1 。MCS51有4个8位IO口:P0,P1,P2,P3,每个IO口有8位。 IO口的性能指标: 灌电能力:能够流入IO口的最大电流 拉电能力:能够从IO口流出的最大电流 上拉电阻与下拉电阻 最大输入电压 输入口接了一个大于10M欧的电阻,输入+5V或0会产生微弱的电流。 IO口的输出:
[单片机]
51单片机-IO口
寄存器,存储器,RAM,ROM有什么区别?
这些都是比较抽象的专业名词了,特别是寄存器,很多人在学单片机的时候对这个一脸懵逼,寄存器到底是个啥玩意? 其实不用很深刻的理解它到底是什么,你只需要知道通过配置寄存器的值,就可以把外设用起来。 我做单片机开发的这10几年,接触寄存器非常多,比如单片机有寄存器,很多外围芯片也有寄存器(EEPROM、FLASH、时钟芯片等),只要你掌握其中一个,其它的都可以触类旁通。 就像密码锁一样,设置正确的密码,锁就会打开,寄存器也是一样,设置正确的值,芯片资源就能为你所用。 下面更加全面地介绍下它们之间的区别: 一、寄存器 在单片机应用上,寄存器(register)通常用于存储程序的运行时状态,例如程序计数器(Program Counter,P
[单片机]
#51单片机#定时器
标准的51单片机内部有T0和T1两个定时器。 定时器的计数值储存在寄存器中。TH0/TL0用于T0,TH1/TL1用于T1. 定时器存储寄存器 TCON——定时器控制存储器de位分配(地址0x88、可位寻址) TCON——定时器控制寄存器的位描述 TMOD——定时器模式寄存器的位分配(地址0X89、不可位寻址) TMOD——定时器模拟寄存器的位描述 TMOD——定时器模式寄存器M1/M0 工作模式 ps:模式0现在基本不用了,模式3可由模式2代替。应重点掌握模式1和模式2。 模式1示意图 应用定时器: 第一步:设置特殊功能寄存器 TMOD,配置好工作模式。 第二步:设置计数寄存器TH
[单片机]
#51单片机#定时器
MSP430f2619学习--PWM
思路: 利用定时器B的比较功能输出PWM波形; 一、定时器B 定时器B的特点: 1)异步16位定时/计数器; 2)4种工作模式; 3)4个可选长度 4)3或7个可配置的捕获/比较寄存器; 定时器的4种工作方式分别为,停止计数模式,增计数模式,连续计数模式和增减计数模式; 要输出PWM波形,需要配置定时器B的捕获/比较部件工作在比较模式,寄存器TBCCTLx的CAP位配置为0即可; TBCCTLx寄存器定义: 定时器的每一个捕获/比较部件都拥有一组输出单元,这个输出单元是用来产生输出信号的,例如PWM波等,输出信号的引脚通常在数据手册中都会表明 每个输出单元都有8种模式: 1)电平输出,由TBCCTLx寄存器
[单片机]
MSP430f2619学习--PWM
DS1302 寄存器介绍
DS1302 的一条指令一个字节共8位,其中第7位(即最高位)固定为1,这一位如果是0的话,那写进去也是无效的。第6位是选择 RAM 还是 CLOCK 的,我前边说过,我们这里主要讲 CLOCK 时钟的使用,它的 RAM 功能我们不用,所以如果选择 CLOCK 功能,第6位是0,如果要用 RAM,那第6位就是1。从第5到第1位,决定了寄存器的5位地址,而第0位是读写位,如果要写,这一位就是0,如果要读,这一位就是1。指令字节直观位分配如图15-9所示。 图15-9 DS1302 命令字节 DS1302 时钟的寄存器,其中8个和时钟有关的,5位地址分别是 0b00000~0b00111,还有一个寄存器的地址是 01000,这是涓
[单片机]
DS1302 <font color='red'>寄存器</font>介绍
lpc2103 rtc寄存器说明
实时时钟(RTC) 混合寄存器组 ILR:中断位置寄存器,为2位寄存器;第0位:RTCCIF,计数器增量中断模块产生中断,第1位:RTCALF 报警寄存器产生中断 CTC:时钟节拍计数器(只可读) CCR:时钟控制寄存器,为4位寄存器,控制时钟分频电路,0位:CLKEN 时钟使能 ;1位:CTCRST:CTC复位;3:2位:CTTEST测试使能 CIIR:计数器增量中断寄存器 7位,分别为,秒,分,小时,星期,月,年。。 AMR:报警屏蔽寄存器 完整时间寄存器(只读寄存器) CTIME0:完整时间寄存器0(包含时间:秒,分,小时和星期) CTIME1:完整时间寄存器1(日期(月),月,年) CTIME2:完
[单片机]
ARM--GPIO端口
s3c2440共有130个GPIO端口,分为9组,GPA ~ GPJ,通过寄存器控制。 控制s3c2440的GPIO端口的寄存器有3类,分别是GPxCON、GPxDAT、GPxUP (x=A ~ J): GPxCON:GPIO控制寄存器,可以设置选定GPIO口的输入输出方式和功能。GPA组的23个端口比较特殊,只能是输出方式。GPACON的每一位对应一个引脚,当某位为0时,对应引脚为输出端口,否则为复用功能。 GPB ~ GPJ端口的GPxCON寄存器使用方法一致,每两位控制一个引脚,00时为输入I/O口,01时为输出I/O口,10时为复用功能,11保留。 GPxDAT:此引脚用于读写引脚的状态,即端口数据。当引脚配置
[单片机]
STM32定时器的预装寄存器及影子寄存器PSC—ARR-CCRx
在谈预装寄存器及影子寄存器的差别前,不妨先对STM32定时器的时基单元做个基本了解。STM32各系列的定时器结构和框架基本是一样的,时基单元也一样。 下面时基单元是以STM32F3系列为参考。 时基单元中的TIMx_PSC、 TIM_ARR两个寄存器加上捕捉比较模块中TIMX_CCR寄存器,它们都可以动态修改。不过他们的修改和生效可能不在同一个时刻,这里便引入了预装寄存器及影子寄存器的概念。要记住一点,真正在TIMER模块中起作用的是影子寄存器。 1、用户程序对TIMx_PSC寄存器值的修改或读取都是操作其预装载寄存器,其修改值只能通过更新事件后才能生效,即从TIMx_PSC的预装寄存器拷贝到TIMx_PSC的影子寄存器
[单片机]
STM32定时器的预装<font color='red'>寄存器</font>及影子<font color='red'>寄存器</font>PSC—ARR-CCRx
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

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

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