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

📄 main.c

📁 这是几个TMS320F2812应用程序举例
💻 C
📖 第 1 页 / 共 2 页
字号:
//###########################################################################
// FILE:  main.c	
// RealSYS	2003/9/16
//###########################################################################
#include "..\DSP281x_Device.h"
#include "..\def28x.h"
#include <math.h>
#include "sci.h"
#include "sin_tbl.h"

#define	ON_LED	GpioDataRegs.GPFCLEAR.bit.GPIOF14=1
#define	OFF_LED	GpioDataRegs.GPFSET.bit.GPIOF14=1
#define	T_LED	GpioDataRegs.GPFTOGGLE.bit.GPIOF14=1
#define	HI_LOAD		GpioDataRegs.GPESET.bit.GPIOE2=1
#define	LO_LOAD		GpioDataRegs.GPECLEAR.bit.GPIOE2=1

// Prototype statements for functions found within this file.
interrupt void EvaTimer1(void);
interrupt void cpu_timer0_isr(void);
extern interrupt void scia_rx_isr(void);
extern interrupt void scia_tx_isr(void);
void	key_check(void);


#define PI 				3.14159265358979
#define	ABS(x)			((x) >= 0 ? (x) : -(x))
#define	BOUND(in,lim)	(in)>(lim) ? (lim) : (in)<-(lim) ? -(lim) : (in)

#define HSPCLK			150.e6
#define ISR_FREQ		10.e3
#define	PWM_AMP			(HSPCLK/ISR_FREQ/4)
#define	MAX_AMP			(PWM_AMP-1)

#define	SIN_TABLE(pos)	sin_t[pos]
#define	PWM_FACT		(MAX_AMP/32767.)
#define	AD_MAX			0xfff
#define	DA_MAX			0xfff
#define	FREQ_MAX		60.
#define	TABLE_NUM		1024
#define	DA_FACT			((DA_MAX/2)/32767.)

float	DT=1./ISR_FREQ;
float	theta_tbl=0.;
float	table_dt=0.;
float	freq=0.;
float	k_vf=0.;

int		u, v, w;
int		uu, vv, ww;
int		table_u, table_v, table_w;
WORD	da0_val,da1_val;

void	pwm_out(void);

int	mcnt=0,t0_cnt=0,key,tmp;
int	xcnt1=0,xcnt2=0;
extern char rxd;

enum 	key_code	{SW1_CODE,SW2_CODE,SW3_CODE,SW4_CODE,SW5_CODE,SW6_CODE,SW7_CODE,SW8_CODE};
#define	KEY_MASK	0xff
#define	NOKEY_CODE	0x0f  
#define	CODE_MASK	0x0f
#define	KEY_PRESSED	0x80
#define	KEY_CONT	0x40

#define AD_START		AdcRegs.ADCTRL2.bit.SOC_SEQ1=1
#define IS_AD_BUSY		AdcRegs.ADCST.bit.SEQ1_BSY

typedef union 
	{
		WORD	w[2];
		LONG	l;
	}ltype;

BYTE	key_code=NOKEY_CODE;
BYTE	prev_key_code=NOKEY_CODE;	
int		key_count=0;
BYTE	cont_key_cnt=0;

#define	ARRAY_LEN	200
float	sv[ARRAY_LEN],cv[ARRAY_LEN];
int idx=0;

WORD	ad0;

int		enc_10ms=0,m_new=0, m_old=0, rpm=0,enc_dir;

int int0count = 0;		// Counter to track the # of level 0 interrupts
int int1count = 0;	    // Counter to track the # of level 1 interrupts

