该文章为Nios II学习中的外设C函数收集整理笔记,长期更新。


提示:以下是本篇文章正文内容,下面案例可供参考

一、PIO读写

1.1 对PIO进行写操作

(1)利用给定的宏定义函数,函数原型如下:

IOWR_ALTERA_AVALON_PIO_DATA(base, data);    //base是要访问的IO口的基地址,data是所要写入的数据

(2)直接调用内部函数,函数原型如下:

IOWR(BASE, REGNUM, DATA);    //BASE为寄存器的基地址,REGNUM为寄存器的偏移量,DATA为要写入的数据。对于PIO来说,REGNUM为0

1.2 对PIO进行读操作

(1)利用给定的宏定义函数,函数原型如下:

value = IORD_ALTERA_AVALON_PIO_DATA(base);   //base是要访问的IO口的基地址,value为函数返回的读到的值

(2)直接调用内部函数,函数原型如下:

value = IORD(BASE, REGNUM);    //BASE为是要访问的IO口的基地址,REGNUM为寄存器的偏移量,value为函数返回的读到的值。对于PIO来说,REGNUM为0

二、寄存器读写

用于对momory地址内数据直接进行多bit读写,比如对RAM的读写之类的。

2.1 多位寄存器写操作

IOWR_8DIRECT(BASE, OFFSET, DATA);     //往地址为BASE+OFFSET的寄存器中直接写入8Bit的数据DATA
IOWR_16DIRECT(BASE, OFFSET, DATA);    //往地址为BASE+OFFSET的寄存器中直接写入16Bit的数据DATA
IOWR_32DIRECT(BASE, OFFSET, DATA);   //往地址为BASE+OFFSET的寄存器中直接写入32Bit的数据DATA

2.2 多位寄存器读操作

value = IORD_8DIRECT(BASE, OFFSET);     //从地址为BASE+OFFSET的寄存器中直接读8Bit的数据到value中
value = IORD_16DIRECT(BASE, OFFSET);    //从地址为BASE+OFFSET的寄存器中直接读16Bit的数据到value中
value = IORD_32DIRECT(BASE, OFFSET);    //从地址为BASE+OFFSET的寄存器中直接读32Bit的数据到value中

三、PIO中断处理

