SOPC乐曲演奏大作业 - 图文

更新时间:2024-06-09 12:22:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

综合实验 基于NiosII的乐曲演奏设计

单 位: 班 级:

组 员: 指导老师:

首 都 师 范 大 学2012年5月

1

目录

一.设计概述................................................................................................ 3 二.设计要求............................................................................................. 3 三.设计方案(总体设计原理、软件设计、硬件设计) .................... 3 3.1总体设计原理 ................................................................................ 3 3.2 软件设计流程图 ........................................................................... 4 3.3硬件设计 ........................................................................................ 8 四.实验环境............................................................................................. 9 五.软件实验步骤 .................................................................................... 9 六. 头文件.............................................................................................. 11 6.1 music.h .......................................................................................... 11 6.2 LCD.h............................................................................................ 19 七.实验结果及分析 .............................................................................. 23 八.总结及遇到问题 .............................................................................. 24 九.思考题:........................................................................................... 24

2

一.设计概述

本设计基于SOPC builder和 Nios II 8.0的乐曲演奏,使用蜂鸣器进行播放歌曲,本设计编写多首歌曲可以循环播放,并在液晶屏上显示歌曲名称和切换名称。

实验前准备:

1、该实验需要使用七个模块组中的第七个功能单元,所以三个拨码开关处于“处于“110”时,即MODEL_SEL2和MODEL_SEL3拨下处于“OFF”状态,MODEL_SEL1拨下处于“ON”时,选择该模块。

2、拨码开关MODEL_SEL5-8全置于“ON ”状态,即MODEL_SEL5-8拨下处于“ON ”状态时通过USB BLASTER接口下载。当全部拨下处于“OFF”时可使用开发平台上LAB_JTAG_PS_AS 接口下载或者核心开发板上JTAG接口下载。

这里用户可根据自己所用的下载线来选择适当的下载方式和相应的MODEL_SEL5-8的状态。

二.设计要求

通过使用PWM对交流蜂鸣器进行控制,实现多首乐曲(6首)的播放。

实现如下功能: 1. 歌曲播放 2. 暂停功能

3. 多首歌曲的切换(6首) 其他扩展要求:在液晶屏上显示歌曲的名称,以及上下切换字符(before,after)

三.设计方案(总体设计原理、软件设计、硬件设计)

3.1总体设计原理

实验箱的蜂鸣器是交流蜂鸣器,在BZSP输入一定频率的脉冲时,蜂鸣器蜂鸣,改变输入频率可以改变蜂鸣器的响声。因此可以利用一个PWM来控制BZSP,通过改变PWM的频率来得到不同的声响,以此来播放音乐。

PWM设计说明

3

PWM输出一个占空比可调的方波。当一个周期11个时钟,高电平输出7个时钟时的PWM输出波形如下图所示。

图1 PWM输出波形图

表一 内部寄存器: 寄存器名 地址偏移量 访问属性 clock_divide duty_cycle enable 保留 00 01 10 11 读/写 读/写 读/写 - 描 述 用来设定PWM输出周期的时钟数 用来设定一个周期内PWM输出低电平的时钟个数 使能和关闭PWM输出,为1时使能PWM输出 3.2 软件设计流程图

Stop=1 是 否 暂停 否 Play=1 是 播放歌曲 图2 程序流程框图

首先,判断暂停键是否按下,如果没有,则播放歌曲,如果按下来了暂停键,就执行暂停功能。暂停后判断播放键有没有按下,如果按下了播放键,则在断点的地方接着播放歌曲,

如果没有,则一直暂停到播放按键按下。

4

主程序代码:

6首歌曲播放,暂停,及切换上一首、切换下一首同时显示歌名和play、stop、next、before:

延时程序,延时1ms

5

如果暂停键没有按下,则播放六首歌

如果暂停键按下了,显示“stop”。如果播放按键没按下,把0写进蜂鸣器,即暂停,如果播放按键按下了,在断点处继续播放歌曲

6

上下首歌切换:

判断按键函数 第一个按键执行播放功能 第二个按键执行暂停功能 第三个按键切换上一首

第四个切换下一首

7

如果选择第一首歌,则LCD清屏,显示第一首歌歌名,同时显示“play”。余下5首同理

图3 程序

3.3硬件设计

乐曲演奏需添加的IP核

图4 硬件图

8

四.实验环境

硬件: PC机

GX-SOC/SOPC-DEV-LAB PLATFORM创新开发实验平台 GX-SOPC-EP2C35-M672核心板

软件: Quartus II 8.0 Nios II 8.0

五.软件实验步骤

1、.把 altera_avalon_pwm (IP核)拷贝到自己的工程文件夹目录下, 2. 在主菜单打开Tools->SOPC Builer

图5 生成PWM核

3.重新命名为 bzsp,点击鼠标右键,进行自动分配 Addressess 和IRQ,点击

Generate

图5 对PWM核重命名

4.生成成功以后回到Quartus II界面软件中必须替换更新:在.bdf鼠标右键单击空白处,单击Update Symbol or Block…,即可。

5.在NIOS II IDE软件环境中点击New->Nios II C/C++ Application,建立一个工程

6.在SOPC Builder System PTF File 选择NIOS2.ptf,C/C++的应用工程名Name重命名,点击Next

9

7.选中Create a new system library named,点击Finish. 8.建立music.h文件和LCD.h头文件

9.编译工程

10.build 成功后下载硬件 11.运行RUN

10

六. 头文件

6.1 music.h

#ifndef _MUSIC_H

#define _MUSIC_H

#include \

// rhythm: quarter note as a meter//持续

时间的长短

#define RHYTHM 36

#define _1 RHYTHM*4 //note

#define _1d RHYTHM*6 //dotted note

#define _2 RHYTHM*2 //halfnote

#define _2d RHYTHM*3 //dotted halfnote

#define _4 RHYTHM*1 //quarter note

#define _4d RHYTHM*3/2 //dotted quarter note

#define _8 RHYTHM*1/2 //eighth note

#define _8d RHYTHM*3/4 //dotted eighth note

#define _16 RHYTHM*1/4 //sixteenth note

#define _16d RHYTHM*3/8 //dotted sixteenth note

#define _32 RHYTHM*1/8 //thirty-second note

//低音

#define _1DO (ALT_CPU_FREQ/131)

#define _1DOr (ALT_CPU_FREQ/139)

#define _1RE (ALT_CPU_FREQ/147)

