nios自学笔记三:nios常用外设C函数整理
该文章为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函数整理相关推荐
- MYSQL学习笔记三:日期和时间函数
MYSQL学习笔记三:日期和时间函数 1. 获取当前日期的函数和获取当前时间的函数 /*获取当前日期的函数和获取当前时间的函数.将日期以'YYYY-MM-DD'或者'YYYYMMDD'格式返回 */ ...
- PHP常用数组(Array)函数整理
PHP常用数组(Array)函数整理 整理了一份PHP开发中数组操作大全,包含有数组操作的基本函数.数组的分段和填充.数组与栈.数组与列队.回调函数.排序.计算.其他的数组函数等. 一.数组操作的基本 ...
- Bug bounty自学笔记1(常用工具)
听说bug bounty 最近很流行 于是想在YouTube上找一些视频自学,记录一些学习笔记. 选择什么样的virtual hosting software VirtualBox 开始不错 但后面要 ...
- 微信小程序开发自学笔记 —— 三、理解小程序宿主环境
理解小程序宿主环境 小程序可以调用宿主环境提供的微信客户端的能力. 渲染层和逻辑层 小程序的运行环境分成渲染层和逻辑层,WXML模板和WXSS样式工作在渲染层,JS 脚本工作在逻辑层. 小程序如何把脚 ...
- 【Spring Data JPA自学笔记三】Spring Data JPA的基础和高级查询方法
文章目录 调用接口的基础方法查询 Repository CrudRepository PagingAndSortingRepository JPARepository JpaSpecification ...
- 中值滤波_Halcon联合C#编程自学笔记三之中值滤波
[前言] 在图像预处理过程中有中值滤波.均值滤波.高斯滤波等,本次主要研究中值滤波.中值滤波是消除图像噪声最常见的手段之一,特别是消除椒盐噪声,中值滤波比均值滤波更好.它的基本原理是计算出数字图像中的 ...
- Photoshopcs6 自学笔记三 画笔工具
制作笔刷 首先选中要制作成笔刷的图像 1.使用多边形套索工具或者画笔工具选中要制作成笔刷的图像 2.选择编辑,后填写画笔名称 然后选中画笔工具就可以画出笔刷中的鲸鱼图像如图所示: 保存制作的画笔 编辑 ...
- MySQL数据库语言自学笔记4:常用函数之数值函数
数值函数也是会经常使用到的功能,记住他们可以让很多工作事半功倍. abs(x) 返回绝对值: mysql> select abs(-2),abs(3),abs(null); +--------- ...
- python基本语法总结-Python基本语法总结(三) 常用内置函数
help()函数 help() 函数用于查看函数或模块用途的详细说明. >>> help([].append) #列表的append()函数用法 Help on built-in f ...
最新文章
- 转:ORACLE 中ROWNUM用法总结!
- 云管边端架构图_中移物联网布局构建“云-管-端”全方位体系架构
- 通过快速Java和文件序列化加快速度
- 阿里资深技术专家的10年感悟
- poj 3486 A Simple Problem with Integers(树状数组第三种模板改段求段)
- VSCode打开多个项目文件夹的解决方法
- c和python的区别动图_Python和C区别该如何理解?如何适应这种区别?
- 图算法之k-Core
- 深度linux如何打开exe文件,在deepin中简单粗暴地执行exe程序
- 微小区客户成功服务流程
- Selenium下载与安装
- 苹果电脑上好用的几款数据备份工具
- python50图_菊安酱和菜菜的Python可视化50图
- USACO 2022 US Open Contest, Bronze
- 如何自己建网站,怎么创建自己的网站
- 腾讯云GPU服务器深度学习环境搭建
- Matlab小课堂1
- Atcoder abc A~E
- 内核网络协议栈offload功能盘点
- 举个栗子!Tableau 技巧(176):快速添加 Server 受信任的 IP