Learning ADSP-TS201系列--Flag Pins按键和LED灯


原创作品,转载请注明原作者及地址!

by 飞鸿惊雪

http://blog.csdn.net/niyufeng




Learning ADSP-TS201系列--索引


1 Learning ADSP-TS201系列--重要参考

2 Learning ADSP-TS201系列--EZ-KIT Lite评估板硬件资源

3 Learning ADSP-TS201系列--Flag Pins按键和LED灯






Learning ADSP-TS201系列--Flag Pins按键和LED灯


好啦,正是开始这个《Learning ADSP-TS201》系列专题。

TS201这款DSP包含了好些硬件资源,具有突出的数据处理能力,其中的重点和难点就是DMA,Link Port以及和他们相联系的中断,还有就是多DSP的MultiProcessor!当然,和ARM外设的控制相比,这些都是小菜一碟啦~


所以,我们由易到难,先把简单的Flag Pins,Interrupt Pins,Timer,SDRAM解决掉,然后再专攻DMA,MultiProcessor,Link Port,最后在研究FLASH MEMORY,把完成的程序代码固化到Flash中然后直接Boot,而不是用仿真器下载程序。


1 电路中的Flag Pins


EZ-KIT Lite评估板上每个DSP都有4个Flag Pins,这是一种可以控制方向(input\output)的管脚。

在评估板上这些管脚有2个接Button按钮,有2个接LED,他们在电路板上的分布如下图,我也标注了DSP A和B:


Learning ADSP-TS201系列--Flag Pins按键和LED灯_第1张图片





在上面图中,我已经把按键和LED灯实际名称如(如LED4,SW9)和DSP上的名称(如flag2,flag0)都对应起来,下面这张截图简单介绍了这些Flag Pins的作用:

也就是说,每片DSP上的Flag0和Flag1作为按键Button输入,而Flag2和Flag3作为LED输出。


Learning ADSP-TS201系列--Flag Pins按键和LED灯_第2张图片


这个截图也把另两个按键SW4和SW5放上来了,呵呵,这将是下篇文章要介绍的内容啦,中断!





1.1 Flag0和Flag1作为按键


Flag0和Flag1作为按键,当她们初始化为输入后,在没有按下时为低电平(注意中间有个反相器),而按下按键时为高电平。

所以SQSTAT寄存器在按下按键时FLG0或FLG1才为1,这样可以使用判断语句来查询状态,判断是否按下。








1.2 Flag2和Flag3作为LED


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










2 Flag Pins的寄存器


四个FLGA3-0管脚,都可配置为输入或输出,系统上电后默认是输入;

1 FLAGREG:(FLAGx_EN =0)输入,(FLAGx_EN =1)输出

2 输出时:FLAGREG中的FLAGx_OUT位,对其置位或清零

3 输入时:SQSTAT中的FLGx位,查看状态。或者使用条件指令中的FLAGx_IN标志。







2.1 FLAGREG寄存器






2.2 SQSTAT寄存器中的FLGx位

Learning ADSP-TS201系列--Flag Pins按键和LED灯_第3张图片






3 编程实验


这个程序很简单,第一个实验,直接两个LED灯交替闪烁;

而第二个实验,两个LED灯根据按键Button状态进行交替闪烁,按键的状态判断也只是简单滴利用一个延时~~

程序里面有详细的注释,可以轻易的明白。

如果想用第一个实验,只要把#if 0改为#if 1即可,这样就编译的是实验一的程序而不是实验二了 :)


/*
 *
 * 用于测试Flag Pins
 * flag0,flag1连接按键,应该初始化为输入模式
 * flag2,flag3连接led灯,应该初始化为输出模式
 *
 */


#include<stdio.h>
#include<builtins.h>
#include<sysreg.h>
#include<defts201.h>


#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;
	//将FLAG2, FLAG3设为输出模式,用于LED闪烁
	__builtin_sysreg_write(__FLAGREGST, FLAGREG_FLAG2_EN | FLAGREG_FLAG3_EN);
	//将FLAG0, FLAG1设为输入模式,用于按键
	__builtin_sysreg_write(__FLAGREGCL, ~( FLAGREG_FLAG0_EN|FLAGREG_FLAG1_EN) );
	
	
#if 0	/********* 第一个实验,直接两个LED灯交替闪烁 **********/
	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++);
	}
#else

  	/********* 第二个实验,两个LED灯根据按键状态进行交替闪烁 *********/

	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<<SQSTAT_FLG_P) ){	//按下按键为高电平
			for(i=0; i<800000; i++);
			sqstat = __builtin_sysreg_read(__SQSTAT);
			if( sqstat & ( 1<<SQSTAT_FLG_P) ) button0 = ! button0;
		}
		
		//如果button1按下,反转button1状态
		sqstat = __builtin_sysreg_read(__SQSTAT);
		if( sqstat & ( 2<<SQSTAT_FLG_P) ){
			for(i=0; i<800000; i++);
			sqstat = __builtin_sysreg_read(__SQSTAT);
			if(sqstat & ( 2<<SQSTAT_FLG_P) ) 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<800000; i++);
	}
	
#endif

}



     Learning ADSP-TS201系列--Flag Pins按键和LED灯_第4张图片


在放两个图吧,虽然不是这个实验的,但是大体这么个意思。。。















你可能感兴趣的:(Learning ADSP-TS201系列--Flag Pins按键和LED灯)