#define (ALT_CPU_FREQ/155) #define (ALT_CPU_FREQ/165) #define (ALT_CPU_FREQ/175) #define (ALT_CPU_FREQ/185) #define

(ALT_CPU_FREQ/196) #define

(ALT_CPU_FREQ/207) #define

(ALT_CPU_FREQ/220) #define

(ALT_CPU_FREQ/233) #define

(ALT_CPU_FREQ/247)

//中音 #define

(ALT_CPU_FREQ/262) #define

(ALT_CPU_FREQ/277) #define

(ALT_CPU_FREQ/294) #define

(ALT_CPU_FREQ/311) #define

(ALT_CPU_FREQ/330) #define (ALT_CPU_FREQ/349)

#define (ALT_CPU_FREQ/370)

#define (ALT_CPU_FREQ/392)

#define _1REr _1MI _1FA _1FAr _1SOL _1SOLr _1LA _1LAr _1SI _DO _DOr _RE _REr _MI _FA _FAr _SOL _SOLr

11

(ALT_CPU_FREQ/416) //1=G 3/4 #define _LA // 乐曲为一个多行3列的2维数组 (ALT_CPU_FREQ/440) //第1列为音调,第2列为节拍,第3#define _LAr 列音高(高音、低音) (ALT_CPU_FREQ/466) #define _SI (ALT_CPU_FREQ/492) int burro[SONG_SIZE1][3] = { //高音 {_DO,_2, MUTE(_DO)},//1 #define _DO1 {_MI, _32,0}, (ALT_CPU_FREQ/523) #define _DO1r (ALT_CPU_FREQ/554) #define _RE1 (ALT_CPU_FREQ/579) #define _RE1r (ALT_CPU_FREQ/740) #define _MI1 (ALT_CPU_FREQ/651) #define _FA1 (ALT_CPU_FREQ/695) #define _FA1r (ALT_CPU_FREQ/740) #define _SOL1 (ALT_CPU_FREQ/784) #define _SOL1r (ALT_CPU_FREQ/830) #define _LA1 (ALT_CPU_FREQ/880) #define _LAR1r (ALT_CPU_FREQ/932) #define _SI1 (ALT_CPU_FREQ/983) #define SONG_SIZE1 200 #define SONG_SIZE2 200 #define SONG_SIZE3 200 #define SONG_SIZE4 200 #define SONG_SIZE5 200 #define SONG_SIZE6 200 #define MUTE(TONE) (TONE)>>2 //低音为25%占空比 #define LOUD(TONE) (TONE)>>1 //高音为50%占空比

{_DO,_2, MUTE(_DO)},//1 {_MI, _32,0}, {_DO,_2, MUTE(_DO)},//1 {_MI, _32,0}, {_MI,_2, MUTE(_MI)},//3 {_MI, _32,0}, {_SOL,_2, LOUD(_SOL)},//5 {_MI, _32,0}, {_SOL,_2, LOUD(_SOL)},//5 {_MI, _32,0}, {_SOL,_2, LOUD(_SOL)},//5 {_MI, _32,0}, {_SOL,_2, LOUD(_SOL)},//5 {_MI, _32,0}, {_LA,_2, MUTE(_LA)},//6 {_MI, _32,0}, {_LA,_2, MUTE(_LA)},//6 {_MI, _32,0}, {_LA,_2, MUTE(_LA)},//6 {_MI, _32,0}, {_DO1,_2, LOUD(_DO1)},//1 {_MI, _32,0}, {_SOL,_1, LOUD(_SOL)},//5 {_MI, _32,0}, {_FA,_2, MUTE(_FA)},//4 {_MI, _32,0}, {_FA,_2, MUTE(_FA)},//4 {_MI, _32,0}, {_LA,_2, MUTE(_LA)},//6 {_MI, _32,0}, {_LA,_2, MUTE(_LA)},//6 {_MI, _32,0}, {_MI,_2, MUTE(_MI)},//3 {_MI, _32,0}, {_MI,_2, MUTE(_MI)},//3

12

{_MI, _32,0},

{_MI,_2, MUTE(_MI)},//3 {_MI, _32,0},

{_MI,_2, MUTE(_MI)},//3 {_MI, _32,0},

{_RE, _2,MUTE(_RE)}, //2 {_MI, _32,0},

{_RE, _2,MUTE(_RE)}, //2 {_MI, _32,0},

{_RE, _2,MUTE(_RE)}, //2 {_MI, _32,0},

{_RE, _2,MUTE(_RE)}, //2 {_MI, _32,0},

{_SOL,_1, MUTE(_SOL)},//5 {_MI, _32,0},

{_SOL,_4, MUTE(_SOL)},//5 {_DO,_2, MUTE(_DO)},//1 {_MI, _32,0},

{_DO,_2, MUTE(_DO)},//1 {_MI, _32,0},

{_DO,_2, MUTE(_DO)},//1 {_MI, _32,0},

{_MI,_2, MUTE(_MI)},//3 {_MI, _32,0},

{_SOL,_2, MUTE(_SOL)},//5 {_MI, _32,0},

{_SOL,_2, MUTE(_SOL)},//5 {_MI, _32,0},

{_SOL,_2, MUTE(_SOL)},//5 {_MI, _32,0},

{_SOL,_2,MUTE(_SOL)},//5 {_MI, _32,0},

{_LA,_2, MUTE(_LA)},//6 {_MI, _32,0},

{_LA,_2, MUTE(_LA)},//6 {_MI, _32,0},

{_LA,_2, MUTE(_LA)},//6 {_MI, _32,0},

{_DO1,_2, MUTE(_DO1)},//1 {_MI, _32,0},

{_SOL,_1, LOUD(_SOL)},//5 {_FA,_2, LOUD(_FA)},//4 {_MI, _32,0},

{_FA,_2, LOUD(_FA)},//4

{_MI, _32,0},

{_FA,_2, LOUD(_FA)},//4 {_MI, _32,0},

{_LA,_2, MUTE(_LA)},//6 {_MI, _32,0},

{_MI,_2, MUTE(_MI)},//3 {_MI, _32,0},

{_MI,_4, MUTE(_MI)},//3 {_MI, _32,0},

{_MI,_4, MUTE(_MI)},//3 {_MI, _32,0},

{_MI,_2, MUTE(_MI)},//3 {_MI, _32,0},

{_MI,_2, MUTE(_MI)},//3 {_MI, _32,0},

{_RE, _2,LOUD(_RE)}, //2 {_MI, _32,0},

