UART interrupt setting(用中断接收UART数据的设置方式).docVIP

UART interrupt setting(用中断接收UART数据的设置方式).doc

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
UART interrupt setting(用中断接收UART数据的设置方式).doc

UART Interrupt setting We only discuss UART0 这个文件告诉你如何用UART 0的中断模式接受数据。为什么要写这个文档?因为我们目前的系统没有这个功能。我花了一些时间做了一些试验后找到这个方法,因为对于要开发ipod case的工程师会有用。 首先讲一下8202的中断系统,8202有相当多的中断,其中最常见的是定时器。虽然有很多中断,然而我们的RD甚少使用中断来处理事情,他们喜欢用查询。原因可能是为了减少不知名的问题的发生。据我所知,目前用到的中断只有: 一个与场同步有关的中断,就是用来控制每一帧画面显示的timming的一个中断; timer,servo用到的 如果是receiver,会用到一个100us的timer,用于RDS 如果在Debug mode,会用到UART0的中断;不过有点奇怪的是,我们的设计是用中断来发送数据,而不是接收数据。发送数据的部分在kernel里面,我们是改不到的,不过接下来我会解析如何用别的方法绕开。 接下来我要讲如何用UART0的中断来接收数据。首先我们必须要把debug关掉,也就是如果开了debug,就不能用这个功能。其实理论上应该可以,不过我调了很久,没有找到办法,因为这涉及到原先的架构的理解,这个我后面再讲吧。现在比较简单的方法就是把debuger关掉。这种方法比较单纯,因为这时候UART是关闭的,我们可以重新增加我们想用的功能。 Reset.c的修改 在这里要开中断和设定UART0的波特率 UART0_set_baudrate BAUDCC BAUDRATE_DEFAULT, 1座机电话号码 ; psprintf linebuf, UART0_puts linebuf ; 注意,函数BAUDCC BAUDRATE_DEFAULT, 1座机电话号码 中第一个参数代表UART的通信速率,目前系统默认为115200bps,后面的参数代表系统的时钟频率,需要根据系统的频率不同进行修改。 对了,我在调试的时候使用波特率是115200,据我所知,iPod好像没有那么高,可能是19200或56000,你可以像上面一样修改; reset_all_enable_intr_only_uart ; write_stamp STAMP_ENABLE_INTR_0 ; regs0- uart0_isc | 1 1 ; //rx fifo not empty interrupt regs0- uart0_isc | 1 5 ; //RX interrupt enable 这几行用来打开UART的中断,尤其是UART Rx的中断; polling.c的修改 为什么要改polling.c?其实你可以在任何地方改,其实我比较prefer建一个想interrupt_uart.c之类的文件,会更好一点。我在这里只讲述如何实现功能,系统维护的部分不涉及。 你需要增加这个函数 void intr_uart0_fifo_2 void int d; d EPP_GETC ; //读取UART的数据 UART0_putc d ; //把读到的数据发回去 其实这是一个最简单的应用,但是你如果要开发iPod docking,你可能要在这里加一些buffer的实现语句。但你要紧记这是中断,要尽可能的短,不能做太多事情。 你会问,虽然我在reset.c 打开了中断,可是为何当中断触发时系统就知道执行这个函数呢?为何不是别的函数呢?是的,如果你不修改intdrv.s,系统永远都不会执行这个函数的,下面我们来修改intdrv.s,这是一个汇编程序。 Intdrv.s 修改很简单,如下: //#define INTR_UART0_VECTOR intr_uart0_fifo //原先的程序会呼叫intr_uart0_fifo #define INTR_UART0_VECTOR intr_uart0_fifo_2//我把它指向我的中断入口程序 修改到此完毕,你可以编译,运行,接上电脑串口调试。我用的软件是Qmodem,还有一个叫“串口调试工具”也不错。 为了验证真的有用,我接上示波器检查,下图是示波器的波形(6个’h’的输入和输出) 从图中看出上面一个波形由电脑发出,下面一个是8202发出,8202的波形比电脑的波形稍为晚了一个字节多一点的时间,因为他要先收到后存到内存里,然后再从内存里读出来发送。另外更重要的是,进入和退出中断程序需要保护和恢复现场,有大概32个寄存器需要保护,所以费一些时间。这可能也是为何RD不喜欢用中断的原因:-〉 深入讨论: 中断子程序的现场保护动作,这些工作在intdrv.s里已经完成。这要从intdrv.s的流程说起,中断的流程是从exc

文档评论(0)

lnainai_sj + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档