#include "sys/alt_stdio.h"
#include "altera_avalon_uart_regs.h"
#include "system.h"
#include "altera_avalon_pio_regs.h"
#include "alt_types.h"
#include "sys/alt_irq.h" alt_u8 uart_en = ;
alt_u8 i=;
alt_u8 rx_data[],tx_data[];
alt_u8 tx_len,rx_len; alt_isr_func key_isr(void)
{
alt_u8 data;
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_LED_BASE, 0x00); //关闭按键中断
data = IORD_ALTERA_AVALON_PIO_EDGE_CAP(PIO_LED_BASE);
if(data == 0x30)
{ }
else if(data & 0x10)
{
uart_en = ;
}
else if(data & 0x20)
{ }
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_LED_BASE, 0x30); //清零所有的捕获位
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_LED_BASE, 0x30); //关闭按键中断
return ;
} void key_init()
{
char *p;
alt_ic_isr_register(PIO_LED_IRQ_INTERRUPT_CONTROLLER_ID,
PIO_LED_IRQ,
key_isr,
p,
); IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_LED_BASE, 0x0f); //设置低4位为输出,高2位为输入
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_LED_BASE, 0x30); //清零所有的捕获位
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_LED_BASE, 0x30); //打开按键中断
} alt_isr_func uart_0_isr(void)
{
alt_u16 status; status = IORD_ALTERA_AVALON_UART_STATUS(UART_0_BASE);
if(status & ALTERA_AVALON_UART_STATUS_RRDY_MSK)
{
rx_data[rx_len] = IORD_ALTERA_AVALON_UART_RXDATA(UART_0_BASE);
rx_len ++ ;
} if(status & ALTERA_AVALON_UART_STATUS_TRDY_MSK)
{
if(tx_len)
{
IOWR_ALTERA_AVALON_UART_TXDATA(UART_0_BASE, tx_data[tx_len]);
tx_len--;
if(!tx_len)
{
IOWR_ALTERA_AVALON_UART_CONTROL(UART_0_BASE,0x80); //关闭发送中断 }
}
}
return ;
} void uart_0_init()
{
char *p;
alt_ic_isr_register(UART_0_IRQ_INTERRUPT_CONTROLLER_ID,
UART_0_IRQ,
uart_0_isr,
p,
); IOWR_ALTERA_AVALON_UART_STATUS(UART_0_BASE, 0x0); //清零状态寄存器
IORD_ALTERA_AVALON_UART_RXDATA(UART_0_BASE); //读空接收寄存器中的无用值
IOWR_ALTERA_AVALON_UART_DIVISOR(UART_0_BASE, UART_0_FREQ/ - );//设置波特率为115200
IOWR_ALTERA_AVALON_UART_CONTROL(UART_0_BASE, 0x80); //使能接收中断
} void uart_tx(alt_u8 *data, alt_u8 len)
{
tx_len = len;
while(len)
{
tx_data[len] = *data;
data++;
len -- ;
}
IOWR_ALTERA_AVALON_UART_CONTROL(UART_0_BASE, 0x80 | 0x40); //使能发送中断
} int main()
{
key_init();
uart_0_init(); while()
{
if(uart_en)
{
uart_tx(rx_data, rx_len);
rx_len = ;
uart_en = ;
}
} return ;
}

注意,使用自定义的驱动来完成对UART IP的操作,请将软件自带的UART驱动关闭,如下图:

NIOS II下基于中断的UART接收和发送设计示例代码的更多相关文章

  1. 基于FPGA的Uart接收图像数据至VGA显示

    系统框图 前面我们设计了基于FPGA的静态图片显示,接下来我们来做做基于FPGA的动态图片显示,本实验内容为:由PC端上位机软件通过串口发送一幅图像数据至FPGA,FPGA内部将图像数据存储,最后扫描 ...

  2. 基于NIOS II的双端口CAN通信回环测试

    基于NIOS II的双端口CAN通信回环测试 小梅哥编写,未经授权,严禁用于任何商业用途 说明:本稿件为初稿,如果大家在使用的过程中有什么疑问或者补充,或者需要本文中所述工程源文件,欢迎以邮件形式发送 ...

  3. FPGA回忆记事(一):基于Nios II的LED实验

    实验一:基于Nios II的LED实验 一.    创建Quartus II工程 1.打开Quartus II环境.开始->程序->Altera->Quartus II 9.1. 2 ...

  4. 【推荐图书】+ 基于Nios II的嵌入式SoPC系统设计与Verilog开发实例+C#入门经典等

    [推荐图书]+ 基于Nios II的嵌入式SoPC系统设计与Verilog开发实例+C#入门经典等 3赞 发表于 2016/7/4 21:14:12 阅读(1921) 评论(3) 初次接触FPGA,到 ...

  5. 基于STM32之UART串口通信协议(三)接收

    一.前言 1.简介 回顾上一篇UART发送当中,已经讲解了如何实现UART的发送操作了,接下来这一篇将会继续讲解如何实现UART的接收操作. 2.UART简介 嵌入式开发中,UART串口通信协议是我们 ...

  6. 基于ZYNQ 的UART中断实验之串口写数据到DDR3中

    1.参考 UG585 网络笔记 2.理论知识 参见上一次实验:基于ZYNQ 的UART中断实验 3.实验目的 练习使用UART的中断实验,并将接收到的数据写入到DDR3中. 4.实验过程 建立工程,设 ...

  7. 多CPU下基于e1000e驱动的数据包以及网卡中断流程分析.doc

    http://wenku.baidu.com/link?url=mMKDH_fKmUXN7L6rANIFHjoHdKCYBLlDrqoYB1daDTEkNFk9Bt9xlJtS_4BKBj6w22WD ...

  8. [置顶] 基于FPGA的VGA简易显存设计&NIOS ii软核接入

    项目简介 本项目基于Altera公司的Cyclone IV型芯片,利用NIOS II软核,2-port RAM与时序控制模块,实现64*48分辨率的显存(再大的显存板载资源m9k不够用) 实现效果如下 ...

  9. 在WIN7系统下用Quartus ii 11.1 NIOS II 11.1 有时候会出现Nios II 的Run as hardware 中报错:Downloading ELF Process failed

    nios工程在编译通过后RUN的过程中出现Error Running Nios II Project: ‘Downloading ELF Process failed’问题原因: 1.nios2 cp ...

随机推荐

  1. Nginx加状态监控

    安装Nginx时加上        –with-http_stub_status_module 在nginx.conf server location /nginx_status { stub_sta ...

  2. http请求头设置

    Curl curl -i -H 'Content-Type: application/json' -i/--include     输出时包括protocol头信息curl -x 10.12.15.1 ...

  3. PEM文件和private.key文件生成IIS服务器所需的pfx文件(配置SSL用)

    第一步:输入域名,点击"创建免费的SSL证书"按钮,如图 第二步:输入邮箱,点击创建,如图 创建成功后,需要进行dns验证,结果图如下: 第三步:在域名所在的云服务器上,添加域名解 ...

  4. 机器学习,数据挖掘,统计学,云计算,众包(crowdsourcing),人工智能,降维(Dimension reduction)

    机器学习 Machine Learning:提供数据分析的能力,机器学习是大数据时代必不可少的核心技术,道理很简单:收集.存储.传输.管理大数据的目的,是为了“利用”大数据,而如果没有机器学习技术分析 ...

  5. data-ajax="false"

    转自:https://yq.aliyun.com/ziliao/265393 最近在做一个项目,由于涉及到跨平台性,所以采用了jquerymobile这个框架,在开发过程中,一开始为了图测试方便,采用 ...

  6. Django admin 使用多个数据库

    admin是django自带的一个app,那它涉及的是对Model的所有对象进行增删改查,如果model来自多个数据库如何处理呢? 重写admin.ModelAdmin的如下几个方法就好了: clas ...

  7. awk中printf的使用说明

    printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息.在编写程序时经常会用到此函数.printf()函数的调用格式为: printf("", ); 其中 ...

  8. 在springBoot在控制台打印sql语句

    在springBoot+Mybatis日志显示SQL的执行情况的最简单方法就是在properties新增: logging.level.com.dy.springboot.server.mapper= ...

  9. [JS] 让人犯晕的JavaScript变量赋值

    变量赋值 本文转载自http://hellobug.github.io/blog/javascript-variable-assignment/ 开始之前先来几个例子,确保起始点是晕的状态- :P 例 ...

  10. Logging模块总结 2018/5/30

    日志的级别 Level 用处 数字级别 DEBUG 详细的信息,在调试过程中用于诊断错误 10 INFO 用于确认事件正在运行 20 WARNING 意外发生时予以提醒,或者预测一些未来可能发生的一些 ...