📄 dc.c
字号:
//###########################################################################
//
// FILE: DC.C
//
// TITLE: DSP2812 Event Manager create PWM to control a DC motor.
//
// DATE: 2007.04.20
//
// AUTHOR: ksy
//
// COMPANY: ******Technology Co.,Ltd
//
// DESCRIPTION:
//
// This program sets up the EVA timers (TIMER1) to generate
// PWM1-4 waveforms to control a DC motor
// 按键A正转;按键B反转
//###########################################################################
#include "DSP281x_Device.h" // DSP281x Headerfile Include File
#include "DSP281x_Examples.h" // DSP281x Examples Include File
#include "float.h"
#define uchar unsigned char
#define uint unsigned int
//#define GpioDataRegs.GPADAT.bit.GPIOA8 rs
//#define GpioDataRegs.GPADAT.bit.GPIOA9 rw
//#define GpioDataRegs.GPADAT.bit.GPIOA10 ep
//************************
//#define ((GpioDataRegs.GPADBT.all)&0xff00) p2
// Prototype statements for functions found within this file.
//interrupt void eva_timer1_isr(void); //怎样跳转过来的??
void init_eva(void);
void InitAdc();
void delay_loop();
// Initialize Global variables
Uint16 IntCount;
uchar dis1[] = {"0123456789abc"};
uchar dis2[] = {"iloveyoujia"};
void delay1(Uint16 ms)
{ Uint16 i,j;
for(i=0;i<ms;i++)
for(j=0;j<1000;j++){;}
}
delay(Uint16 ms)
{ // 延时子程序
Uint16 t;
while(ms--)
{
for(t = 0; t< 1000; t++)
{
asm(" NOP "); //为什么不能连续使用嵌汇编
asm(" NOP ");
asm(" NOP ");
asm(" NOP ");
}
}
}
//***********************
lcd_bz()
{
uchar result;
result=0x00; // 测试LCD忙碌状态
GpioDataRegs.GPADAT.bit.GPIOA8 = 0; //rs
GpioDataRegs.GPADAT.bit.GPIOA9= 1; //rw
GpioDataRegs.GPADAT.bit.GPIOA10 = 1; //ep
asm(" NOP ");
asm(" NOP ");
asm(" NOP ");
asm(" NOP ");
result = GpioDataRegs.GPBDAT.bit.GPIOB15;
GpioDataRegs.GPADAT.bit.GPIOA10 = 0; //ep
return result;
}
//***************************
lcd_wcmd(Uint16 cmd)
{ // 写入指令数据到LCD
while(lcd_bz());
GpioDataRegs.GPADAT.bit.GPIOA8 = 0; //rs
GpioDataRegs.GPADAT.bit.GPIOA9= 0; //rw
GpioDataRegs.GPADAT.bit.GPIOA10 = 0; //ep
asm(" NOP ");
asm(" NOP ");
(GpioDataRegs.GPADAT.all) =(cmd<<8); //右移8位
asm(" NOP ");
asm(" NOP ");
asm(" NOP ");
asm(" NOP ");
GpioDataRegs.GPADAT.bit.GPIOA10 = 1; //ep
asm(" NOP ");
asm(" NOP ");
asm(" NOP ");
asm(" NOP ");
GpioDataRegs.GPADAT.bit.GPIOA10 = 0; //ep
}
//************************************
lcd_pos(uchar pos)
{ //设定显示位置
lcd_wcmd(pos | 0x80);
}
//***********************************
lcd_wdat(Uint16 dat)
{ //写入字符显示数据到LCD
while(lcd_bz());
GpioDataRegs.GPADAT.bit.GPIOA8 = 1; //rs
GpioDataRegs.GPADAT.bit.GPIOA9= 0; //rw
GpioDataRegs.GPADAT.bit.GPIOA10 = 0; //ep
(GpioDataRegs.GPADAT.all) =(dat<<8); //右移8位
asm(" NOP ");
asm(" NOP ");
asm(" NOP ");
asm(" NOP ");
GpioDataRegs.GPADAT.bit.GPIOA10 = 1; //ep
asm(" NOP ");
asm(" NOP ");
asm(" NOP ");
asm(" NOP ");
GpioDataRegs.GPADAT.bit.GPIOA10 = 0; //ep
}
//*************************************
lcd_init()
{ //LCD初始化设定
lcd_wcmd(0x38); //
delay(1);
lcd_wcmd(0x0c); //
delay(1);
lcd_wcmd(0x06); //
delay(1);
lcd_wcmd(0x01); //清除LCD的显示内容
delay(1);
}
void main(void)
{
uchar i;
// Initialize System Control:
InitSysCtrl();
EALLOW;
SysCtrlRegs.HISPCP.all=0x03;// HSPCLK=SYSCLKOUT/2*3=150/(2*3)=25MHz(AD clock)
EDIS; //高速外围时钟定标寄存器
// Initalize GPIO:
EALLOW;
GpioMuxRegs.GPAMUX.all = 0x00FF; // EVA PWM 1-6 pins
//GpioMuxRegs.GPBMUX.bit.CAP4Q1_GPIOB8=0; // A
//GpioMuxRegs.GPBMUX.bit.CAP5Q2_GPIOB9=0; // B
GpioMuxRegs.GPBDIR.all = 0x0; // set IO pins to be input pins
EDIS;
// Disable CPU interrupts
DINT; //DINT==asm("setc INTM ")
// Initialize PIE control registers.
InitPieCtrl();
// Disable CPU interrupts and clear all CPU interrupt flags:
IER = 0x0000;
IFR = 0x0000; //只能进行逻辑操作!!
// Initialize the PIE vector table.
//*************************
InitPieVectTable(); //怎样解读?
//***************************
//EALLOW; // This is needed to write to EALLOW protected registers
// PieVectTable.T1PINT = &eva_timer1_isr; //用户自定义的中断函数,指明了中断跳转
// EDIS; // This is needed to disable write to EALLOW protected registers
//************************************
// Initialize EVA、SCI-A、ADC:
init_eva();
lcd_init(); // 初始化LCD
delay(10);
lcd_pos(00); // 设置显示位置为第一行的第5个字符
i = 0;
while(dis1[i] != '\0')
{ // 显示字符hificat.com
lcd_wdat(dis1[i]);
i++;
}
lcd_pos(0x40); // 设置显示位置为第二行第二个字符
i = 0;
while(dis2[i] != '\0')
{
lcd_wdat(dis2[i]); // 显示字符" 0571-85956028
i++;
}
for(;;){;}
}
void init_eva()
{
// Initalize EVA Timer1&Configure PWM1-PWM4
EvaRegs.T1PR = 1250; // Timer1 period=1250/25M=50us
EvaRegs.T1CNT =0; // Timer1 counter
//EvaRegs.GPTCONA.bit.T1CMPOE=1; // enable timer compare
//EvaRegs.GPTCONA.bit.T1PIN=1; // timer compare output,通用定时器1极性选择,低有效
//EvaRegs.EVAIMRA.bit.T1PINT = 1;// enable Timer1 period interrupt,通用定时器1,周期中断使能
// EvaRegs.EVAIFRA.bit.T1PINT=1; // clear Timer1 period interrupt flag
/****************************************************
TMODE = continuous up count
Input clock prescaler= X/1 (X=HSPCLK)=25MHz
Timer enable ; Timer compare enable
*****************************************************/
EvaRegs.T1CON.all = 0x1042; //P152,位6,TENABLE=1
//**********************************
// Enable compare for PWM1-PWM4
EvaRegs.CMPR1 = 1000;
EvaRegs.CMPR2 = 1000; //不明寄存器?
//***********************************
EvaRegs.ACTRA.all = 0x0F99; // PWM1,2(11):forced high; PWM3,4(00):forced low//有问题?
EvaRegs.DBTCONA.all = 0x0; // 死区1us (1/(150M/32))*5
EvaRegs.COMCONA.all = 0xA6F0; // Enable full compare 1010 0110 0000 0000
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -