三、普通方式串口通信验证测试
普通方式串口通信实现较为简单,只要通过对具体UART口进行相应的配置即可实现串口收发数据,通过参考pic32_examples例程,串口配置的代码及说明如下:
以上代码是对U5和U6芯片(MAX3491)的REN\和DE两个引脚定义和配置输出,使能UART口收发;
配置中断服务程序:
UART发送通过定义发送函数完成,如下图:
实际中对该函数的调用如下:
接收在中断服务程序中完成,而发送数据我们基本上不关心中断;
以上为UART串口通信的普通中断实现方式,可参考以下网络上的资料:
http://blog.163.com/yucheng_xiao/blog/static/76600192201382415451367/
http://www.dzsc.com/data/html/2011-9-4/97820.html
http://www.microchip.com/forums/m794814.aspx
http://www.doc88.com/tag/PIC32%E5%AD%A6%E4%B9%A0%E8%B5%84%E6%96%99--%E4%B8%AD%E6%96%AD
四、DMA方式实现UART串口数据的传输
以UART1为例,对DMA方式实现UART串口数据的传输进行研究。首先得充分了解DMA的概念,DMA控制器是总线主模块,用于无需CPU干预的情况下在不同外设之间传输数据。DMA传输的源和目标可以是PIC32MX中包含的任何存储器映射的模块如存储器本身、外设总线设备SPI、UART和IIC等。如下图所示,可以初步了解DMA的概念,若需深入了解请通过百度谷歌等其他途径展开学习。
本次在PIC32单片机中DMA方式实现UART串口数据的传输,以UART1通信为例,具体配置、注意事项以及调试遇到的问题具体如下:(此外本人在项目开发中为了主控板上的FPGA对外围三块板卡进行相关数据采集,在FPGA中搭建了DMA控制器,后续将其一一给大家介绍)
本项目包括串口的收发,因此需采用两个DMA通道进行数据传输,以上是两DMA通道的初始化,需要说明的是初始化工作完成后,UART1的TX和RX中断均被DMA中断所取代,DMA中断服务程序如下:
以上是DMA发送中断,当数据DMA通过UART1发送完成后进入中断,将中断事件标志位以及中断标志清除;
以上是DMA接收中断服务程序代码,本实验通过串口助手向单片机发送一组数据,PIC单片机接收到后,对接收数据进行简单验证,验证通过后再通过DMA向UART1口回发该组数据,从该中断服务可以看出:DMA第一通道初始化配置好后,只需通过以下两条指令便可将数据DMA方式串口发送
DmaChnSetTxfer(DMA_CHANNEL1, GETDATA, (void*)&U1TXREG, 12, 1, 1);
DmaChnStartTxfer(DMA_CHANNEL1, DMA_WAIT_NOT, 0);
DelayMS(20);
调试过程中发现,DelayMS(20)语句需要保证数据在所定义的波特率下有足够的时间将其发送出去,否则会出现数据发送不全的现象。
对于DMA接收,初始化配置中DmaChnEnable(DMA_CHANNEL2);必不可少,否则该通道没有使能不接收数据,而DMA发送则不需要该语句,此外,经过充分调试验证,请看下条语句:
DmaChnSetTxfer(DMA_CHANNEL2, (void*)&U1RXREG, GETDATA, 1, 12, 1);
当串口数据全部接收完后进入DMA接收中断服务程序,GETDATA数据已完全得到U1RXREG中的数据,对GETDATA数据进行相关处理后,清DMA接收中断事件标志位和中断标志位后,若要继续接收数据还需增加以下两条语句:
DmaChnSetTxfer(DMA_CHANNEL2, (void*)&U1RXREG, GETDATA, 1, 12, 1);
DmaChnEnable(DMA_CHANNEL2);
从而开启下一次接收数据的等待,否则DMA接收只能完成当前的一次传输。
具体PIC32单片机DMA方式传输可参考以下资料:
http://www.doc88.com/p-9072783694931.html
http://www.imgtec.eetrend.com/blog/2507
http://www.docin.com/p-1057535176.html
http://www.docin.com/p-102432127.html
https://www.microchip.com/forums/m/tm.aspx?m=798444
http://www.microchip.com/forums/m814398.aspx
文章评论(0条评论)
登录后参与讨论