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

📄 ledon.c

📁 源码完成TMS320x2407AD简单的闪灯功能
💻 C
字号:

#include  "F2407REGS.H"
#include  "ledon.h"

void inline disable() 
{
    asm(" setc INTM");
}
// 开总中断子程序
void inline enable()
{
    asm(" clrc INTM");
}

// 初始化子程序
void Initial()
{
  	asm(" setc	SXM");				// 抑制符号位扩展
	asm(" clrc	OVM");				// 累加器中结果正常溢出
	asm(" clrc	CNF");				// B0被配置为数据存储空间
	
	for(i=0;i<40;i++)
		{HmrBuff[i]=0;}
	i=0x00;
 	Uj=0;
    HmrOn=0x00;
    HmrEn=0x00;
	
	*SCSR1=0x81FE;				// CLKIN=10M,CLKOUT=2*CLKIN=20M
	*WDCR=0x0E8;				// 不使能看门狗,因为SCSR2中的WDOVERRIDE
		     					// 即WD保护位复位后的缺省值为1,故可以用
		      					// 软件禁止看门狗
	*IMR=0x0000;					// 禁止所有中断
	*IFR=0x0FFFF;					// 清除全部中断标志,"写1清0"
	//*MCRA=*MCRA&0x0FF;			// IOPB端口配置为一般的I/O功能,	TMS320LF240x的
// 端口均为8位,MCRA为16位因此控制了IOPA,和IOPB的设置
	*MCRC=*MCRC&0x093FE;            //IOPF,E设置
    *MCRA=*MCRA&0x0FFF;            //IOPA,B设置
    *MCRB=*MCRB&0x0FF7E;           // IOPC,D设置

	*PBDATDIR=*PBDATDIR|0x0F0F0;	// IOPB有关端口设置为输出方式,熄灭全部的LED灯
	*PCDATDIR=*PCDATDIR|0x8181;    // IOPC有关端口设置为输出方式
	*PFDATDIR=*PFDATDIR|0x6C6C;    // IOPF有关端口设置为输出方式
	*PBDATDIR=*PBDATDIR&0x0FFDF;   //关蜂鸣器*/
	//*IMR=0x0002;					// 允许INT2中断
	*IMR=0x0003;
	*IFR=0x0FFFF;   			// 清除全部中断标志,"写1清0"
	WSGR=0X00;					// 禁止所有的等待状态
}
void Timer1Init()
{
	*EVAIMRA=*EVAIMRA|0X0080;	// 允许定时器1的周期中断
	*EVAIFRA=*EVAIFRA&0X0080;	// 清除定时器1周期中断标志
	*T1CON=0X160C;				// Timer1为连续增计数模式,预分频值为64,使用内部时钟
	*T1PER=0X0177;		        // Timer1的周期寄存器的值根据1ms延时和预分频值确定
	*T1CNT=0X00;				// Timer1的计数器清零
}
// PWM输出初始化
void  PwmInit()
{
	*MCRC=*MCRC|0X007E;		    // IOPE1-6被配置为基本功能方式,PWM7-12
	*ACTRB=0X0666;				// PWM12,10,8 低有效,PWM11,9,7 高有效
	*DBTCONB=0X00;				// 不使能死区控制
	//*DBTCONB=0X0F54;            //PWM 9,10间有死区
	
	*T3CON=0X1000;				// 定时器3为连续增计数模式
	*T3PER=0X6000;			    // 设置定时器3的周期寄存器,
	*T3CNT=0X00;
	
	*CMPR4=0X1000;              //并设置CMPR4-6,以确定不同的输出占空比
	*CMPR5=0X3000;
	*CMPR6=0X5000;               
	*COMCONB=0X8200;			// 使能比较操作
}
// AD初始化子程序
void  ADInit()
{
   //*T4CNT=0X0000;		// T4计数器清0
   //*T4CON=0X170C;		// T4为连续增计数模式,128分频,且选用内部时钟源
   //*T4PER=0X75;			// 设置T4的周期寄存器
   //*GPTCONB=0X400;		// T4周期中断标志触发AD转换
   //*EVBIFRB=0X0FFFF;	// 清除EVB中断标志,写"1"清0
   *ADCTRL1=0X4000;     //AD复位
   asm(" NOP");
   asm(" NOP");
   *ADCTRL1=0X0010;		// 采样时间窗口预定标位ACQ PS3-ACQ PS0为0,
						// 转换时间预定标位CPS为0,AD为启动/停止模式,排
						// 序器为级连工作方式,且禁止特殊的两种工作模式
   *ADCTRL2=0X0404;		// NO可以用EVB的一个事件信号触发AD转换,
						// 且用中断模式1
   *MAXCONV=0X0F;		// 16通道
   *CHSELSEQ1=0X3210;
   *CHSELSEQ2=0X7654;
   *CHSELSEQ3=0XBA98;
   *CHSELSEQ4=0XFEDC;	// 转换通道是00-77
}
// 启动AD转换子程序(通过软件置位启动)
void  ADSOC()
{
   //*T4CON=*T4CON|0X40;	// 启动定时器4
   *ADCTRL2=*ADCTRL2|0X2000; //启动SEQ1
}

