受教黑金文档,再度优化兼容irq uart代码
主要修改了函数类型,兼容了普通和增强型中断
主要函数如下:
(1)uart_regs.h
(2)mcu_uart.h
(3)mcu_uart.c
(4)sys_main.c
//--------------------------------------------------------------------------
/*
* uart_regs.h
*
* Created on: 2011-4-4
* Author: CrazyBingo
*/
#ifndef UART_REGS_H_
#define UART_REGS_H_
#define _UART
//-----------------------------------------
typedef struct
{
//接收寄存器
union
{
struct
{
volatile unsigned long int RECEIVE_DATA :8;
volatile unsigned long int NC :24;
}BITS;
volatile unsigned long int WORD;
}RXDATA;
//収送寄存器
union
{
struct
{
volatile unsigned long int TRANSMIT_DATA :8;
volatile unsigned long int NC :24;
}BITS;
volatile unsigned long int WORD;
}TXDATA;
//状忞寄存器
union
{
struct
{
volatile unsigned long int PE :1;
volatile unsigned long int FE :1;
volatile unsigned long int BRK :1;
volatile unsigned long int ROE :1;
volatile unsigned long int TOE :1;
volatile unsigned long int TMT :1;
volatile unsigned long int TRDY :1;
volatile unsigned long int RRDY :1;
volatile unsigned long int E :1;
volatile unsigned long int NC :1;
volatile unsigned long int DCTS :1;
volatile unsigned long int CTS :1;
volatile unsigned long int EOP :1;
volatile unsigned long int NC1 :19;
}BITS;
volatile unsigned long int WORD;
}STATUS;
//控刢寄存器
union
{
struct
{
volatile unsigned long int IPE :1;
volatile unsigned long int IFE :1;
volatile unsigned long int IBRK :1;
volatile unsigned long int IROE :1;
volatile unsigned long int ITOE :1;
volatile unsigned long int ITMT :1;
volatile unsigned long int ITRDY :1;
volatile unsigned long int IRRDY :1;
volatile unsigned long int IE :1;
volatile unsigned long int TRBK :1;
volatile unsigned long int IDCTS :1;
volatile unsigned long int RTS :1;
volatile unsigned long int IEOP :1;
volatile unsigned long int NC :19;
}BITS;
volatile unsigned long int WORD;
}CONTROL;
//波特率分频器
union
{
struct
{
volatile unsigned long int BAUD_RATE_DIVISOR :16;
volatile unsigned long int NC :16;
}BITS;
volatile unsigned int WORD;
}DIVISOR;
}UART_STR;
#ifdef _UART
#define UART ((UART_STR *)UART_BASE)
#endif
#endif /* UART_REGS_H_ */
//--------------------------------------------------------------------------
/*
* uart.h
*
* Created on: 2011-4-4
* Author: CrazyBingo
*/
#ifndef MCU_UART_H_
#define MCU_UART_H_
#include "../inc/uart_regs.h"
#define BUFFER_SIZE 200
typedef struct{
unsigned char mode_flag; //xmodem 1;uart 0;
unsigned int receive_flag;
unsigned int receive_count;
unsigned char receive_buffer [BUFFER_SIZE];
alt_u8 (* send_byte) (unsigned char data);
void (* send_string) (unsigned int len, unsigned char *str);
alt_u8 (* init) (void);
alt_u8 (* baudrate) (unsigned int baudrate);
}UART_T;
extern UART_T uart;
#endif /*MCU_UART_H_*/
//--------------------------------------------------------------------------
/*
* uart.c
*
* Created on: 2011-4-4
* Author: CrazyBingo
*/
#include <system.h>
#include "alt_types.h"
#include "sys/alt_irq.h"
#include "../inc/uart_regs.h"
#include "../inc/mcu_uart.h"
static alt_u8 uart_send_byte(unsigned char data);
static void uart_send_string(unsigned int len, unsigned char *str);
static alt_u8 uart_init(void);
static alt_u8 uart_set_baudrate(unsigned int baudrate);
#ifdef ALT_ENHANCED_INTERRUPT_API_PRESENT
static void uart_ISR(void* context);
#else
static void uart_ISR(void* context, alt_u32 id);
#endif
//初始化 UART结构体
UART_T uart=
{
.mode_flag = 0,
.receive_flag = 0,
.receive_count = 0,
.send_byte = uart_send_byte,
.send_string = uart_send_string,
.init = uart_init,
.baudrate = uart_set_baudrate
};
//发送一个字节数据
//将发送的数据放到发送数据缓冲区内,等待状态寄存器 TRDY置 1,当 TRDY置 1,说明接收完毕
static alt_u8 uart_send_byte(unsigned char data)
{
UART->TXDATA.BITS.TRANSMIT_DATA = data;
while(!UART->STATUS.BITS.TRDY);
return 0;
}
//发送字符串
static void uart_send_string(unsigned int len, unsigned char *str)
{
while(len--)
{
uart_send_byte(*str++);
}
}
//设置波特率
static alt_u8 uart_set_baudrate(unsigned int baudrate)
{
//设置波特率:波特率 = 时钟频率/(divisor+1),转换以后就是下面了
UART->DIVISOR.WORD = (unsigned int)(ALT_CPU_FREQ/baudrate + 0.5);
return 0;
}
//初始化程序
static alt_u8 uart_init(void)
{
//默认为115200bps
uart_set_baudrate(115200);
//对控制寄寄存器的irrdy进行置1,表示当接收准备好后,中断使能
UART->CONTROL.BITS.IRRDY = 1;
//清除状态寄存器,这是处理整个寄存器的方法,大家注意
UART->STATUS.WORD = 0;
//注册uart中断,ISR为uart_ISR
#ifdef ALT_ENHANCED_INTERRUPT_API_PRESENT //nios2 91 edition or later
alt_ic_isr_register
(
UART_IRQ_INTERRUPT_CONTROLLER_ID, // 中断控制器标号,从system.h复制
UART_IRQ, // 硬件中断号,从system.h复制
uart_ISR, // 中断服务子函数
0, // 指向与设备驱动实例相关的数据结构体
0 // flags,保留未用
);
#else //before nios2 91 edition
alt_irq_register
(
UART_IRQ, // 硬件中断号,从system.h复制
0, // 指向与设备驱动实例相关的数据结构体
uart_ISR // 中断服务子函数
);
#endif
return 0;
}
//串口中断
#ifdef ALT_ENHANCED_INTERRUPT_API_PRESENT
static void uart_ISR(void* context)
#else
static void uart_ISR(void* context, alt_u32 id)
#endif
{
//等徃状态寄存器的接收数据状态位rrdy,当rrdy位为1时,说明新接收癿值传输到了接收数据寄存器
while(!(UART->STATUS.BITS.RRDY));
//reveive_buffer为我们通过栈的方式在内存中开设内存块,将接收数据寄存器中的数据放到这个内存块中
uart.receive_buffer[uart.receive_count++] = UART->RXDATA.BITS.RECEIVE_DATA;
//当接收数据的最后一位为\n(回车符)时,进入if语句,也就是说,\n作为了结束标志
//符,每次发送数据后,要加一个回车符作为结束符
if(uart.receive_buffer[uart.receive_count - 1]=='\n')
{
uart.receive_buffer[uart.receive_count] = '\0';
uart_send_string(uart.receive_count, uart.receive_buffer);
uart.receive_count = 0;
uart.receive_flag = 1;
}
}
//--------------------------------------------------------------------------
/*
* sys_main.c
*
* Created on: 2011-4-1
* Author: CrazyBingo
* irq, timer, DMA, uart
*/
#include <stdio.h>
#include "unistd.h"
#include "system.h"
#include "alt_types.h"
#include "sys/alt_irq.h"
#include "io.h"
#include "altera_avalon_pio_regs.h"
#include "../inc/my_sopc.h"
#include "../inc/key_scan.h"
#include "../inc/mcu_uart.h"
int main(void)
{
//------------------------------------------------------------
//uart test
unsigned char buffer[50] = "I will successfully one day!\n";
uart.init();
while(1)
{
uart.send_string(sizeof(buffer), buffer);
usleep(1000000);
}
return 0;
}
OK Go on, 谢谢
受教黑金文档,再度优化兼容irq uart代码相关推荐
- 回味那些评论有时候也能受教--摘自双鱼座ROM之硬件评论
# re: ORM之硬伤 2007-01-07 12:38 fds2003 精辟!!受教!! 回复 更多评论 #re: ORM之硬伤 2007-01-07 12:57 kiler 说的太好了. 很 ...
- 教你如何定位及优化SQL语句的性能问题
转载自 教你如何定位及优化SQL语句的性能问题 在现如今的软件开发中,关系型数据库是做数据存储最重要的工具.无论是Oracale还是Mysql,都是需要通过SQL语句来和数据库进行交互的,这种交互 ...
- 如今黑帽查找引擎优化的难点
操作查找引擎优化到如今现已有快4年时刻了,有白帽过,可是根本都是走在黑帽查找引擎优化的边际.曾经有一个相对菜鸟来说暴利的职业,如今现已做不了,即是banzheng类.如今查找出来的全部是大门户的内页, ...
- 百度网盘AI大赛-图像处理挑战赛:文档检测优化赛 Baseline
转自AI Studio,原文链接:百度网盘AI大赛-图像处理挑战赛:文档检测优化赛 Baseline - 飞桨AI Studio 百度网盘AI大赛-图像处理挑战赛:文档检测优化赛 使用Resnet15 ...
- 如何批量对 PDF 文档进行优化与高效的压缩?
概要:「我的ABC软件工具箱」提供了强大的批量 PDF 优化与压缩的功能,能够对已有的 PDF 文档进行优化与压缩,可以在一定程度上减少 PDF 文档占用空间的大小.整个操作过程非常简单,处理高效! ...
- seo提交工具_SEO:教您新网站的优化方法有哪些?
今天小龙教您新网站的优化方法有哪些?新站上线之初如果有备案,新站2个月的扶持期内,只做一个事情:提交大量优质原创内容,且内容为不间断提交.个人认为这个点是做新站优化的核心点,其余的seo优化技巧可概括 ...
- linux打开微软RMS文档,RMS服务证书到期导致打开XPS文档出现“无法打开此受保护的文档”...
最近用xps viewer打开本机电脑的一份xps文档资料时,出现一个"无法打开此受保护的文档",无法绑定请求的用户.该文档是经过授权的文档. 后来查看内部服务器发现RMS提示服务 ...
- PyTorch 2.0来了!100%向后兼容,一行代码训练提速76%
编辑 | 机器之心 点击下方卡片,关注"自动驾驶之心"公众号 ADAS巨卷干货,即可获取 点击进入→自动驾驶之心[全栈算法]技术交流群 PyTorch 官方:我们这次的新特性太好用 ...
- Linkedin 工程师如何优化他们的 Java 代码
最近在刷各大公司的技术博客的时候,我在Linkedin的技术博客上面发现了一篇很不错博文.这篇博文介绍了Linkedin信息流中间层Feed Mixer,它为Linkedin的Web主页,大学主页,公 ...
最新文章
- 王瑜琪:数据科学助力我捕捉研究生教育的宏观效应 | 提升之路系列
- 华为正式发布鸿蒙智慧屏,华为正式发布鸿蒙OS操作系统 智慧屏将率先使用
- 阿里张磊:云计算生态价值点正迅速聚焦到“应用”上
- ConcurrentHashMap源码剖析(1.8版本)
- Antlr中文文档初稿2(《ANTLR树分析器》)
- mysql 存储过程 out list_MySQL存储过程中的IN,OUT,INOUT类型 用法
- PE使用万能驱动7解决USB3、NVME驱动问题及台式机、笔记本电脑使用PE因驱动问题不能加载硬盘问题(YOGA 14C 因PE加载不了硬盘亲测可用)
- MATLAB拟合算法
- BT500-BT1788主观质量评价
- 麻将胡牌算法(C++版)
- 云脉文档管理小程序轻松解决文档管理难题
- 微信小程序数据统计和错误统计的实现
- 【总结】最好的CV学习小组,超200个课时+10个方向+30个项目,从理论到实践全部系统掌握...
- 当 Spring Cloud 遇上 SOFAStack | Meetup#2 回顾
- js中call 的使用, call方法的继承
- 【OpenCV 4】图像卷积操作(Blur)
- 九州集团“刷脸支付红利风口”交流会议将9月9日举行
- 勤哲excel服务器开发实施管理系统的一点小结
- C#使用MongoDB
- 为等待特朗普政府审核,DHS未按时提交网络安全战略