DEMO的程序和电路可以在trinamic的官网上下载到,下载完成后,发现电路MCU为AT91SAM7XC512_256_128.pdf芯片,32位ARM!!
#define MIN(a,b) (a
#define MAX(a,b) (a>b) ? (a) : (b)
中间宏定义部分省略,需要的话可以下载附件看看。
下面的函数为使能和去使能中断,在源程序里面都没有找到,估计整套程序没有用到这两个函数。
extern void AT91F_DisableInterrupts(void);
extern void AT91F_EnableInterrupts(void);
#endif
下面是主函数:
Projekt: TMC26x_main.c
包含的一系列头文件这里不再写了
下面几个C语言的关键字:
Volatile定义一个随时可能改变的变量
Extern:遇到这个参数的时候,不一定就在这个文件定义,也可能在其他文件中定义
Const:定义的是一个常量,不能变化
//Globale Variablen
volatile int Dummy; //f黵 Dummy-Reads bestimmter I/O-Register
extern volatile UINT ActualAcceleration;
extern volatile int TargetVelocity;
const char *VersionString="262V1.02";
之后主函数里面有两个函数,一个为初始化IO,另外一个为main()函数。
void InitIO(void)
{
RESET_WATCHDOG();
先复位看门狗:
如下定义:
#define RESET_WATCHDOG() AT91C_BASE_WDTC->WDTC_WDCR=(0xA5 << 24)|AT91C_WDTC_WDRSTT
后面的函数如下:
AT91C_BASE_WDTC是一个基址,这里设置了看门狗的三个寄存器,控制,状态,模式寄存器。给控制寄存器赋什么值呢?
AT91C_WDTC_WDRSTT:定义为((unsigned int) 0x1 << 0)相当于把最后一位赋值1.
下面初始化IO的值,因为主芯片是32位,定义方式为,基址开始,有一系列的寄存器,每一个寄存器都有32位,需要配置一个32位的值。比如AT91C_BASE_PIOB->PIO_PDR=BIT22;相当于IO方向去使能寄存器设置为0X00400000.
所有ARM芯片的寄存器在头文件定义中,将有一个简单的描述。
WDTC_WDCR基址后面的
AT91C_BASE_PIOB->PIO_PDR=BIT22;
AT91C_BASE_PIOB->PIO_BSR=BIT22;
AT91C_BASE_PMC->PMC_SCER=AT91C_PMC_PCK2;
AT91C_BASE_PMC->PMC_PCKR[2]=AT91C_PMC_PRES_CLK|AT91C_PMC_CSS_MAIN_CLK;
下面介绍主函数:
int main(void)
{
先定义了主函数的变量
UINT BlinkDelay;
UINT i;
UINT Count1;
UINT Count2;
UINT DemoMode;
然后初始化接口,包括上文定义的IO口。
这里只看一下SPI,先看一下SPI有哪些常用寄存器,定义在ARM头文件中。
里面有一个PERIPHERAL ID DEFINITIONS FOR AT91SAM7XC256段,定义了相关的外设寄存器一共32个,其中20~29是保留的。SPI有两个:
#define AT91C_ID_SPI0 ((unsigned int) 4) // Serial Peripheral Interface 0
#define AT91C_ID_SPI1 ((unsigned int) 5) // Serial Peripheral Interface 1
初始化函数如下:
AT91C_BASE_PMC->PMC_PCER=1 << AT91C_ID_SPI0;
时钟初始化
然后是IO端口输出使能,SPI复位和模式,比特率设置等。SPI的通信函数在后面的日志再分析。
//Initialisierung
InitIO();
InitSPI();
InitUART(7);
InitUSB();
InitSysTimer();
InitStepDirIrq();
//Pr黤en, ob die Pins RxD und TxD der RS232-Schnittstelle miteinander verbunden sind.
//Wenn ja: Zur點ksetzen des Moduls auf Werkseinstellungen.
Count1=Count2=0;
for(i=0; i<10; i++)
{
AT91C_BASE_PIOA->PIO_CODR=BIT28;
for(Dummy=0; Dummy<1000; Dummy++);
if(!(AT91C_BASE_PIOA->PIO_PDSR & BIT27)) Count1++;
AT91C_BASE_PIOA->PIO_SODR=BIT28;
for(Dummy=0; Dummy<1000; Dummy++);
if((AT91C_BASE_PIOA->PIO_PDSR & BIT27)) Count2++;
}
if(Count1==10 && Count2==10)
DemoMode=TRUE;
else
DemoMode=FALSE;
上面的这个循环不看了……
初始化驱动器:
InitMotorDrivers();
设置寄存器
然后等待进程命令,并且点亮指示灯。
if(DemoMode)
{
Set262StepDirInterpolation(0, 1);
Set262StepDirMStepRes(0, 4);
Set262SmartEnergyIMin(0, 1);
Set262SmartEnergyDownStep(0, 2);
Set262SmartEnergyStallLevelMax(0, 2);
Set262SmartEnergyUpStep(0, 0);
Set262SmartEnergyStallLevelMin(0, 1);
Set262StallGuardFilter(0, 1);
ActivateStepDir();
ActualAcceleration=10000;
TargetVelocity=10000;
}
BlinkDelay=0;
//Hauptschleife
for(;;)
{
RESET_WATCHDOG();
ProcessCommands();
//Blinken der LED
if(abs(GetSysTimer()-BlinkDelay)>5000)
{
if(LED_STATE())
LED_OFF();
else
LED_ON();
BlinkDelay=GetSysTimer();
}
}
return 0;
}
)>
文章评论(0条评论)
登录后参与讨论