⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 TMS320LF2407A DSP的捕获单元实验
💻 C
字号:
#include "lf2407regs.h"
#include "math.h"
// 该程序用于测试DSP的CAPTURE模块,由TIMER1的比较模块输出一个PWM 波形,

//或输入CAP1引脚,选择通用定时器TIMER2作为时基,待CAP1捕捉该PWM的10次上升沿后,停止捕捉,并把10
// 次捕捉值存于数组result[10]中

// 初始化子程序
int    result[10000];					// 定义一个存储结果的数组
int    k=0;						// 定义的中断次数值
// 系统初始化子程序
int  initial()
{
  	asm(" setc  INTM");			// 禁止所有中断
	asm(" setc	SXM");			// 抑制符号位扩展
	asm(" clrc	OVM");			// 累加器中结果正常溢出
	asm(" clrc	CNF");			// B0被配置为数据存储空间
	*SCSR1=0x81FE;			// CLKIN=10M,CLKOUT=4*CLKIN=40M
	*WDCR=0x0E8;				// 不使能看门狗,因为SCSR2中的WDOVERRIDE
		     					// 即WD保护位复位后的缺省值为1,故可以用
		      					// 软件禁止看门狗
	*IMR=0x0000;					//  禁止所有中断
	*IFR=0x0FFFF;			// 清除全部中断标志,"写1清0"
}
// 捕获单元1初始化子程序	
int  CAP1INT()    
{    
     *T2PER=0X07ff;				// 通用定时器2的周期寄存器为0XFFFF
	*T2CON=0X1400;				// 通用定时器2为连续增计数模式
	*T2CNT=0X00;				// 计数器清0
    	 WSGR=0x0000;				// 禁止所有等待状态
	*CAPCONA=0X2040;			// 设置捕获单元1为检测上升沿,且选择TIMER2为时钟
	asm(" clrc   INTM");			// 开总中断
	*IMR=0X08;  				// 允许中断优先级4的中断
	*EVAIMRC=*EVAIMRC|0X0001;	// 允许CAPTURE1中断  
	*EVAIFRC=*EVAIFRC|0X0FFFF;
}
// 定时器1初始化子程序,使其比较单元输出一个PWM波形
/*int  timer1int()
{
	*MCRA=*MCRA|0X1008;	// 配置IOPB4口为定时器1的比较输出
	// 配置IOPA3口为捕捉功能
	*GPTCONA=*GPTCONA|0X0042;      //使能比较输出,通用定时器1比较输出极性高有效
	*T1PER=0X1FE;				// 给定时器1的周期寄存器赋值
	*T1CON=0X1442;				// 允许TIMER1比较输出,并且TIMER1为连续增计数
// 模式,使能定时器操作  ,16分频
	*T1CNT=0X00;				// 定时器1的计数器清0
	*T1CMP=0X0FF;				// 给定时器1的比较寄存器赋值
} */
// EVA模块的PWM初始化程序
int  pwminitial()
{
	*MCRA=*MCRA|0X0fc8;			// IOPE1-6被配置为基本功能方式,PWM1-6 ,配置IOPA3口为捕捉功能
	*ACTRA=0X0666;					// PWM6,4,2 低有效,PWM5,3,1 高有效
	*DBTCONA=0X0000;					// 禁止死区
	*CMPR1=0X0010;	
	*CMPR2=0X0020;	
	*CMPR3=0X0030;	
	*T1PER=0X0040;					// 设置定时器1的周期寄存器,并设置CMPR1-3,以确定不
// 同的输出占空比
	*COMCONA=0X8200;				// 使能比较操作
	*T1CON=0X1000;					// 定时器1为连续增计数模式
}
// 主程序
main()
{
	 initial();	// 系统初始化
	 pwminitial();	//pwm初始化				
	 //timer1int();					// 定时器1初始化,使其输出一个PWM波形供捕捉
	CAP1INT();                      // 捕获单元1初始化
	*T1CON=*T1CON|0X0040;					
	*T2CON=*T2CON|0X0040; 		// 启动定时器2
while(1)
{
	if(k==10000)  break;			// k保存中断次数值,是全局变量
}
asm(" setc  INTM");			// 捕捉10次后,禁止再中断
while(1);
}
// 若是由于干扰引起其它中断,则执行此子程序         
void  interrupt INT_ALL()
{
	asm(" clrc  INTM");			// 返回前开中断
	return;
}
// 捕捉中断服务程序
void  interrupt  capint()
{
      int   flag;
      flag=*EVAIFRC&0X01;			// 判断是否是CAP1中断
      if(flag!=0x01)
      {
asm(" clrc  INTM");			// 返回前开中断
return;					// 如果不是CAP4中断,则直接返回
       }
      load();						// 如果是CAP1中断,则装载捕捉值
      *EVAIFRC=*EVAIFRC|0x01;		// 写"1"清除CAP1中断标志
	asm(" clrc  INTM");			// 返回前开中断
	return;					// 中断返回
}
// 装载捕捉值子程序
int  load()
{
result[k]=*CAP1FIFO;				// 读取捕捉值,存于相应的数组	 
k++;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -