硬件准备
ADZS-TS201S-EZLITE:ADI TS201开发板
AD-HP560ICE:ADI DSP专用仿真器
软件准备
Visual DSP++软件
硬件链接
外部中断控制FLAG输出
原理就不讲了,前面几章都有说。
调试步骤:
1)打开VisualDSP++,并新建一个工程文件,命名为”test3_3”,保存路径选择”D:\DSP\”;
2)新建C语言源程序文件,命名为” IRQ_FLAG.c”,并将文件添加至工程,并理解程序源代码;
3)新建或选择一个相应的调试会话Session (评估测试模式下的调试会话);
4)检查EZ-KIT板各SW设置是否正确;
5)用USB将PC与EZ-KIT板连接;
6)连接EZ-KIT板电源线,LED1(POWER)点亮、LED8(RESET)点亮,EZ-KIT板开始自动复位,复位完成后LED8熄灭,LED3点亮(USB MONITOR,注意此LED实际位置在USB上方),则表示EZ-KIT板与PC已经正常连接。
7)编译工程,在弹出的处理器选择窗口中,选择处理器A作为本次试验的处理器,然后运行程序,观察按下IRQ_A按键前后,LED的亮灭情况。
参考源码
#include<stdio.h>
#include<builtins.h>
#include<sysreg.h>
#include<defts201.h>
#include<signal.h>
void isr_irq0(int dummy);
int main( void )
{
//将FLAG2设为输出模式
__builtin_sysreg_write(__FLAGREGST,FLAGREG_FLAG2_EN);
//允许外部IRQ0
int imaskh=0;
imaskh = __builtin_sysreg_read(__IMASKH);
imaskh |= (1<<INT_IRQ0_P);
__builtin_sysreg_write(__IMASKH, imaskh);
//设置IRQ0中断服务程序
interrupt(SIGIRQ0, isr_irq0);
//设置跳沿触发
__builtin_sysreg_write(__INTCTL,0);
//开全局中断使能
__builtin_sysreg_write(__SQCTLST, SQCTL_GIE);
while(1);
}
void isr_irq0(int signal)
{
static int button=0;
//按键按下进入本中断服务,每次都反转下button状态
button = !button;
if(0==button)
{
__builtin_sysreg_write(__FLAGREGCL,~FLAGREG_FLAG2_OUT);
}
else
{
__builtin_sysreg_write(__FLAGREGST,FLAGREG_FLAG2_OUT);
}
}
定时中断控制FLAG输出
原理:
TS201有两个64位的通用定时器(Timer),Timer0和Timer1,用于定时或计数,两个概念本质上是一样的。设置好Timer的初始值(计数值)并触发Timer运行,计数值会随程序运行而减少,一条指令执行周期将减少2个计数值。
当计数值降低为零时,若使能了Timer中断,将会触发Timer中断,转入相应中断服务程序运行,此时Timer会自动恢复为原来的初始值重新开始计数;若没有使能Timer中断,则程序继续运行,Timer自动恢复为原来的初始值重新开始计数。
Timer中断分为高优先级和低优先级两种,本实验使用高优先级中断。使能中断需要对相应寄存器进行设置,同时将中断服务程序首地址送入中断向量表相应的中断寄存器。这样当中断发生时,程序才会对中断进行响应,转入对应的中断服务程序运行。
有关寄存器的设置可以参照TS201数据手册。
调试步骤:
1)打开VisualDSP++,并新建一个工程文件,命名为”test3_4”,保存路径选择”D:\DSP\”;
2)新建C语言源程序文件,命名为” TIMER_FLAG.c”,并将文件添加至工程,并理解程序源代码;
3)新建或选择一个相应的调试会话Session (评估测试模式下的调试会话);
4)检查EZ-KIT板各SW设置是否正确;
5)用USB将PC与EZ-KIT板连接;
6)连接EZ-KIT板电源线,LED1(POWER)点亮、LED8(RESET)点亮,EZ-KIT板开始自动复位,复位完成后LED8熄灭,LED3点亮(USB MONITOR,注意此LED实际位置在USB上方),则表示EZ-KIT板与PC已经正常连接。
7)编译工程,在弹出的处理器选择窗口中,选择处理器A作为本次试验的处理器,然后运行程序,观察按下IRQ_A按键前后,LED的亮灭情况。
参考源码
#include <builtins.h>
#include <sysreg.h>
#include <defts201.h>
#define RWRITE(reg,value) __builtin_sysreg_write(reg,value)
#define RREAD(reg) __builtin_sysreg_read(reg)
typedef unsigned int uint;
void timer0h_isr(void); //计时器中断
void irq0_isr(void); //IRQ0
uint g_bright=0; //亮度控制
int main( void )
{
int v;
//将FLAG2设为输出模式
RWRITE(__FLAGREGST,FLAGREG_FLAG2_EN);
//设置IRQ0服务程序和计时器中断服务程序
RWRITE(__IVIRQ0,(int)irq0_isr);
RWRITE(__IVTIMER0HP,(int)timer0h_isr);
//设置跳沿触发
//RWRITE(__INTCTL,0);
//允许外部IRQ0和计时器
v=RREAD(__IMASKH);
v|=((1<<INT_IRQ0_P)|(1<<INT_TIMER0H_P));
RWRITE(__IMASKH,v);
//设置计数
RWRITE(__TMRIN0H,0);
RWRITE(__TMRIN0L,50000);
//开全局中断使能
RWRITE(__SQCTLST,SQCTL_GIE);
//启动计时器
RWRITE(__INTCTL,INTCTL_TMR0RN);
while(1);
return 0;
}
#pragma interrupt
void timer0h_isr(void)
{
static uint counter=0;
counter++;
counter&=0x0f;
if(counter>g_bright)
RWRITE(__FLAGREGCL,~FLAGREG_FLAG2_OUT);
else
RWRITE(__FLAGREGST,FLAGREG_FLAG2_OUT);
}
#pragma interrupt
void irq0_isr(void)
{
g_bright=g_bright+4;
g_bright&=0x0f;
}