TS201的Flag输出状态控制LED亮灭原理和例程(含参考代码)
创始人
2024-03-25 11:12:17
0

目的:

理解FLAG可编程作为输入输出引脚,并且能够利用按键进行相应FLAG(FLAG0,FLAG1)标志的输入来相应的FLAG标志(FLAG2,FLAG3)输出来控制与之相连的LED。掌握外部中断和定时器中断的设置以及其响应过程,理解外部硬件可以直接与IRQx相连来产生外部硬件中断进行相应的处理。

任务:
1:通过改变Flag输出状态控制LED亮灭
2:通过外部中断IRQ0控制DMA传输
3:通过外部中断IRQ0控制Flag输出状态
4:利用timer0定时器中断控制Flag输出状态

1. 通过改变Flag输出状态控制LED亮灭

原理:

EZ-KIT Lite评估板上每个DSP都有4个Flag Pins,这是一种可以控制方向(input\output)的管脚。在评估板上这些管脚有2个接Button按钮,有2个接LED,他们在电路板上的分布如下图:

在这里插入图片描述

在上面图中,我已经把按键和LED灯实际名称如(如LED4,SW9)和DSP上的名称(如flag2,flag0)都对应起来,下表简单介绍了这些Flag Pins的作用:也就是说,每片DSP上的Flag0和Flag1作为按键Button输入,而Flag2和Flag3作为LED输出。

在这里插入图片描述

Flag0和Flag1作为按键:

Flag0和Flag1作为按键,当它们初始化为输入后,在没有按下时为低电平(注意中间有个反相器),而按下按键时为高电平。所以SQSTAT寄存器在按下按键时FLG0或FLG1才为1,这样可以使用判断语句来查询状态,判断是否按下。

在这里插入图片描述

Flag2和Flag3作为LED:

Flag2和Flag3作为LED,当她们初始化为输出后,FLAGREG中的FLAG2_OUT或FLAG3_OUT位,对其置位对应的LED才亮,而清零则LED熄灭。

在这里插入图片描述

Flag Pins的寄存器:
四个FLGA3-0管脚,都可配置为输入或输出,系统上电后默认是输入;
1.FLAGREG:(FLAGx_EN =0)输入,(FLAGx_EN =1)输出
2.输出时:FLAGREG中的FLAGx_OUT位,对其置位或清零
3 .输入时:SQSTAT中的FLGx位,查看状态。或者使用条件指令中的FLAGx_IN标志。

在这里插入图片描述

FLAGREG寄存器

在这里插入图片描述

SQSTAT寄存器中的FLGx位

在这里插入图片描述

调试步骤:

1)打开VisualDSP++,并新建一个工程文件,命名为”test3_1”,保存路径选择”D:\DSP\”;

2)新建C语言源程序文件,命名为” Flag.c”,并将文件添加至工程,并理解程序源代码;

3)新建或选择一个相应的调试会话Session (评估测试模式下的调试会话);

4)检查EZ-KIT板各SW设置是否正确,如下图;

在这里插入图片描述

5)用仿真器将PC与EZ-KIT板连接;

6)连接EZ-KIT板电源线,LED1(POWER)点亮、LED8(RESET)点亮,EZ-KIT板开始自动复位,复位完成后LED8熄灭,LED3点亮(USB MONITOR,注意此LED实际位置在USB上方),则表示EZ-KIT板与PC已经正常连接。

7)编译工程,在弹出的处理器选择窗口中,选择处理器A作为本次试验的处理器(即将DSP B[ID1]后面的仿真文件路径剪切到DSP A[ID0]后面的仿真文件路径框中),然后运行程序,观察实验板右下方LED的亮灭情况;

结果:
1)按照实验步骤,完成参考代码1实验,并记录实验现象;

2)按照实验步骤,理解参考代码2,并验证预期试验现象(按键控制LED在点亮和熄灭两种状态下切换);

3)修改程序代码2,使FLAG0_A对应的按键控制FLAG2_A输出(LED4)在熄灭和闪烁两种状态间切换。

参考源代码:

代码1:
#include
#include
#include
#include

#define SET_FLAG_OUT(x) __builtin_sysreg_write(__FLAGREGST, (x) );
#define CLR_FLAG_OUT(x) __builtin_sysreg_write(__FLAGREGCL, (~(x)) );

int main( void )
{
int i;
__builtin_sysreg_write(__FLAGREGST, FLAGREG_FLAG2_EN | FLAGREG_FLAG3_EN); //将FLAG2, FLAG3设为输出模式,用于LED闪烁
__builtin_sysreg_write(__FLAGREGCL, ~( FLAGREG_FLAG0_EN|FLAGREG_FLAG1_EN) ); //将FLAG0, FLAG1设为输入模式,用于按键
while(1) {
SET_FLAG_OUT(FLAGREG_FLAG2_OUT);
CLR_FLAG_OUT(FLAGREG_FLAG3_OUT);
for(i=0; i<8000000; i++);
SET_FLAG_OUT(FLAGREG_FLAG3_OUT);
CLR_FLAG_OUT(FLAGREG_FLAG2_OUT);
for(i=0; i<8000000; i++);
}
}

代码2:
#include
#include
#include
#include

#define SET_FLAG_OUT(x) __builtin_sysreg_write(__FLAGREGST, (x) );
#define CLR_FLAG_OUT(x) __builtin_sysreg_write(__FLAGREGCL, (~(x)) );

int main( void )
{
int i;
__builtin_sysreg_write(__FLAGREGST, FLAGREG_FLAG2_EN | FLAGREG_FLAG3_EN); //将FLAG2, FLAG3设为输出模式,用于LED闪烁
__builtin_sysreg_write(__FLAGREGCL, ~( FLAGREG_FLAG0_EN|FLAGREG_FLAG1_EN) ); //将FLAG0, FLAG1设为输入模式,用于按键

static int button0=0, button1=0;
static int led0=0, led1=0;
int sqstat=0;

while(1){
//如果button0按下,反转button0状态
sqstat = __builtin_sysreg_read(__SQSTAT);
if( sqstat & ( 1< for(i=0; i<800000; i++); //按键消抖延时
sqstat = __builtin_sysreg_read(__SQSTAT);
if( sqstat & ( 1< button0 = ! button0;
}

//如果button1按下,反转button1状态
sqstat = __builtin_sysreg_read(__SQSTAT);
if( sqstat & ( 2<
for(i=0; i<800000; i++); //按键消抖延时
sqstat = __builtin_sysreg_read(__SQSTAT);
if(sqstat & ( 2< button1 = ! button1;
}

//根据button0状态,点亮/熄灭LED2
if(button0 == 0){
CLR_FLAG_OUT(FLAGREG_FLAG2_OUT);

} else {
SET_FLAG_OUT(FLAGREG_FLAG2_OUT);
}

//根据button1状态,点亮/熄灭LED3
if(button1 == 0){
CLR_FLAG_OUT(FLAGREG_FLAG3_OUT);
} else {
SET_FLAG_OUT(FLAGREG_FLAG3_OUT);
}
for(i=0; i<4000000; i++);
}
}

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...