




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
NIOSII里的uart操作第一步,在sopc里增加一个串口第二步:操作UART的三种方法(1)直接寄存器操作。NIOS II 的串口编程有多种方式,很多地方给的程序大多数更像纯C语言写法,占用程序空间比较大,这里以一个更像单片机串口的程序,占用空间当对而言要小,且对像工业控制的数据传输更实用简单些(个人觉得)。extern unsigned char leddata8;/UART发送一个字节子程序void Uart_send(unsigned char data) alt_u16 status; status=IORD_ALTERA_AVALON_UART_STATUS(UART_BASE); while(!(status&0x0040)/等待发送完成 status=IORD_ALTERA_AVALON_UART_STATUS(UART_BASE); IOWR_ALTERA_AVALON_UART_TXDATA(UART_BASE,data);/UART发送多个字节子程序void Uart_send_n(unsigned char *ptr,unsigned char n) for(;n0;n-) Uart_send(*ptr); ptr+; /UART接收子程序int Uart_receive(void) alt_u16 status; int temp; status=IORD_ALTERA_AVALON_UART_STATUS(UART_BASE); while(!(status&0x0080)/等待发送完成 status=IORD_ALTERA_AVALON_UART_STATUS(UART_BASE); temp=IORD_ALTERA_AVALON_UART_RXDATA(UART_BASE); return temp;/串口接收中断服务程序void Uart_ISR(void * context,alt_u32 id) unsigned char temp; temp=IORD_ALTERA_AVALON_UART_RXDATA(UART_BASE); leddata5=temp; /串口中断初始化void Uart_init() IOWR_ALTERA_AVALON_UART_CONTROL(UART_BASE, 0x80);/接收中断使能 IOWR_ALTERA_AVALON_UART_STATUS(UART_BASE, 0x0);/清状态标志 / IOWR_ALTERA_AVALON_UART_RXDATA(UART_BASE, 0x0);/清接收寄存器 alt_irq_register(UART_IRQ,0,Uart_ISR);/中断注册,此处编译总出现警告,还请高手能指点。warning: implicit declaration of function alt_irq_register test3 uart_zx.h程序中接收部分写了一个扫描的和一个中断的,可跟据需要选择。我想中断接收的更实用些吧。其中UART_BASE请更换为你自己UART的名字即可。(2)类似C语言的操作,用printf函数。(编译过程太慢!可以喝杯茶了!)使用这种方法要加上这一句 #include 别忘了在System library Properties 的stdout/stdin 选择你的串口。int main ()printf(Hello world.n);return 0;执行上述程序可以看到效果!(3)转载(没试过)下面介绍第三种串口编程的方法,我们还是从一个简单的例子看起吧:i nclude i nclude int main (void)char* msg = “hello world”;FILE* fp;fp = fopen (“/dev/jtag_uart”, “r+”);if (fp)fprintf(fp, “%s”,msg);fclose (fp);return 0;这种方法才是标准的串口操作方法。说实话,NiosII下的串口编程比Nios下的已经简化了很多。Nios下的串口操作要调用Altera自定义的函数,而NiosII下,由于有了HAL(详见NiosII step by step 2关于HAL的介绍)的存在,串口编程已经成为标准的文件操作了。我们知道,在Unix/Linux等操作系统里所有的流操作都可以看成是文件,NiosII吸收了这一点(可能是因为Nios吸收了Cygwin的很多特性吧,呵呵),把对串口的流操作也当成了一种文件操作。操作一个串口时,只需要对它相应的设备驱动读写数据就好了。fp = fopen (“/dev/jtag_uart”, “r+”);这个语句的意思就是打开jtag_uart的驱动,并且可以对其进行读写(r+),if (fp)fprintf(fp, “%s”,msg);fclose (fp);这段语句的意思就是如果文件打开没问题,指针句柄有效,就可以用fprintf语句向这个串口写数据了,这里要写的数据是一个字符串。写完之后关闭文件。你看,所有的操作几乎与C语言下的文件操作没什么区别,呵呵,唯一不同的就是待操作的文件是你要操作的外设,而不是一个“文件”。利用这种方法,你可以立刻举一反三,只要改动一点点,就可以操作所有的串口外设了。要改动的就是/dev/jtag_uart,把/dev/后面的外设名改改就是了。例如我要操作NiosII与PC之间的通信,只要改为/dev/pc_uart就行啦。再延伸一点,如果你的系统里面要添加四个使用串口流的设备,分别是JTAG UART、PC UART、GSM UART、GPS UART,那么对于每个外设,只要编写四个相应的文件操作程序就行了:fp = fopen (“/dev/jtag_uart”, “r+”);fp = fopen (“/dev/pc_uart”, “r+”);fp = fopen (“/dev/gps_uart”, “r+”);fp = fopen (“/dev/gsm_uart”, “r+”);当然,不要把所有外设的操作都写在一个程序里,应该分开写,最后分成不同的函数,再最后集成到一个main函数里。这是编程细节方面的问题了,不多说了。以上介绍的方法就是我们一般会采用的方法,具有很大的灵活性,可随时更改、添加外设程序,克服了第一种方法的局限性。说到这里,你应该知道其实第一种方法就是第二种方法的在NiosII IDE里面的隐含集成,其实图形用户界面背后也不过就是第二种方法的程序,只是stdin/stdout/stder都是由你指定罢了,呵呵。(估计Altera设计这三个选项就是为了方便懒人和初学者,呵呵)nios串口接收-中断方式(源码)#include#include#include#includesystem.h#includeunistd.h#include alt_types.h#include #include altera_avalon_uart_regs.h#include altera_avalon_pio_regs.h#include sys/alt_irq.h#define quelen 2048char queuequelen;int indexc = 0;int temp_index=0;char ch;static void init_uart_receiver();static void handle_uart_interrups(void* context, alt_u32 id);int main(void) init_uart_receiver(); printf(successful); int f=0; while (f1) if (temp_index!=indexc) printf(%c, queuetemp_index); temp_index+; return 0;static void init_uart_receiver() void* status_ptr; IOWR_ALTERA_AVALON_UART_CONTROL(UART_BASE, 0x80); IOWR_ALTERA_AVALON_UART_STATUS(UART_BASE, 0x0); IOWR_ALTERA_AVALON_UART_RXDATA(UART_BASE, 0x0); alt_irq_register(UART_IRQ,status_ptr,handle_uart_interrups);static void handle_uart_interrups(void* context, alt_u32 id) volatile char* status_ptr =(volatile char*)context; *status_ptr =IORD_ALTERA_AVALON_UART_ST
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025昆明市第二十一中学秋季学期招聘物理学科合同制教师(1人)考试参考试题及答案解析
- 2025年河北唐山招聘离校未就业高校毕业生临时公益岗人员17人备考考试题库附答案解析
- 2025年9月浙江宁波市余姚市公益性岗位招聘1人考试备考题库及答案解析
- 2025年潍坊市总工会招聘工会社会工作者(60人)考试参考试题及答案解析
- 2026中国水利水电第八工程局有限公司招聘(180人)备考考试题库附答案解析
- 2025浙江嘉兴平湖市市场监督管理局劳务派遣制工作人员招聘1人备考考试题库附答案解析
- 反垄断合规性分析-洞察及研究
- 网络资源能耗优化-洞察及研究
- 掌握时间享受生活
- 2025浙江嘉兴博思睿招聘3人(派遣至海宁钱塘(上塘)水务有限公司)备考考试题库附答案解析
- 国家基层高血压防治管理指南(2025版)
- 《生成式人工智能基础与应用》高职AIGC应用基础课程全套教学课件
- 2025合肥市辅警考试试卷真题
- 苏教版六年级上数学全册教学反思(全册)
- FZ/T 52003-2014丙纶短纤维
- 百善孝为先主题班会课件
- 招商银行智慧营销体系规划方案((2022年-2023年)-2022)
- 人教版小学数学六年级下册《斐波那契数列》课件
- 23届高三语文一轮复习(新教材新高考) 现代文阅读Ⅰ 专题一信息类文本阅读
- 创新小白实操指南 教案.docx
- 高中数学 1.2.3函数的表示法(一)教案 新人教A版必修1[1]
评论
0/150
提交评论