主要修改了函数类型,兼容了普通和增强型中断

主要函数如下:

(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代码相关推荐

  1. 回味那些评论有时候也能受教--摘自双鱼座ROM之硬件评论

    # re: ORM之硬伤 2007-01-07 12:38 fds2003 精辟!!受教!!  回复  更多评论 #re: ORM之硬伤 2007-01-07 12:57 kiler 说的太好了. 很 ...

  2. 教你如何定位及优化SQL语句的性能问题

    转载自   教你如何定位及优化SQL语句的性能问题 在现如今的软件开发中,关系型数据库是做数据存储最重要的工具.无论是Oracale还是Mysql,都是需要通过SQL语句来和数据库进行交互的,这种交互 ...

  3. 如今黑帽查找引擎优化的难点

    操作查找引擎优化到如今现已有快4年时刻了,有白帽过,可是根本都是走在黑帽查找引擎优化的边际.曾经有一个相对菜鸟来说暴利的职业,如今现已做不了,即是banzheng类.如今查找出来的全部是大门户的内页, ...

  4. 百度网盘AI大赛-图像处理挑战赛:文档检测优化赛 Baseline

    转自AI Studio,原文链接:百度网盘AI大赛-图像处理挑战赛:文档检测优化赛 Baseline - 飞桨AI Studio 百度网盘AI大赛-图像处理挑战赛:文档检测优化赛 使用Resnet15 ...

  5. 如何批量对 PDF 文档进行优化与高效的压缩?

    概要:「我的ABC软件工具箱」提供了强大的批量 PDF 优化与压缩的功能,能够对已有的 PDF 文档进行优化与压缩,可以在一定程度上减少 PDF 文档占用空间的大小.整个操作过程非常简单,处理高效! ...

  6. seo提交工具_SEO:教您新网站的优化方法有哪些?

    今天小龙教您新网站的优化方法有哪些?新站上线之初如果有备案,新站2个月的扶持期内,只做一个事情:提交大量优质原创内容,且内容为不间断提交.个人认为这个点是做新站优化的核心点,其余的seo优化技巧可概括 ...

  7. linux打开微软RMS文档,RMS服务证书到期导致打开XPS文档出现“无法打开此受保护的文档”...

    最近用xps viewer打开本机电脑的一份xps文档资料时,出现一个"无法打开此受保护的文档",无法绑定请求的用户.该文档是经过授权的文档. 后来查看内部服务器发现RMS提示服务 ...

  8. PyTorch 2.0来了!100%向后兼容,一行代码训练提速76%

    编辑 | 机器之心 点击下方卡片,关注"自动驾驶之心"公众号 ADAS巨卷干货,即可获取 点击进入→自动驾驶之心[全栈算法]技术交流群 PyTorch 官方:我们这次的新特性太好用 ...

  9. Linkedin 工程师如何优化他们的 Java 代码

    最近在刷各大公司的技术博客的时候,我在Linkedin的技术博客上面发现了一篇很不错博文.这篇博文介绍了Linkedin信息流中间层Feed Mixer,它为Linkedin的Web主页,大学主页,公 ...

最新文章

  1. 王瑜琪:数据科学助力我捕捉研究生教育的宏观效应 | 提升之路系列
  2. 华为正式发布鸿蒙智慧屏,华为正式发布鸿蒙OS操作系统 智慧屏将率先使用
  3. 阿里张磊:云计算生态价值点正迅速聚焦到“应用”上
  4. ConcurrentHashMap源码剖析(1.8版本)
  5. Antlr中文文档初稿2(《ANTLR树分析器》)
  6. mysql 存储过程 out list_MySQL存储过程中的IN,OUT,INOUT类型 用法
  7. PE使用万能驱动7解决USB3、NVME驱动问题及台式机、笔记本电脑使用PE因驱动问题不能加载硬盘问题(YOGA 14C 因PE加载不了硬盘亲测可用)
  8. MATLAB拟合算法
  9. BT500-BT1788主观质量评价
  10. 麻将胡牌算法(C++版)
  11. 云脉文档管理小程序轻松解决文档管理难题
  12. 微信小程序数据统计和错误统计的实现
  13. 【总结】最好的CV学习小组,超200个课时+10个方向+30个项目,从理论到实践全部系统掌握...
  14. 当 Spring Cloud 遇上 SOFAStack | Meetup#2 回顾
  15. js中call 的使用, call方法的继承
  16. 【OpenCV 4】图像卷积操作(Blur)
  17. 九州集团“刷脸支付红利风口”交流会议将9月9日举行
  18. 勤哲excel服务器开发实施管理系统的一点小结
  19. C#使用MongoDB
  20. 为等待特朗普政府审核,DHS未按时提交网络安全战略

热门文章

  1. Asp.net禁用site.Mobile.Master
  2. 01_常用 Linux 命令的基本使用
  3. redis配置文件讲解
  4. Java高并发系列 — AQS
  5. 第一次scrum冲刺
  6. 给服务器端下拉asp:DropDownList 绑定改变事件,Ajax绑定下拉
  7. leetcode-Excel Sheet Column Title
  8. java 获取键盘事件,java获取键盘事件
  9. JavaScript的数组常用方法
  10. vue项目中使用swiper