Board logo

标题: UART中断的例子?求 [打印本页]

作者: duandunqin    时间: 2007-7-16 22:07     标题: UART中断的例子?求

谁有UART与PC机通信的例子,(中断方式)

本人新手想看下,参考参考?

有的发下,谢谢了


作者: kzw    时间: 2007-7-17 10:01

在我们论坛上找。


作者: jinqc    时间: 2007-7-17 13:49

#include "alt_types.h"
#include <string.h>
#include <unistd.h>
#include "system.h"
#include "altera_avalon_uart_regs.h"
#include "altera_avalon_pio_regs.h"
#include "sys/alt_irq.h"


#ifdef UART_BASE
void uart_handle(void *context,alt_u32 interrupt)
{
  unsigned short int data,status;
  status = IORD_ALTERA_AVALON_UART_STATUS(UART_BASE);
  while (!(status & ALTERA_AVALON_UART_STATUS_RRDY_MSK))
    status = IORD_ALTERA_AVALON_UART_STATUS(UART_BASE);
  data =IORD_ALTERA_AVALON_UART_RXDATA(UART_BASE);
  //write status reg;
  status = ALTERA_AVALON_UART_STATUS_TRDY_MSK;
  IOWR_ALTERA_AVALON_UART_STATUS(UART_BASE, status);
  IOWR_ALTERA_AVALON_UART_TXDATA(UART_BASE, data);
  IOWR_ALTERA_AVALON_UART_STATUS(UART_BASE, 0);
}

void uart_init()
{
  alt_u32 control;
  int divisor;
 
  control = ALTERA_AVALON_UART_CONTROL_TRDY_MSK |
  ALTERA_AVALON_UART_CONTROL_RRDY_MSK |
  ALTERA_AVALON_UART_CONTROL_E_MSK;
  IOWR_ALTERA_AVALON_UART_CONTROL(UART_BASE, control);
 
  divisor = (int)(50000000/9600+0.5);
  IOWR_ALTERA_AVALON_UART_DIVISOR(UART_BASE, divisor);

  if (alt_irq_register(UART_IRQ, NULL, uart_handle))
   {
     IOWR_ALTERA_AVALON_PIO_DATA(PIO_OUT_BASE, 0x0);
   }
}
#endif

int main(void)
{
  /* declare var used by uart;*/
  IOWR_ALTERA_AVALON_PIO_DATA(PIO_OUT_BASE, 0x4079);
 
  uart_init();
  while(1);
  return 0; 
}   


作者: jinqc    时间: 2007-7-17 13:50

#include "alt_types.h"
#include <string.h>
#include <unistd.h>
#include "system.h"
#include "altera_avalon_uart_regs.h"
#include "altera_avalon_pio_regs.h"
#include "sys/alt_irq.h"


#ifdef UART_BASE
void uart_handle(void *context,alt_u32 interrupt)
{
  unsigned short int data,status;
  status = IORD_ALTERA_AVALON_UART_STATUS(UART_BASE);
  while (!(status & ALTERA_AVALON_UART_STATUS_RRDY_MSK))
    status = IORD_ALTERA_AVALON_UART_STATUS(UART_BASE);
  data =IORD_ALTERA_AVALON_UART_RXDATA(UART_BASE);
  //write status reg;
  status = ALTERA_AVALON_UART_STATUS_TRDY_MSK;
  IOWR_ALTERA_AVALON_UART_STATUS(UART_BASE, status);
  IOWR_ALTERA_AVALON_UART_TXDATA(UART_BASE, data);
  IOWR_ALTERA_AVALON_UART_STATUS(UART_BASE, 0);
}

void uart_init()
{
  alt_u32 control;
  int divisor;
 
  control = ALTERA_AVALON_UART_CONTROL_TRDY_MSK |
  ALTERA_AVALON_UART_CONTROL_RRDY_MSK |
  ALTERA_AVALON_UART_CONTROL_E_MSK;
  IOWR_ALTERA_AVALON_UART_CONTROL(UART_BASE, control);
 
  divisor = (int)(50000000/9600+0.5);
  IOWR_ALTERA_AVALON_UART_DIVISOR(UART_BASE, divisor);

  if (alt_irq_register(UART_IRQ, NULL, uart_handle))
   {
     IOWR_ALTERA_AVALON_PIO_DATA(PIO_OUT_BASE, 0x0);
   }
}
#endif

int main(void)
{
  /* declare var used by uart;*/
  IOWR_ALTERA_AVALON_PIO_DATA(PIO_OUT_BASE, 0x4079);
 
  uart_init();
  while(1);
  return 0; 
}   


作者: melissa    时间: 2008-2-1 12:10

我试一下
作者: caopengly    时间: 2008-2-5 09:18

这里只给出一个中断处理程序框架。在UART 通讯应用中,关键要处理好中
断处理程序和后台主程序(或其他任务)之间的信息交互体系。
void uart_irq(void *context,alt_u32 interrupt)
{
int iRet;
unsigned short int data,status;
/* 读取状态寄存值 */
status = IORD_ALTERA_AVALON_UART_STATUS(UART_0_BASE);
/* 错误处理 */
……
/* 读取数据入缓冲区 */
data =IORD_ALTERA_AVALON_UART_RXDATA(UART_0_BASE);
……
/* 清除状态寄存器相关位 */
IOWR_ALTERA_AVALON_UART_STATUS(UART_0_BASE, 0)
}


作者: xmar    时间: 2010-2-5 17:32

关于Nios2 Uart 中断程序的问题: 注意将Nios CPU 的中断向量(Exception Vector)放到FPGA片内RAM或片外RAM内。一定不能放到EPCS_FLASH配置flash芯片内! 另外,如果你用alt_main()程序入口而不是 main(). 那一定要用: alt_irq_enable_all(UART_0_IRQ); 函数打开中断。用 main()程序入口就不必。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0