📄 main.c
字号:
//###########################################################################
// 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 + -