void init_gpio(void){
	EALLOW;
	GpioMuxRegs.GPAMUX.all=0x03ff;
/* GPAMUX: GPIO_A function 0=IOP,1=FUN	I(0)/O(1)
	bit15	0:	C3TRIP,PA15		;IOP		1
	bit14	0:	C2TRIP,PA14		;IOP		1
	bit13	0:	C1TRIP,PA13		;IOP		1
	bit12	0:	TCLKINA,PA12	;IOP		1
	bit11	0:	TDIRA,PA11		;IOP		1
	bit10	0:	CAP3_QEPI1,PA10	;IOP		1
	bit9	0:	CAP2_QEP2,PA9	;FUN		0
	bit8	0:	CAP1_QEP1,PA8	;FUN		0
	bit7	1:	T2PWM_T2CMP,PA7	;FUN		1
	bit6	1:	T1PWM_T1CMP,PA6	;FUN		1
	bit5	1:	PWM6,PA5		;FUN		1	
	bit4	1:	PWM5,PA4		;FUN		1	
	bit3	1:	PWM4,PA3		;FUN		1	
	bit2	1:	PWM3,PA2		;FUN		1	
	bit1	1:	PWM2,PA1		;FUN		1	
	bit0	1:	PWM1,PA0		;FUN		1
	*/
    GpioMuxRegs.GPADIR.all=0xfcff;	// PA DIR: 1=output,0=input
    GpioMuxRegs.GPAQUAL.all=0x0000;	// PA Input Qualification:
    /* 0x00=No, 0x01=SYSCLK/2, 0x02=SYSCLK/4, 0xff=SYSCLK/510 */
    
    GpioMuxRegs.GPBMUX.all=0x0040;   
/* GPBMUX: GPIO_B function 	0=IOP,1=FUN	I(0)/O(1)
	bit15	0:	C6TRIP,PB15		;IOP		1
	bit14	0:	C5TRIP,PB14		;IOP		1
	bit13	0:	C4TRIP,PB13		;IOP		1
	bit12	0:	TCLKINB,PB12	;IOP		1
	bit11	0:	TDIRB,PB11		;IOP		1
	bit10	0:	CAP6_QEPI2,PB10	;IOP		1
	bit9	0:	CAP5_QEP4,PB9	;IOP		1
	bit8	0:	CAP4_QEP3,PB8	;IOP		1
	bit7	0:	T4PWM_T4CMP,PB7	;IOP		1
	bit6	1:	T3PWM_T3CMP,PB6	;FUN		1
	bit5	0:	PWM12,PB5		;IOP		1	
	bit4	0:	PWM11,PB4		;IOP		1	
	bit3	0:	PWM10,PB3		;IOP		1	
	bit2	0:	PWM9,PB2		;IOP		1	
	bit1	0:	PWM8,PB1		;IOP		1	
	bit0	0:	PWM7,PB0		;IOP		1
	*/
    GpioMuxRegs.GPBDIR.all=0xffff;	// PB DIR: 1=output,0=input
    GpioMuxRegs.GPAQUAL.all=0x0000;	// PB Input Qualification:
    /* 0x00=No, 0x01=SYSCLK/2, 0x02=SYSCLK/4, 0xff=SYSCLK/510 */
  
    GpioMuxRegs.GPDMUX.all=0x0021;
/* GPDMUX: GPIO_D function 0=IOP,1=FUN
	bit6	0:	T4CTRIP,PD6			;IOP
	bit5	1:	T3CTRIP_PDPINTB,PD5	;FUN
	bit4	0:	res
	bit3	0:	res
	bit2	0:	res
	bit1	0:	T2CTRIP,PD1			;IOP		
	bit0	1:	T1CTRIP_PDPINTA,PD0	;FUN
	*/
    GpioMuxRegs.GPDDIR.all=0x5e;	// DIR: 1=output,0=input
	//	6(PD6),5(PDPINTB),4,3,2,1(PD1),0(PDPINTA)
	//     1       0      1 1 1    1       0	= 0x5e
    GpioMuxRegs.GPDQUAL.all=0x0000;	// PD Input Qualification:
    /* 0x00=No, 0x01=SYSCLK/2, 0x02=SYSCLK/4, 0xff=SYSCLK/510 */
	
    GpioMuxRegs.GPEMUX.all=0x0003; 	
/* GPEMUX: GPIO_E function 0=IOP,1=FUN		I(0)/O(1)
	bit2	0:	XNMI_XINT13,PE2		;IOP		1
	bit1	1:	XINT2_ADCSOC,PE1	;FUN		0	
	bit0	1:	XINT1_XBIO,PE0		;FUN		0
	*/
    GpioMuxRegs.GPEDIR.all=0x04;	// DIR: 1=output,0=input
    GpioMuxRegs.GPEQUAL.all=0x0002;	// PE Input Qualification:
    /* 0x00=No, 0x01=SYSCLK/2, 0x02=SYSCLK/4, 0xff=SYSCLK/510 */

    GpioMuxRegs.GPFMUX.all=0x00ff;		 
/* GPFMUX: GPIO_F function 0=IOP,1=FUN		I(0)/O(1)
	bit14	0:	XF,PF14			;IOP			1(CPU_LED)
	bit13	0:	MDR,PF13		;IOP			1
	bit12	0:	MDX,PF12		;IOP			1
	
	bit11	0:	MFSR,PF11		;IOP			1
	bit10	0:	MFSX,PF10		;IOP			1
	bit9	0:	MCLKR,PF9		;IOP			1
	bit8	0:	MCLKX,PF8		;IOP			1
	
	bit7	1:	CANRX,PF7		;FUN			0
	bit6	1:	CANTX,PF6		;FUN			1
	bit5	1:	SCIRXDA,PF5		;FUN			0
	bit4	1:	SCITXDA,PF4		;FUN			1
	
	bit3	1:	SPISTE,PF3		;FUN			1
	bit2	1:	SPICLK,PF2		;FUN			1
	bit1	1:	SPISOMI,PF1		;FUN			1
	bit0	1:	SPISIMO,PF0		;FUN			1
	*/
    GpioMuxRegs.GPFDIR.all=0xff5f;	// DIR: 1=output,0=input

    GpioMuxRegs.GPGMUX.all=0x0030;
/* GPGMUX: GPIO_G function 0=IOP,1=FUN
	bit5	1:	SCIRXDB,PG5		;FUN
	bit4	1:	SCITXDB,PG4		;FUN		
	*/
    GpioMuxRegs.GPGDIR.all=0x10;	// DIR: 1=output,0=input
	//	5(RXDB),4(TXDB),3,2,1,0
	//     0       1    0 0 0 0	= 0x10
	
	EDIS; 
}