// 定时器1周期中断服务程序
void interrupt T1Int()
{
	int flag;						// 定义一个局部变量
	flag=*EVAIFRA&0X0080;
	if(flag!=0x0080)
	{
		asm(" clrc	INTM");		// 允许总中断
		return;					// 如果不是定时器1周期中断,则直接返回
	}
// 如果是定时器1周期中断定时器1的周期中断,则执行下面的程序
	*T1CNT=0X00;				// 定时器1的计数器重新赋0
	*EVAIFRA=*EVAIFRA&0X0080;	// 清除定时器1周期中断标志,否则以后的中断将被忽略
	lednum=lednum+1;
	if(lednum==1000)
		{
			leda=!leda;
			lednum=0x00;
		}
	
	asm(" clrc	INTM");			// 允许总中断,因一进中断服务程序后总中断就自动关闭了
	return;						// 中断返回
}
// 中断服务程序
void interrupt nothing( ) 
{
 	asm(" clrc	INTM");
 	return;
}
// AD中断服务子程序
void  interrupt  ADInt()
{
   asm(" clrc SXM");				// 抑制符号位扩展
   j=RESULT0;					// 取得RESULT0的地址
   for(i=0;i<=15;i++,j++)
   {
      ADRESULT[i]=*j>>6; 		// 把AD转换的结果左移6位后存入规定的数组
      cesi=ADRESULT[i];			// 检验每个A/D转换的结果
   }	
   *ADCTRL2=*ADCTRL2|0X4200;	// 复位SEQ1,且清除INT FLAG SEQ1标志写"1"清0
   //ledb=0x0FFFF;
   enable();					// 开总中断,因为一进入中断总中断就自动关闭了
}
// 主程序
void main()
{
	//int led;						 // 定义一个局部变量	
	//int i,k;						 // 定义其它一些临时变量
	//asm(" setc	INTM");				// 禁止所有中断
	//Initial( );						 // 系统初始化
	//Timer1Init();				    // 定时器1的初始化
	//PwmInit();					    // PWM输出初始化
	//asm(" clrc	INTM");				// 使能所有中断
	//*T1CON=*T1CON|0X0040;			// 启动Timer1
	
	disable();						// 禁止所有中断
	Initial();						// 系统初始化
	Timer1Init();				    // 定时器1的初始化
	PwmInit();					    // PWM输出初始化
	ADInit();						// AD初始化子程序
	//UartInit();					// UART初始化子程序,启动
	enable();						// 使能所有中断
	*T1CON=*T1CON|0X0040;			// 启动Timer1
	*T3CON=*T3CON|0x0040;		    // 启动定时器3,启动PWM
	ADSOC();

	
while(1)
{
      if(leda==0x00)
        *PFDATDIR=*PFDATDIR&0xFFF7;
      else
      	*PFDATDIR=*PFDATDIR|0x0008;
	  
/*	for(led=0x0080,i=0;i<8;led=led>>1,i++)	
		{
		*PBDATDIR=*PBDATDIR&0x0FF00; // 首先屏蔽IOPB的各位
		*PBDATDIR=*PBDATDIR|led;		// 把需要显示的值赋给IOPB端口
     // 使LED上显示IOPB端口的值
		for(k=0;k<0x0ffff;k++)
		k=k;                       		// 为了保证显示时间,给一定时间的延时
		}*/ 
	}
}


⌨️ 快捷键说明

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