//需要添加的头文件
#include "system.h"                   // 系统
#include "altera_avalon_pio_regs.h"   // PIO,ads_nIRQ
#include "alt_types.h"
#include "sys/alt_irq.h"              // 中断//相关声明
unsigned int nirq_isr_context; // 定义全局变量以储存isr_context指针
void nIRQ_Initial(void);
void nIRQ_ISR(void* isr_context);//main函数
int main(void)
{nIRQ_Initial(); // 初始化PIO中断while(1){}
}// nIRQ中断初始化
void nIRQ_Initial(void)
{void* isr_context_ptr = (void*) &nirq_isr_context;  // 改写timer_isr_context指针以匹配alt_irq_register()函数原型IOWR_ALTERA_AVALON_PIO_IRQ_MASK(ADS_NIRQ_BASE, 1); // 使能中断IOWR_ALTERA_AVALON_PIO_EDGE_CAP(ADS_NIRQ_BASE, 1); // 清中断边沿捕获寄存器// 注册ISRalt_ic_isr_register(ADS_NIRQ_IRQ_INTERRUPT_CONTROLLER_ID, // 中断控制器标号,从system.h复制ADS_NIRQ_IRQ,     // 硬件中断号,从system.h复制nIRQ_ISR,         // 中断服务子函数isr_context_ptr,  // 指向与设备驱动实例相关的数据结构体0x0);             // flags,保留未用
}// 中断服务子函数
void nIRQ_ISR(void* nirq_isr_context)
{IOWR_ALTERA_AVALON_PIO_EDGE_CAP(ADS_NIRQ_BASE, 1); // 清中断边沿捕获寄存器// 用户中断代码}

四、定时器中断处理

//需要添加的头文件
#include "system.h"                   // 系统
#include "altera_avalon_timer_regs.h" // 定时器
#include "alt_types.h"
#include "sys/alt_irq.h"              // 中断//相关声明
unsigned int timer_isr_context; // 定义全局变量以储存isr_context指针
void Timer_Initial(void);
void Timer_ISR(void* isr_context);//main函数
int main(void)
{Timer_Initial(); // 初始化定时器中断while(1){}
}// 定时器中断初始化
void Timer_Initial(void)
{void* isr_context_ptr = (void*) &timer_isr_context;    // 改写timer_isr_context指针以匹配alt_irq_register()函数原型// 设置PERIOD寄存器// PERIODH << 16 | PERIODL = 计数器周期因子 * 系统时钟频率因子 - 1// PERIODH << 16 | PERIODL = 5m*100M - 1 = 499999 = 0x7A11FIOWR_ALTERA_AVALON_TIMER_PERIODH(HIGH_RES_TIMER_BASE, 0x0007);IOWR_ALTERA_AVALON_TIMER_PERIODL(HIGH_RES_TIMER_BASE, 0xA11F);// 设置CONTROL寄存器//    位数 |  3   |  2   |  1   |  0  |// CONTROL | STOP | START| CONT | ITO |// ITO   1,产生IRO;                      0,不产生IRQ// CONT  1,计数器连续运行直到STOP被置一;   0,计数到0停止// START 1,计数器开始运行;                0,无影响// STOP  1,计数器停止运行;                0,无影响IOWR_ALTERA_AVALON_TIMER_CONTROL(HIGH_RES_TIMER_BASE,ALTERA_AVALON_TIMER_CONTROL_START_MSK |     // START = 1ALTERA_AVALON_TIMER_CONTROL_CONT_MSK  |     // CONT  = 1ALTERA_AVALON_TIMER_CONTROL_ITO_MSK);       // ITO   = 1// 注册定时器中断alt_ic_isr_register(HIGH_RES_TIMER_IRQ_INTERRUPT_CONTROLLER_ID, // 中断控制器标号,从system.h复制HIGH_RES_TIMER_IRQ,     // 硬件中断号,从system.h复制Timer_ISR,              // 中断服务子函数isr_context_ptr,        // 指向与设备驱动实例相关的数据结构体0x0);                   // flags,保留未用
}// 定时器中断服务子函数
void Timer_ISR(void* timer_isr_context)
{// 应答中断,将STATUS寄存器清零IOWR_ALTERA_AVALON_TIMER_STATUS(HIGH_RES_TIMER_BASE,~ ALTERA_AVALON_TIMER_STATUS_TO_MSK);   // TO = 0// 用户中断代码}

五、uart收发处理

uart接收有查询方式和中断方式。我这里的uart接收采用中断处理方式,发送利用单独的函数实时处理。

5.1 uart发送函数

//查询发送准备好信号,如果没有准备好,则等待
while(!((IORD_ALTERA_AVALON_UART_STATUS(UART_0_BASE)&ALTERA_AVALON_UART_STATUS_TRDY_MSK)));
//发送准备好,发送txbyte
IOWR_ALTERA_AVALON_UART_TXDATA(UART_0_BASE,txbyte);

5.2 uart中断接收

//相关头文件
#include "system.h"    //系统硬件信息的宏定义文件
#include "alt_types.h"    //与Nios II相关的数据类型
#include "altera_avalon_uart_regs.h"    //提供相应内核寄存器访问宏定义
#include "sys\alt_irq.h"    //中断相关宏定义//相关声明
unsigned int uart_isr_context; //定义全局变量以储存isr_context指针
void uart_init();
static void uart_isr(void * p_uart_isr_context);//main函数
int main(void)
{uart_init(); // 初始化uart中断while(1){}
}//uart中断初始化
void uart_init()
{// 改写pack_uart_isr_context指针以匹配alt_irq_register()函数原型void *isr_context_ptr = (void*) & uart_isr_context;//清除状态寄存器IOWR_ALTERA_AVALON_UART_STATUS(UART_0_BASE,0);//使能接受准备好中断IOWR_ALTERA_AVALON_UART_CONTROL(UART_0_BASE,0X80);// 注册ISRalt_ic_isr_register(UART_0_IRQ_INTERRUPT_CONTROLLER_ID,  // 中断控制器标号,从system.h复制UART_0_IRQ,                          // 硬件中断号,从system.h复制uart_isr,                            // 中断服务子函数isr_context_ptr,                      // 指向与设备驱动实例相关的数据结构体0x0);                               // flags,保留未用}//uart中断接收服务子函数
static void uart_isr(void * p_uart_isr_context){//清除状态寄存器IOWR_ALTERA_AVALON_UART_STATUS(UART_0_BASE,0);//用户逻辑//rxdata = IORD_ALTERA_AVALON_UART_RXDATA(UART_0_BASE);//UART 接收/*//查询发送准备好信号,如果没有准备好,则等待while(!((IORD_ALTERA_AVALON_UART_STATUS(UART_0_BASE)&ALTERA_AVALON_UART_STATUS_TRDY_MSK)));//发送准备好,发送txdataIOWR_ALTERA_AVALON_UART_TXDATA(UART_0_BASE,txdata);*/}

六、延时函数

//所需头文件
#include "unistd.h"    //us延时函数 usleep()
usleep(200*1000); //延时200ms

注:usleep()函数做ms级别及以上的延时的确很准,但是us级别就有点捉襟见肘了。如果是us级别的延时可以用for()循环做空语句延时,但是这样也只是粗略的延时。

nios自学笔记三:nios常用外设C函数整理相关推荐

  1. MYSQL学习笔记三:日期和时间函数

    MYSQL学习笔记三:日期和时间函数 1. 获取当前日期的函数和获取当前时间的函数 /*获取当前日期的函数和获取当前时间的函数.将日期以'YYYY-MM-DD'或者'YYYYMMDD'格式返回 */ ...

  2. PHP常用数组(Array)函数整理

    PHP常用数组(Array)函数整理 整理了一份PHP开发中数组操作大全,包含有数组操作的基本函数.数组的分段和填充.数组与栈.数组与列队.回调函数.排序.计算.其他的数组函数等. 一.数组操作的基本 ...

  3. Bug bounty自学笔记1(常用工具)

    听说bug bounty 最近很流行 于是想在YouTube上找一些视频自学,记录一些学习笔记. 选择什么样的virtual hosting software VirtualBox 开始不错 但后面要 ...

  4. 微信小程序开发自学笔记 —— 三、理解小程序宿主环境

    理解小程序宿主环境 小程序可以调用宿主环境提供的微信客户端的能力. 渲染层和逻辑层 小程序的运行环境分成渲染层和逻辑层,WXML模板和WXSS样式工作在渲染层,JS 脚本工作在逻辑层. 小程序如何把脚 ...

  5. 【Spring Data JPA自学笔记三】Spring Data JPA的基础和高级查询方法

    文章目录 调用接口的基础方法查询 Repository CrudRepository PagingAndSortingRepository JPARepository JpaSpecification ...

  6. 中值滤波_Halcon联合C#编程自学笔记三之中值滤波

    [前言] 在图像预处理过程中有中值滤波.均值滤波.高斯滤波等,本次主要研究中值滤波.中值滤波是消除图像噪声最常见的手段之一,特别是消除椒盐噪声,中值滤波比均值滤波更好.它的基本原理是计算出数字图像中的 ...

  7. Photoshopcs6 自学笔记三 画笔工具

    制作笔刷 首先选中要制作成笔刷的图像 1.使用多边形套索工具或者画笔工具选中要制作成笔刷的图像 2.选择编辑,后填写画笔名称 然后选中画笔工具就可以画出笔刷中的鲸鱼图像如图所示: 保存制作的画笔 编辑 ...

  8. MySQL数据库语言自学笔记4:常用函数之数值函数

    数值函数也是会经常使用到的功能,记住他们可以让很多工作事半功倍. abs(x) 返回绝对值: mysql> select abs(-2),abs(3),abs(null); +--------- ...

  9. python基本语法总结-Python基本语法总结(三) 常用内置函数

    help()函数 help() 函数用于查看函数或模块用途的详细说明. >>> help([].append) #列表的append()函数用法 Help on built-in f ...

最新文章

  1. 转:ORACLE 中ROWNUM用法总结!
  2. 云管边端架构图_中移物联网布局构建“云-管-端”全方位体系架构
  3. 通过快速Java和文件序列化加快速度
  4. 阿里资深技术专家的10年感悟
  5. poj 3486 A Simple Problem with Integers(树状数组第三种模板改段求段)
  6. VSCode打开多个项目文件夹的解决方法
  7. c和python的区别动图_Python和C区别该如何理解?如何适应这种区别?
  8. 图算法之k-Core
  9. 深度linux如何打开exe文件,在deepin中简单粗暴地执行exe程序
  10. 微小区客户成功服务流程
  11. Selenium下载与安装
  12. 苹果电脑上好用的几款数据备份工具
  13. python50图_菊安酱和菜菜的Python可视化50图
  14. USACO 2022 US Open Contest, Bronze
  15. 如何自己建网站,怎么创建自己的网站
  16. 腾讯云GPU服务器深度学习环境搭建
  17. Matlab小课堂1
  18. Atcoder abc A~E
  19. 内核网络协议栈offload功能盘点
  20. 举个栗子!Tableau 技巧(176):快速添加 Server 受信任的 IP

热门文章

  1. (转)实用Word使用技巧大全
  2. ipa 修改服务器地址,iOS重签名 – ipa包(服务器适用)
  3. UE4贴图自适应屏幕大小
  4. [渝粤教育] 江西理工大学 机械之美——迷人的工程机械(双语) 参考 资料
  5. python爬取百度图片,自定义关键字和页数
  6. 计算机大专考试题,计算机大专考试试题一
  7. 「九章」刷屏的背后:万字长文解析,量子计算机和电子计算机各有何优劣?
  8. 谈论AI之前,你搞懂人类了吗?
  9. 源发行版 8 需要目标发行版 1.8
  10. echarts移除百度地图logo方法