{_RE, _2,LOUD(_RE)}, //2 {_MI, _32,0},

{_RE, _2,LOUD(_RE)}, //2 {_MI, _32,0},

{_MI,_2, MUTE(_MI)},//3 {_MI, _32,0},

{_DO,_1, MUTE(_DO)},//1 };

int dachangjin[SONG_SIZE2][3] = { {_LA, _2, LOUD(_LA)}, //2 {_SI, _2, MUTE(_SI)}, //3 {_SI, _2, MUTE(_SI)}, //3 {_SI, _2d,LOUD(_SI)}, //3. {_LA, _4, MUTE(_LA)}, //2_ {_SOL,_2, MUTE(_SOL)},//1 {_MI, _2, LOUD(_MI)}, //.6 {_SOL,_2, MUTE(_SOL)},//1 {_SOL,_2d, MUTE(_SOL)},//1 {_LA, _16,MUTE(_LA)}, //2__ {_SOL,_1d,MUTE(_SOL)},//1-- {_LA, _2, LOUD(_LA)}, //2 {_SI, _2, MUTE(_SI)}, //3 {_SI, _2, MUTE(_SI)}, //3 {_SI, _2d,LOUD(_SI)}, //3. {_RE1,_4, MUTE(_RE1)},//5

13

{_SI, _2, MUTE(_SI)}, //3 {_SI, _2, MUTE(_SI)}, //3 {_LA, _2, MUTE(_LA)}, //2 {_SI, _2, MUTE(_SI)}, //3 {_SI, _4d,MUTE(_SI)}, //3-- {_RE1,_2, LOUD(_RE1)},//5 {_MI1,_2, MUTE(_MI1)},//6 {_MI1,_2, MUTE(_MI1)},//6 {_MI1,_2d,LOUD(_MI1)},//6 {_RE1,_4, MUTE(_RE1)},//5 {_SI, _2, MUTE(_SI)}, //3 {_SI, _2, MUTE(_SI)}, //3 {_LA, _2, MUTE(_LA)}, //2 {_SI, _2, MUTE(_SI)}, //3 {_SI, _1d,MUTE(_SI)}, //3-- {_RE1,_2, LOUD(_RE1)},//5 {_MI1,_2, MUTE(_MI1)},//6 {_MI1,_2, MUTE(_MI1)},//6 {_RE1,_4, MUTE(_RE1)},//5 {_SI, _2, MUTE(_SI)}, //3 {_SI, _2, LOUD(_SI)}, //3 {_RE1,_2, MUTE(_RE1)},//5 {_MI1,_4, MUTE(_MI1)},//6 {_RE1,_16,MUTE(_RE1)},//5 {_MI1,_16,MUTE(_MI1)},//6 {_RE1,_1d,MUTE(_RE1)},//5 {_LA, _2, LOUD(_LA)}, //2 {_SI, _2, MUTE(_SI)}, //3 {_SI, _2, MUTE(_SI)}, //3 {_LA, _2d,LOUD(_LA)}, //3. {_SI, _4, MUTE(_SI)}, //2 {_SI, _2, MUTE(_SI)}, //3 {_LA, _2, LOUD(_LA)}, //2 {_SI, _2, MUTE(_SI)}, //3 {_MI, _2, LOUD(_MI)}, //.6 {_SOL,_8,MUTE(_SOL)},//1 {_MI, _1d,MUTE(_MI)}, //.6 {_MI, _2,0}, //stop {_LA, _2, LOUD(_LA)}, //2 {_SI, _2, MUTE(_SI)}, //3 {_SI, _2, MUTE(_SI)}, //3 {_SI, _2d,LOUD(_SI)}, //3. {_LA, _4, MUTE(_LA)}, //2_ {_SOL,_2, MUTE(_SOL)},//1 {_MI, _2, LOUD(_MI)}, //.6 {_SOL,_2, MUTE(_SOL)},//1 {_SOL,_8d,MUTE(_SOL)},//1 {_LA, _16,MUTE(_LA)}, //2__ {_SOL,_1d,MUTE(_SOL)},//1-- {_LA, _2, LOUD(_LA)}, //2 {_SI, _2, MUTE(_SI)}, //3 {_SI, _2, MUTE(_SI)}, //3 {_SI, _2d,LOUD(_SI)}, //3.

14

{_MI1,_2d,LOUD(_MI1)},//6 {_RE1,_4, MUTE(_RE1)},//5 {_SI, _2, MUTE(_SI)}, //3 {_SI, _2, LOUD(_SI)}, //3 {_RE1,_2, MUTE(_RE1)},//5 {_MI1,_2, MUTE(_MI1)},//6 {_RE1,_1d,MUTE(_RE1)},//5 {_LA, _2, LOUD(_LA)}, //2 {_SI, _2, MUTE(_SI)}, //3 {_SI, _2, MUTE(_SI)}, //3 {_LA, _2d,LOUD(_LA)}, //3. {_SI, _4, MUTE(_SI)}, //2 {_SI, _2, MUTE(_SI)}, //3 {_LA, _2, LOUD(_LA)}, //2 {_SI, _2, MUTE(_SI)}, //3 {_MI, _2, LOUD(_MI)}, //.6 {_SOL,_8,MUTE(_SOL)},//1 {_MI, _1d,MUTE(_MI)}, //.6-- {_LA, _8,LOUD(_LA)}, //2 {_LA, _8,LOUD(_LA)}, //2 {_LA, _8d,LOUD(_LA)}, //2 {_SOL,_4, MUTE(_SOL)},//1 {_MI, _2, MUTE(_MI)}, //.6 {_LA, _8,LOUD(_LA)}, //2 {_LA, _8,LOUD(_LA)}, //2 {_LA, _8d,LOUD(_LA)}, //2 {_SOL,_4, MUTE(_SOL)},//1 {_MI, _2, MUTE(_MI)}, //.6 {_LA, _2, LOUD(_LA)}, //2 {_SI, _2, MUTE(_SI)}, //3 {_SOL,_2, MUTE(_SOL)},//1 {_LA, _2d,LOUD(_LA)}, //2 {_SI, _4, MUTE(_SI)}, //3 {_RE1,_2, MUTE(_RE1)},//5 {_MI1,_8,LOUD(_MI1)},//6

{_MI1,_8,LOUD(_MI1)},//6 {_MI1,_8d,LOUD(_MI1)},//6 {_RE1,_4, MUTE(_RE1)},//5 {_SI, _2, MUTE(_SI)}, //3 {_LA, _8,LOUD(_LA)}, //2 {_LA, _8,LOUD(_LA)}, //2 {_LA, _8d, LOUD(_LA)}, //2 {_SOL,_4, MUTE(_SOL)},//1 {_MI, _2, MUTE(_MI)}, //.6 {_MI, _2, LOUD(_MI)}, //.6 {_RE, _2, MUTE(_RE)}, //.5 {_MI, _2, MUTE(_MI)}, //.6 {_MI, _1d,MUTE(_MI)}, //.6 {_MI, _2,0}, //stop {_MI, _2,0}, //stop };

/*{_1SOL, _4d, MUTE(_1SOL)}, //.1 {_1LA, _4d, MUTE(_1LA)}, //.2 {_1SI, _4d, MUTE(_1SI)}, //.3 {_DO, _4d, MUTE(_DO)}, //.4 {_RE, _4d, MUTE(_RE)}, //.5 {_MI, _4d, MUTE(_MI)}, //.6 {_FA, _4d, MUTE(_FA)}, //.7 {_SOL, _4d, MUTE(_SOL)}, //1 {_LA, _4d, MUTE(_LA)}, //2 {_SI, _4d, MUTE(_SI)}, //3

{_DO1, _4d, MUTE(_DO1)}, //4 {_RE1, _4d, MUTE(_RE1)}, //5 {_MI1, _4d, MUTE(_MI1)}, //6 {_FA1, _4d, MUTE(_FA1)}, //7 {_SOL1, _4d, MUTE(_SOL1)}, //1. {_LA1, _4d, MUTE(_LA1)}, //2. {_SI1, _4d, MUTE(_SI1)}, //3. */

int xiaoxingxing[SONG_SIZE3][3] = { {_DO,_2, MUTE(_DO)},//1 {_MI, _32,0},

{_DO,_2, MUTE(_DO)},//1 {_MI, _32,0},

{_SOL,_2, MUTE(_SOL)},//5 {_MI, _32,0},

{_SOL,_2, MUTE(_SOL)},//5

{_MI, _32,0},

{_LA,_2, MUTE(_LA)},//6 {_MI, _32,0},

{_LA,_2, MUTE(_LA)},//6 {_SOL,_1, MUTE(_SOL)},//5 {_FA,_2, MUTE(_FA)},//4 {_MI, _32,0},

{_FA,_2, MUTE(_FA)},//4 {_MI, _2, MUTE(_MI)}, //3 {_MI, _32,0},

{_MI, _2, MUTE(_MI)}, //3 {_RE, _2, MUTE(_RE)}, //2 {_MI, _32,0},

{_RE, _2, MUTE(_RE)}, //2 {_DO,_1,MUTE(_DO)},//1-- {_SOL,_2, MUTE(_SOL)},//5 {_MI, _32,0},

{_SOL,_2, MUTE(_SOL)},//5 {_FA,_2, MUTE(_FA)},//4 {_MI, _32,0},

{_FA,_2, MUTE(_FA)},//4 {_MI, _2, MUTE(_MI)}, //3 {_MI, _32,0},

{_MI, 2, MUTE(_MI)}, //3 {_RE, _1, MUTE(_RE)}, //2 {_SOL,_2, MUTE(_SOL)},//5 {_MI, _32,0},

{_SOL,_2, MUTE(_SOL)},//5 {_FA,_2, MUTE(_FA)},//4 {_MI, _32,0},

{_FA,_2, MUTE(_FA)},//4 {_MI, _2, MUTE(_MI)}, //3 {_MI, _32,0},

{_MI, _2, MUTE(_MI)}, //3 {_RE, _1, MUTE(_RE)}, //2

{_DO,_2, MUTE(_DO)},//1 {_MI, _32,0},

{_DO,_2, MUTE(_DO)},//1 {_SOL,_2, MUTE(_SOL)},//5 {_MI, _32,0},

{_SOL,_2, MUTE(_SOL)},//5 {_LA,_2, MUTE(_LA)},//6 {_MI, _32,0},

15

{_LA,_2, MUTE(_LA)},//6 {_SOL,_1, MUTE(_SOL)},//5 {_FA,_2, MUTE(_FA)},//4 {_MI, _32,0},

{_FA,_2, MUTE(_FA)},//4 {_MI, _2, MUTE(_MI)}, //3 {_MI, _32,0},

{_MI, _2, MUTE(_MI)}, //3 {_RE, _2, MUTE(_RE)}, //2 {_MI, _32,0},

{_RE, _2, MUTE(_RE)}, //2 {_DO,_1,MUTE(_DO)},//1-- }; //别少分号!

int love[SONG_SIZE4][3]={ {_MI, _2,0},

{_1LA,_4, MUTE(_1LA)},//6 {_1SI,_4, MUTE(_1SI)},//7 {_DO,_4, MUTE(_DO)},//1

{_MI,_4, MUTE(_MI)},//3

{_RE, _4,LOUD(_RE)}, //2

{_DO,_4, MUTE(_DO)},//1

{_RE, _2,LOUD(_RE)}, //2 {_RE, _2,LOUD(_RE)},

{_1LA,_4, MUTE(_1LA)},//6 {_1SI,_4, MUTE(_1SI)},//7 {_DO,_4, MUTE(_DO)},//1 {_DO,_4d, MUTE(_DO)},//1 {_DO,_4, MUTE(_DO)},//1 {_DO,_4d, MUTE(_DO)},//1 {_1SI,_4, MUTE(_1SI)},//7 {_1SI,_4, MUTE(_1SI)},//7

{_1SOL,_2d, LOUD(_1SOL)},//5 {_1SOL,_2d, LOUD(_1SOL)}, {_MI, _2,0},

{_1LA,_4, MUTE(_1LA)},//6 {_1SI,_4, MUTE(_1SI)},//7 {_DO,_4, MUTE(_DO)},//1

{_MI,_4, MUTE(_MI)},//3 {_RE, _4,LOUD(_RE)}, //2 {_DO,_4, MUTE(_DO)},//1 {_RE, _2,LOUD(_RE)}, //2 {_RE, _2,LOUD(_RE)},

{_1LA,_4, MUTE(_1LA)},//6 {_1SI,_4, MUTE(_1LA)},//7 {_DO,_1, MUTE(_DO)},//1 {_MI, _32,0},

{_RE, _4,MUTE(_RE)}, //2 {_MI,_4, MUTE(_MI)},//3 {_1SI,_1, MUTE(_1SI)},//7 {_1SI,_1, MUTE(_1SI)}, {_MI, _2,0},

{_1LA,_4, MUTE(_1LA)},//6 {_1SI,_4, MUTE(_1SI)},//7 {_DO,_4, MUTE(_DO)},//1 {_MI,_4, MUTE(_MI)},//3 {_RE, _4,LOUD(_RE)}, //2 {_DO,_4, MUTE(_DO)},//1 {_RE, _2,LOUD(_RE)}, //2 {_RE, _2,LOUD(_RE)},

{_1LA,_4, MUTE(_1LA)},//6 {_1SI,_4, MUTE(_1SI)},//7 {_DO,_4, MUTE(_DO)},//1 {_DO,_4d, MUTE(_DO)},//1 {_DO,_4, MUTE(_DO)},//1 {_DO,_4d, MUTE(_DO)},//1 {_1SI,_4, MUTE(_1SI)},//7 {_1SI,_4, MUTE(_1SI)},//7

{_1SOL,_2d, LOUD(_1SOL)},//5 {_1SOL,_2d, LOUD(_1SOL)}, {_MI, _2,0},

{_1LA,_4, MUTE(_1LA)},//6 {_1SI,_4, MUTE(_1SI)},//7 {_DO,_4, MUTE(_DO)},//1 {_SOL,_4, LOUD(_SOL)},//5 {_MI,_4, MUTE(_MI)},//3 {_DO,_4, MUTE(_DO)},//1 {_RE, _2,LOUD(_RE)}, //2 {_RE, _2,LOUD(_RE)}, //2 {_1LA,_4, MUTE(_1LA)},//6 {_1SI,_4, MUTE(_1SI)},//7 {_DO,_2, MUTE(_DO)},//1

16

{_DO,_2, MUTE(_DO)}, {_MI, _32,0},

{_RE, _4,LOUD(_RE)}, //2 {_MI,_4, MUTE(_MI)},//3 };

int huanlesong[SONG_SIZE5][3] = { {_1SI,_2, MUTE(_1SI)},//7 {_1SI,_2, MUTE(_1SI)},

{_DO,_4, MUTE(_DO)},//1 {_1LA,_2d, MUTE(_1LA)},//6 {_1LA,_4, MUTE(_1LA)},//6 {_1LA,_4, MUTE(_1LA)},//6 {_DO1,_4, MUTE(_DO1)},//1 {_SI,_2d, MUTE(_SI)},//7 {_LA,_4, MUTE(_LA)},//6 {_LA,_4, MUTE(_LA)},//6 {_SI,_4, MUTE(_SI)},//7 {_LA,_4, MUTE(_LA)},//6 {_LA,_4, MUTE(_LA)},//6 {_SOL,_4, LOUD(_SOL)},//5 {_SOL,_4, LOUD(_SOL)},//5 {_MI,_4, MUTE(_MI)},//3 {_SOL,_4, LOUD(_SOL)},//5 {_SOL,_4, LOUD(_SOL)},//5 {_SOL,_4, LOUD(_SOL)},//5 {_LA,_4, MUTE(_LA)},//6 {_DO,_1d, MUTE(_DO)},//1

{_DO,_8, MUTE(_DO)},//1 {_LA,_4, MUTE(_LA)},//6 {_LA,_4, MUTE(_LA)},//6 {_LA,_4, MUTE(_LA)},//6 {_LA,_4, MUTE(_LA)},//6 {_DO1,_2, MUTE(_DO1)},//1 {_SI,_2, MUTE(_SI)},//7 {_LA,_4, MUTE(_LA)},//6 {_LA,_4, MUTE(_LA)},//6 {_SOL,_4, LOUD(_SOL)},//5 {_SOL,_4, LOUD(_SOL)},//5 {_LA,_4, MUTE(_LA)},//6 {_SI,_2, MUTE(_SI)},//7 {_MI,_1, MUTE(_MI)},//3 {_MI,_1, MUTE(_MI)},//3

{_MI, _2, LOUD(_MI)}, // {_MI, _2, MUTE(_MI)}, // {_FA, _2, MUTE(_FA)}, // {_SOL, _2,LOUD(_SOL)}, // {_SOL, _2, MUTE(_SOL)}, // {_FA,_2, MUTE(_FA)},// {_MI, _2, LOUD(_MI)}, // {_RE,_2, MUTE(_RE)},// {_DO,_2, LOUD(_DO)},// {_DO, _2,MUTE(_DO)}, // {_RE,_2,MUTE(_RE)},// {_MI, _2, LOUD(_MI)}, // {_MI, _2, LOUD(_MI)}, // {_RE, _4, MUTE(_RE)}, // {_RE, _4,LOUD(_RE)}, // {_MI,_2, LOUD(_MI)},// {_MI, _2, MUTE(_MI)}, // {_FA, _2, MUTE(_FA)}, // {_SOL, _2, LOUD(_SOL)}, // {_SOL, _2, MUTE(_SOL)}, // {_FA, _2,MUTE(_FA)}, // {_MI,_2, LOUD(_MI)},// {_RE,_2, MUTE(_RE)},// {_DO,_2, MUTE(_DO)},// {_DO,_2,LOUD(_DO)},// {_RE,_2, MUTE(_RE)},// {_MI,_2, MUTE(_MI)}, // {_RE, _2, LOUD(_RE)}, // {_DO,_4, MUTE(_DO)},// {_DO,_2, MUTE(_DO)},// {_RE,_2,LOUD(_RE)},// {_RE,_2,MUTE(_RE)},// {_MI,_2,LOUD(_MI)},// {_DO, _2, LOUD(_DO)}, // {_RE, _2, LOUD(_RE)}, // {_MI, _4, LOUD(_MI)}, // {_FA, _4,LOUD(_FA)}, // {_MI, _2, MUTE(_MI)}, // {_DO, _2, MUTE(_DO)}, // {_RE, _2, LOUD(_RE)}, //

17

{_MI, _4, LOUD(_MI)}, // {_FA, _4, LOUD(_FA)}, // {_MI,_2,MUTE(_MI)},// {_DO, _2,MUTE(_DO)}, //

{_DO, _2,MUTE(_DO)}, // {_RE, _2, LOUD(_RE)}, //

{_1SOL, _2, MUTE(_1SOL)}, // {_MI, _2,LOUD(_MI)}, // {_MI, _2,LOUD(_MI)}, // {_FA, _2, MUTE(_FA)}, // {_SOL,_2, MUTE(_SOL)},// {_SOL, _2, LOUD(_SOL)}, // {_FA,_2, MUTE(_FA)},// {_MI,_2,MUTE(_MI)},// {_RE, _2,MUTE(_RE)}, // {_DO,_2,MUTE(_DO)},// {_DO, _2, LOUD(_DO)}, // {_RE, _2, MUTE(_RE)}, // {_MI, _2, MUTE(_MI)}, // {_RE, _2,LOUD(_RE)}, // {_DO,_4, MUTE(_DO)},// {_DO, _4, MUTE(_DO)}, // {_DO,_4,0}, //stop };

int jinshekuangwu[SONG_SIZE6][3] = {

{_SOL, _4, LOUD(_SOL)}, // {_SOL, _4, MUTE(_SOL)}, // {_FA, _4, MUTE(_FA)}, // {_FA, _4,LOUD(_FA)}, // {_SOL, _4, MUTE(_SOL)}, // {_SOL,_4, MUTE(_SOL)},// {_RE, _4, LOUD(_RE)}, // {_RE,_4, MUTE(_RE)},// {_RE,_4, MUTE(_RE)},// {_SOL, _4,MUTE(_SOL)}, // {_FA,_4,MUTE(_FA)},// {_FA, _4, LOUD(_FA)}, // {_1LA, _4, MUTE(_1LA)}, // {_DO, _4, MUTE(_DO)}, // {_RE, _4,LOUD(_RE)}, // {_RE,_4, MUTE(_RE)},// {_FA, _4, MUTE(_FA)}, //

{_RE, _4, MUTE(_RE)}, // {_RE, _4, MUTE(_RE)}, // {_FA, _4, MUTE(_FA)}, // {_SOL, _4,LOUD(_SOL)}, // {_SOL,_4, LOUD(_SOL)},// {_LA,_4, LOUD(_LA)},// {_DO1,_2, LOUD(_DO1)},// {_LA,_4,LOUD(_LA)},// {_DO1,_4, LOUD(_DO1)},// {_DO1, _4, LOUD(_DO1)}, // {_LA, _4, LOUD(_LA)}, // {_SOL,_4, LOUD(_SOL)},// {_SOL,_4, LOUD(_SOL)},// {_LA,_4, LOUD(_LA)},// {_SOL,_4,LOUD(_SOL)},// {_FA,_4,LOUD(_FA)},// {_RE,_4,LOUD(_RE)},// {_RE, _4, LOUD(_RE)}, // {_SOL, _4, LOUD(_SOL)}, // {_SOL, _4, MUTE(_SOL)}, // {_RE, _4,LOUD(_RE)}, // {_FA, _4, LOUD(_FA)}, // {_MI, _4, LOUD(_MI)}, // {_RE, _4, LOUD(_RE)}, // {_DO, _8, LOUD(_DO)}, // {_RE, _8, LOUD(_RE)}, // {_FA,_4,MUTE(_FA)},// {_FA, _4,MUTE(_FA)}, // {_1LA, _4,LOUD(_1LA)}, //

{_DO, _4, LOUD(_DO)}, // {_RE, _4, LOUD(_RE)}, // {_FA, _4, LOUD(_FA)}, // {_RE, _8,LOUD(_RE)}, // {_DO, _8, MUTE(_DO)}, // {_1LA,_4, MUTE(_1LA)},// {_1SOL, _4, LOUD(_1SOL)}, // {_1LA,_8, MUTE(_1LA)},// {_1LA,_8,MUTE(_1LA)},// {_1SOL, _4,MUTE(_1SOL)}, // {_1SOL, _2,0}, //stop {_1SOL, _2,0}, //stop }; #endif

18

6.2 LCD.h

#ifndef LCD_H_ #define LCD_H_

// LCD Module 16*2

#define lcd_write_cmd(base, data) IOWR(base, 0, data) #define lcd_read_cmd(base) IORD(base, 1) #define lcd_write_data(base, data) IOWR(base, 2, data) #define lcd_read_data(base) IORD(base, 3) //------------------------------------------------------------------------- void LCD_Init();

void LCD_Show_Text(char* Text); void LCD_Line2(); void LCD_Test();

//-------------------------------------------------------------------------

#endif /*LCD_H_*/

//volatile int edge_capture;

static alt_u8 str1[17]; usleep(2000); static alt_u8 str2[17]; } static alt_u8 str3[17]; } static alt_u8 str4[17]; static alt_u8 str5[17]; static alt_u8 str6[17]; void LCD_Line1() static alt_u8 str7[17]; { static alt_u8 str8[17]; static alt_u8 str9[17]; lcd_write_cmd(LCD_DISPLAY_BASE,static alt_u8 str10[17]; 0x00); usleep(2000); } void LCD_Show_Text(char* Text) { void LCD_Line2() int i; { for(i=0;i

19

void LCD_Clear() {

lcd_write_cmd(LCD_DISPLAY_BASE,0x01);

usleep(2000); }

static void display_EDK1(){ str1[0]='b'; str1[1]='u'; str1[2]='r'; str1[3]='r'; str1[4]='o'; str1[5]=' '; str1[6]=' '; str1[7]=' '; str1[8]=' '; str1[9]= ' '; str1[10]=' '; str1[11]=' '; str1[12]=' '; str1[13]=' '; str1[14]=' '; str1[15]=' '; str1[16]='\\0'; LCD_Line1();

LCD_Show_Text(str1); }

//burro

static void display_EDK2(){ str2[0]='d'; str2[1]='a'; str2[2]='c'; str2[3]='h'; str2[4]='a'; str2[5]='n'; str2[6]='g'; str2[7]='j'; str2[8]='i'; str2[9]= 'n'; str2[10]=' ';

str2[11]=' '; str2[12]=' '; str2[13]=' '; str2[14]=' '; str2[15]=' '; str2[16]='\\0'; LCD_Line1();

LCD_Show_Text(str2); }

//dachangjin

static void display_EDK3(){ str3[0]='x'; str3[1]='i'; str3[2]='a'; str3[3]='o'; str3[4]='x'; str3[5]='i'; str3[6]='n'; str3[7]='g'; str3[8]='x'; str3[9]= 'i'; str3[10]='n'; str3[11]='g'; str3[12]=' '; str3[13]=' '; str3[14]=' '; str3[15]=' '; str3[16]='\\0'; LCD_Line1();

LCD_Show_Text(str3); }

//xiaoxingxing

static void display_EDK4(){ str4[0]='l'; str4[1]='o'; str4[2]='v'; str4[3]='e'; str4[4]=' '; str4[5]=' '; str4[6]=' '; str4[7]=' ';

20

str4[8]=' '; str4[9]= ' '; str4[10]=' '; str4[11]=' '; str4[12]=' '; str4[13]=' '; str4[14]=' '; str4[15]=' '; str4[16]='\\0'; LCD_Line1();

LCD_Show_Text(str4); } //love

static void display_EDK5(){ str5[0]='h'; str5[1]='u'; str5[2]='a'; str5[3]='n'; str5[4]='l'; str5[5]='e'; str5[6]='s'; str5[7]='o'; str5[8]='n'; str5[9]= 'g'; str5[10]=' '; str5[11]=' '; str5[12]=' '; str5[13]=' '; str5[14]=' '; str5[15]=' '; str5[16]='\\0'; LCD_Line1();

LCD_Show_Text(str5); }

//huanlesong

static void display_EDK6(){ str6[0]='j'; str6[1]='i'; str6[2]='n'; str6[3]='s'; str6[4]='h';

str6[5]='e'; str6[6]='k'; str6[7]='u'; str6[8]='a'; str6[9]= 'n'; str6[10]='g'; str6[11]='w'; str6[12]='u'; str6[13]=' '; str6[14]=' '; str6[15]=' '; str6[16]='\\0'; LCD_Line1();

LCD_Show_Text(str6); }

//jinshekuangwu

static void display_EDK7(){ str7[0]=' '; str7[1]=' '; str7[2]=' '; str7[3]=' '; str7[4]=' '; str7[5]=' '; str7[6]=' '; str7[7]=' '; str7[8]=' '; str7[9]= ' '; str7[10]=' '; str7[11]=' '; str7[12]='p'; str7[13]='l'; str7[14]='a'; str7[15]='y'; str7[16]='\\0'; LCD_Line2();

LCD_Show_Text(str7); } //play

static void display_EDK8(){ str8[0]=' ';

21

str8[1]=' '; str8[2]=' '; str8[3]=' '; str8[4]=' '; str8[5]=' '; str8[6]=' '; str8[7]=' '; str8[8]=' '; str8[9]= ' '; str8[10]=' '; str8[11]=' '; str8[12]='s'; str8[13]='t'; str8[14]='o'; str8[15]='p'; str8[16]='\\0'; LCD_Line2();

LCD_Show_Text(str8); } //stop

static void display_EDK9(){ str9[0]=' '; str9[1]=' '; str9[2]=' '; str9[3]=' '; str9[4]=' '; str9[5]=' '; str9[6]=' '; str9[7]=' '; str9[8]=' '; str9[9]= ' '; str9[10]='b';

str9[11]='e'; str9[12]='f'; str9[13]='o'; str9[14]='r'; str9[15]='e'; str9[16]='\\0'; LCD_Line2();

LCD_Show_Text(str9); }

//before

static void display_EDK10(){ str10[0]=' '; str10[1]=' '; str10[2]=' '; str10[3]=' '; str10[4]=' '; str10[5]=' '; str10[6]=' '; str10[7]=' '; str10[8]=' '; str10[9]= ' '; str10[10]=' '; str10[11]=' '; str10[12]='n'; str10[13]='e'; str10[14]='x'; str10[15]='t'; str10[16]='\\0'; LCD_Line2();

LCD_Show_Text(str10); } //next

22

七.实验结果及分析

播放歌曲“我是一头小毛驴”

播放歌曲“欢乐颂”

暂停歌曲“欢乐颂”

切换下一首歌

23

切换上一首歌

实验箱的蜂鸣器是交流蜂鸣器,在BZSP输入一定频率的脉冲时,蜂鸣器蜂鸣,改变输入频率可以改变蜂鸣器的响声。因此可以利用一个PWM来控制BZSP,通过改变PWM的频率来得到不同的声响,以此来播放音乐。

第一个按键实现播放功能,第二个按键实现暂停功能,第三个按键实现切换上一首,第四个按键切换下一首,播放歌曲的同时在LCD上显示相应的歌曲名,并同时显示“play、stop、next、stop”等。

八.总结及遇到问题

通过这次的SOPC大作业实验,我们更深刻地了解了SOPC Builder和Nios

II 的使用,并通过这些软件进行更深的实验,强化了我们的动手能力,并通过这次实验更加了解了SOPC的设计与应用。实验过程中,我们遇到了各种各样的问题,首先是自己进行排查,实在检查不出来就问同学让同学帮忙解决,在这过程中提高了我们解决问题的能力。我们在歌曲切换和歌名显示的时候遇到了问题,后来我们把判断按键的程序编程了函数,然后在主程序调用,在歌名显示的时候我们忽略了对LCD的清屏,最终在自己的努力下和同学的帮助下最终解决了。通过实验,我激发了SOPC学习的兴趣,也对这门课程有了更深的理解, SOPC结合了SOC和PLD、FPGA各自的优点,具有至少包含一个嵌入式处理器内核;具有小容量片内高速RAM资源;丰富的IP Core资源可供选择;足够的片上可编程逻辑资源;处理器调试接口和FPGA编程接口;可能包含部分可编程模拟电路单芯片、低功耗、微封装等这些优点。

九.思考题:

1. 何谓SOC?

答:System on Chip的缩写,称为芯片级系统,也有称片上系统,是一个有专用目标的集成电路,其中包含完整系统并有嵌入软件的全部内容。

24

2. 何谓SOPC?

答:SOPC(System On a Programmable Chip)称为可编程片上系统,它是基于可编程逻辑器件(FPGA或CPLD)可重构的SOC。SOPC集成了硬核或软核CPU、DSP、锁相环(PLL)、存储器、I/O接口及可编程逻辑,可以灵活高效地解决SOC方案,而且设计周期短,设计成本低,一般只需要一台配有SOPC开发软件的PC和一台SOPC实验开发系统(或开发板),就可以进行SOPC的设计与开发。

3. 可编程片上系统。

答:用可编程逻辑技术把整个系统放到一块硅片上,称作SOPC。可编程片上系统(SOPC)是一种特殊的嵌入式系统:首先它是片上系统(SOC),即由单个芯片完成整个系统的主要逻辑功能;其次,它是可编程系统,具有灵活的设计方式,可裁减、可扩充、可升级,并具备软硬件在系统可编程的功能。

4. 何谓IP核?

答:IP核(Intellectual Property core)是一段具有特定电路功能的硬件描述语言程序,该答:程序与集成电路工艺无关,可以移植到不同的半导体工艺中去生产集成电路芯片。IP核有两种,与工艺无关的VHDL程序称为软核;具有特定电路功能的集成电路版图称为硬核。硬核一般不允许更改,利用硬核进行集成电路设计难度大,但是容易成功流片。

5. 何谓嵌入式系统,嵌入式系统的CPU核可以分为哪两种类型?

答:嵌入式系统是一种专用的计算机系统,作为装置或设备的一部分。通常,嵌入式系统是一个控制程序存储在ROM中的嵌入式处理器控制板。事实上,所有带有数字接口的设备,如手表、微波炉、录像机、汽车等,都使用嵌入式系统,有些嵌入式系统还包含操作系统,但大多数嵌入式系统都是是由单个程序实现整个控制逻辑。

6. 简述NIOS II软核的特点。

答:一个是可定制,另一个是C2H

7. 简述HAL的用途及基于HAL的外围设备的编程方法。

答:HA159-3-2铝黄铜具有高的强度;耐蚀性是所有黄铜中最好的,腐蚀 破裂倾向不大,冷态下塑性低,热态下压力加工性好。HA159-3-2铝黄铜用于发动机和船舶业以及其它在常温下工作的高强度耐蚀件。通过使用HAL服务和间接硬件寻址,当移植到新的硬件上时,驱动程序和核心只需做很少的改动。移植HAL本身是直接的,因为所有的机器相关代码都集中在一个地方,并且移植的目标是充分定义的,即实现所有的HAL服务。

8. 简述SOPC的设计流程。 答:1、分析系统需求 2、建立Quartus II工程 3、定义和生成系统:在SOPC Builder中添加需要的功能模块 4、集成SOPC生成的系统到Quartus II工程 5、连接各功能模块 6、选择FPGA型号并进行管脚分配7、编译硬件系统生成配置文件sof 8、设置软件运行硬件环境属性 9、编译软件 10、在目标板上运行/调试软件

25

9. 简述AVALON总线的特点。

答:1.所有外设的接口与Avalon总线时钟同步,不需要复杂的握手/应答机制 2.所有的信号都是高电平或低电平有效,便于信号在总线中高速传输。在Avalon总线中, 由数据选择器(而不是三态缓冲器)决定哪个信号驱动哪个外设 3.为了方便外设的设计,地址、数据和控制信号使用分离的、专用的端口

10. 简述Altera公司支持的SOPC技术的PLD产品类型。

答:Altera公司的PLD分为CPLD和FPGA两类:CPLD器件逻辑单元大,分解组合能力很强,一个单元可以分解成数十个组合逻辑,因此其产品较适合设计组合逻辑电路;FPGA器件逻辑单元小,有较多的触发器,适合用来设计需要大量触发器时序逻辑电路。

11. System.h系统描述文件包含了哪些NIOS II系统的硬件信息?system.h存在NIOS II工程什么文件夹中?

答:System.h系统描述文件包含了:外设的硬件配置、外设的基地址、中断请求优先级、外设的符号名等。system.h存在NIOS II工程文件夹下的software\\music_syslib\\Debug\\system_description文件夹中。

12. 基于altera公司的SOPC系统如何实现上电自动加载程序? 答:1) 在SOPC Builder中,将CPU的Reset Vector设为cfi_flash

2) 下载硬件时,先将DE2板上液晶左边的开关扳到prog,在下载器窗口中Mode选项选择Active Serial Programing选项,然后单击Add File按钮,选择FlashTest.pof文件,勾选全部选项,点击start按钮即开始下载。下载结束后将上述开关扳回run。以后上电之后就自动将硬件加载到FPGA中,可以直接运行软件。

3) 下载软件时,选择Tool->Flash Programmer,点击Program Flash就可以将程序烧入Flash。

13. alt_main()和main()的区别是什么? 答:自动初始化和用户自定义初始化

在调用main()之前,应用程序假定运行环境和所有的服务系统都被初始化并准备运行。初始化可以被硬件抽象层(HAL)系统库自动执行。程序员不需要考虑系统的输出设备以及如何初始化每一个外设,HAL会自动初始化整个系统。 alt_main()函数提供了一个独立式的编程环境,能够完全控制系统的初始化。

26

14. 什么是C2H编译器?有什么特点?

答:C2H 是一种可以直接对ANSI C 函数定制硬件加速的技术,C2H 编译器能分析程序要加速实现的存储器接口类型,生成硬件加速器逻辑以及合适的Avalon(总线供互联架构)的主机和从机接口,达到与存储器延时的匹配。这样,分担了处理器的数据计算和存储器访问任务,使处理器能够更好的处理其他任务。

15. 如何基于HAL编写中断服务程序? 答:中断服务程序的编写和注册方法 1.HAL的ISR API

2 Nios II IDE创建系统库工程时,包含了所有需要的ISR。 用户不必去写HAL ISR,除非用户要和定制的外设通信。 HAL API定义了很多函数管理硬件中断,如: alt_irq_register() alt_irq_disable() alt_irq_enable()……

用HAL API编写用户的ISR,步骤: 1. 编写特定设备中断的ISR。

2. 调用alt_irq_register()函数来注册ISR。、

编写用户的ISR

用户编写的ISR必须符合alt_irq_register()函数的原型 void isr_name (void *context, alt_u32 id)

第一个参数:中断上下文指针(向ISR传递语境信息的指针) 第二个参数:中断号, 在system.h中声明,例如:PIO_IRQ

? 注意:编写的ISR中不能使用ANSI C标准库中I/O有关操作, 不要调用printf(),可能使系统死锁……

注册用户的ISR,向HAL层传递中断服务程序信息

alt_irq_register(alt_u32 id,void *context, void(*isr)(void *, alt_u32))

第一个参数为中断号; (alt_u32在alt_types.h定义为unsigned long) 第二个参数为中断上下文指针; 第三个参数是中断服务函数的指针。(可直接用函数名字) ? 中断发生时,系统回调用户注册的中断服务程序,传入的第一个参数即为用户调用alt_irq_register时传入的中断上下文指针参数;传入的第二个参数为本中断的中断号。

27

本文来源:https://www.bwwdw.com/article/e5o6.html

Top