NIOS II下基于中断的UART接收和发送设计示例代码
#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接收和发送设计示例代码的更多相关文章
- 基于FPGA的Uart接收图像数据至VGA显示
系统框图 前面我们设计了基于FPGA的静态图片显示,接下来我们来做做基于FPGA的动态图片显示,本实验内容为:由PC端上位机软件通过串口发送一幅图像数据至FPGA,FPGA内部将图像数据存储,最后扫描 ...
- 基于NIOS II的双端口CAN通信回环测试
基于NIOS II的双端口CAN通信回环测试 小梅哥编写,未经授权,严禁用于任何商业用途 说明:本稿件为初稿,如果大家在使用的过程中有什么疑问或者补充,或者需要本文中所述工程源文件,欢迎以邮件形式发送 ...
- FPGA回忆记事(一):基于Nios II的LED实验
实验一:基于Nios II的LED实验 一. 创建Quartus II工程 1.打开Quartus II环境.开始->程序->Altera->Quartus II 9.1. 2 ...
- 【推荐图书】+ 基于Nios II的嵌入式SoPC系统设计与Verilog开发实例+C#入门经典等
[推荐图书]+ 基于Nios II的嵌入式SoPC系统设计与Verilog开发实例+C#入门经典等 3赞 发表于 2016/7/4 21:14:12 阅读(1921) 评论(3) 初次接触FPGA,到 ...
- 基于STM32之UART串口通信协议(三)接收
一.前言 1.简介 回顾上一篇UART发送当中,已经讲解了如何实现UART的发送操作了,接下来这一篇将会继续讲解如何实现UART的接收操作. 2.UART简介 嵌入式开发中,UART串口通信协议是我们 ...
- 基于ZYNQ 的UART中断实验之串口写数据到DDR3中
1.参考 UG585 网络笔记 2.理论知识 参见上一次实验:基于ZYNQ 的UART中断实验 3.实验目的 练习使用UART的中断实验,并将接收到的数据写入到DDR3中. 4.实验过程 建立工程,设 ...
- 多CPU下基于e1000e驱动的数据包以及网卡中断流程分析.doc
http://wenku.baidu.com/link?url=mMKDH_fKmUXN7L6rANIFHjoHdKCYBLlDrqoYB1daDTEkNFk9Bt9xlJtS_4BKBj6w22WD ...
- [置顶]
基于FPGA的VGA简易显存设计&NIOS ii软核接入
项目简介 本项目基于Altera公司的Cyclone IV型芯片,利用NIOS II软核,2-port RAM与时序控制模块,实现64*48分辨率的显存(再大的显存板载资源m9k不够用) 实现效果如下 ...
- 在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 ...
随机推荐
- Ubuntu13.10:密码忘记了怎么办?
重启ubuntu系统,开机时长按shift按键进入GRUB菜单,选择第二个高级模式. 新版的UBUNTU系统居然启用了GRUNB2.0的内核!虽然传说相当的牛X,但是用起来感觉就是非常看不清楚字体,要 ...
- cobalt strike 第一节连接到团队的服务器
介绍:Cobalt Strike 一款以metasploit为基础的GUI的框架式渗透工具,集成了端口转发.服务扫描,自动化溢出,多模式端口监听,win exe木马生成,win dll木马生成,jav ...
- 用Theano学习Deep Learning(三):卷积神经网络
写在前面的废话: 出了托福成绩啦,本人战战兢兢考了个97!成绩好的出乎意料!喜大普奔!撒花庆祝! 傻…………寒假还要怒学一个月刷100庆祝个毛线………… 正题: 题目是CNN,但是CNN的具体原理和之 ...
- 第八章 分布式配置中心:Spring Cloud Config
Spring Cloud Config 是 Spring Cloud 团队创建的一个全新项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持, 它分为服务端与客户端两个部分. 其中服 ...
- Installation failed with message Failed to finalize session : INSTALL_FAILED_INVALID_APK: Split lib_slice_8_apk was defined multiple times. It is possible that this issue is resolved by uninstalling a
取消:Instant Run就行
- DataMatrix二维条码源码分析检测识别图像位置
发布时间:2014-10-31 DataMatrix的代码结构和QR码基本相同: 其中Detector的功能还是从原始图像中找出符号码的部分,并且进行透视转换纠正扭曲. 其解码流程与QR码差不多,关键 ...
- C# StopWatch的BUG????
//BUG?????? //使用StopWatch测试运行时间 //两段测试A和B //测试结果受测试顺序影响,后测要比先测耗时长了许多 static void TestKeyIntStr() { v ...
- linux安装mysql服务分两种安装方法:
linux安装mysql服务分两种安装方法: ①源码安装,优点是安装包比较小,只有十多M,缺点是安装依赖的库多,安装编译时间长,安装步骤复杂容易出错: ②使用官方编译好的二进制文件安装,优点是安装速度 ...
- 201671010140. 2016-2017-2 《Java程序设计》java学习第九周
第七章:<异常,断言和日志>知识点小结 本周,进行了对Java中的异常处理的了解学习,以下是部分所得. 一.未检查异常与已检查异常的区别: 未检查异常处理方法:1.捕获2.继续 ...
- Linux实战教学笔记36:PHP服务缓存加速深度优化实践
一,PHP缓存加速器介绍与环境准备 1.1 PHP缓存加速器介绍 1.1.1 操作码介绍及缓存原理 当客户端请求一个PHP程序时,服务器的PHP引擎会解析该PHP程序,并将其编译为特定的操作码(Ope ...