void	dac_out(WORD ch,WORD dat){
	while(SpiaRegs.SPISTS.bit.BUFFULL_FLAG);	// wait if TX_BUF_FULL
	
	if(ch&1) SpiaRegs.SPITXBUF = (0x3000 | (dat & 0xfff))<<2;	// DAC_B
	else	 SpiaRegs.SPITXBUF = (0x2000 | (dat & 0xfff))<<2;	// DAC_A

	while(!SpiaRegs.SPISTS.bit.INT_FLAG);
	
	LO_LOAD;
	tmp = SpiaRegs.SPIRXBUF;
	HI_LOAD;
}

interrupt void cpu_timer0_isr(void){
	t0_cnt++;
/*
	if(++idx >= ARRAY_LEN) idx = 0;
	sv[idx] = sin(2*PI*idx/(ARRAY_LEN-1)) * 2047 + 2048;
	cv[idx] = cos(2*PI*idx/(ARRAY_LEN-1)) * 2047 + 2048;
	
	dac_out(0,ad0);				// DAC0: VR data out
	dac_out(1,sv[idx]);		// DAC1: sin
*/
	if((t0_cnt % 10) == 0){
		key_check();	// 10 msec interval key check

		m_new = EvaRegs.T2CNT;
		enc_10ms = m_new - m_old;
		m_old = m_new;
			
		rpm = (int)(enc_10ms * (3./2.));	// 1000 pulse * 4 = 4000, 1 min= 60000 msec
		rpm = ABS(rpm);
		enc_dir = EvaRegs.GPTCONA.bit.T2STAT;	// get T2STAT(0=down,1=up)
	}
	// Acknowledge this interrupt to recieve more interrupts from group 1
	PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;	
}

interrupt void xint1_isr(void){
	xcnt1++;
	
	// Acknowledge this interrupt to recieve more interrupts from group 1
	PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;	
}
interrupt void xint2_isr(void){
	xcnt2++;

	// Acknowledge this interrupt to recieve more interrupts from group 1
	PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;	
}

void	key_check(void){     
BYTE	tmp_key_code;
BYTE	key; 
	key = IN_KEY & KEY_MASK;
	if(key == KEY_MASK){
		prev_key_code = key_code = NOKEY_CODE;
		return;
	}
	if((key & BIT0) == 0)		tmp_key_code = SW1_CODE;
	else if((key & BIT1) == 0)	tmp_key_code = SW2_CODE;
	else if((key & BIT2) == 0)	tmp_key_code = SW3_CODE;
	else if((key & BIT3) == 0)	tmp_key_code = SW4_CODE;
	else if((key & BIT4) == 0)	tmp_key_code = SW5_CODE;
	else if((key & BIT5) == 0)	tmp_key_code = SW6_CODE;
	else if((key & BIT6) == 0)	tmp_key_code = SW7_CODE;
	else if((key & BIT7) == 0)	tmp_key_code = SW8_CODE;
		
	if(tmp_key_code != (prev_key_code & CODE_MASK)){
		prev_key_code = tmp_key_code;
		key_code = KEY_PRESSED | tmp_key_code;
		key_count = 0;
	}	            
	else{
		if(key_count < 100) key_count++;
		else key_code |= KEY_CONT;
	}            
}

void	key_process(){		
	lcd_gotoxy(14,0);
	switch(key_code & CODE_MASK){
		case SW1_CODE :
			break;
		case SW2_CODE :
			break;
		case SW3_CODE :
			break;

⌨️ 快捷键说明

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