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

📄 44blib.c

📁 基于mcx314的运动控制
💻 C
📖 第 1 页 / 共 2 页
字号:

//***************************************************************************

#include <stdarg.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>

#include "44b.h"
#include "44blib.h"
#include "def.h"
#include "option.h"

#define STACKSIZE    0xa00 //SVC satck size(do not use user stack)
#define HEAPEND     (_ISR_STARTADDRESS-STACKSIZE-0x500) // = 0xc7ff000
	//SVC Stack Area:0xc(e)7ff000-0xc(e)7ffaff

extern char Image$$RW$$Limit[];

void *mallocPt=Image$$RW$$Limit;

//int MCLK = MCLK_D;
int MCLK_Var = MCLK;

//***************************************************************************

/****************************************************************************
【功能说明】通用延时函数,延时time个100us
time=0: adjust the Delay function by WatchDog timer.
time>0: the number of loop time
100us resolution.
****************************************************************************/
static int delayLoopCount=133;
void Delay(int time)
{
    int i,adjust=0;

    if(time==0)
    {
		time=200;
		adjust=1;
		delayLoopCount=400;
		rWTCON=((MCLK/1000000-1)<<8)|(2<<3);    //MCLK/1M,Watch-dog disable,1/64,interrupt disable,reset disable
		rWTDAT=0xffff;//for first update
		rWTCNT=0xffff;//resolution=64us	@any MCLK 
		rWTCON=((MCLK/1000000-1)<<8)|(2<<3)|(1<<5); //Watch-dog timer start
    }

    for(;time>0;time--)

	for(i=0;i<delayLoopCount;i++);

    if(adjust==1)
    {
		rWTCON=((MCLK/1000000-1)<<8)|(2<<3);//Watch-dog timer stop
		i=0xffff-rWTCNT;		//1count->64us, 200*400 cycle runtime = 64*i us
		delayLoopCount=8000000/(i*64);	//200*400:64*i=1*x:100 -> x=80000*100/(64*i)   
    }
}
//***************************************************************************


//***************************************************************************

/****************************************************************************
【功能说明】蜂鸣器鸣叫time个100us
****************************************************************************/
void Beep(unsigned int time)
{
	rPDATE = (rPDATE | 0x08);
	Delay(time);		//延时若干个100us
	rPDATE = (rPDATE & 0x1f7);
}
//***************************************************************************

/****************************************************************************
【功能说明】检测四个按键,有任何一个按键按下就让蜂鸣器鸣叫,否则不鸣叫
****************************************************************************/
void Key_Speaker(void)
{
	unsigned int m;
	m = rPDATG;
	if((m & 0xf8) < 0xf8)	{rPDATE = (rPDATE | 0x08);}
	else	{rPDATE = (rPDATE & 0x1f7);}
}
//***************************************************************************

/****************************************************************************
【功能说明】四个LED 点亮/熄灭状态设置(LedStatus低四位电平高低对应着四个LED亮/熄)
****************************************************************************/
void Led_Set(int LedStatus)
{
	if((LedStatus&0x01)==0x01)		//PE7状态设置
		rPDATE=rPDATE&0x17f;
	else
		rPDATE=rPDATE|0x80;
	
	if((LedStatus&0x02)==0x02)		//PE6状态设置
		rPDATE=rPDATE&0x1bf;
	else
		rPDATE=rPDATE|0x40;

	if((LedStatus&0x04)==0x04)		//PE5状态设置
		rPDATE=rPDATE&0x1df;
	else
		rPDATE=rPDATE|0x20;

	if((LedStatus&0x08)==0x08)		//PE4状态设置
		rPDATE=rPDATE&0x1ef;
	else
		rPDATE=rPDATE|0x10;
}
//***************************************************************************

/****************************************************************************
【功能说明】LED来回闪烁显示 
****************************************************************************/
void Led_Disp(void)
{
	rPDATE = (rPDATE | 0x08);		//蜂鸣器开始鸣叫
	Led_Set(0x08);		//LED点亮/熄灭状态设置
	Delay(400);		//延时若干个100us
	Led_Set(0x04);		//LED点亮/熄灭状态设置
	Delay(400);		//延时若干个100us
	Led_Set(0x02);		//LED点亮/熄灭状态设置
	Delay(400);		//延时若干个100us
	Led_Set(0x01);		//LED点亮/熄灭状态设置
	Delay(400);		//延时若干个100us
	Led_Set(0x02);		//LED点亮/熄灭状态设置
	Delay(400);		//延时若干个100us
	Led_Set(0x04);		//LED点亮/熄灭状态设置
	Delay(400);		//延时若干个100us
	Led_Set(0x08);		//LED点亮/熄灭状态设置
	Delay(400);		//延时若干个100us
	Led_Set(0x00);		//LED点亮/熄灭状态设置
	rPDATE = (rPDATE & 0x1f7);		//蜂鸣器停止鸣叫
}
//***************************************************************************

/****************************************************************************
【功能说明】定时器启动
****************************************************************************/
void Timer_Start(int divider)  //0:16us,1:32us 2:64us 3:128us
{
    rWTCON=((MCLK/1000000-1)<<8)|(divider<<3);
    rWTDAT=0xffff;
    rWTCNT=0xffff;   

    // 1/16/(65+1),nRESET & interrupt  disable
    rWTCON=((MCLK/1000000-1)<<8)|(divider<<3)|(1<<5);	
}
//***************************************************************************

/****************************************************************************
【功能说明】定时器停止
****************************************************************************/
int Timer_Stop(void)
{
//    int i;
    rWTCON=((MCLK/1000000-1)<<8);
    return (0xffff-rWTCNT);
}
//***************************************************************************

/****************************************************************************
【功能说明】锁相环设置,修改系统主频
Fout = (8 + M_DIV) * Fin / [ (2+P_DIV) * (2^S_DIV) ]
****************************************************************************/
void ChangePllValue(int mdiv,int pdiv,int sdiv)
{
	int i = 1;	
	
    rPLLCON = (mdiv << 12) | (pdiv << 4) | sdiv;

	while(sdiv--)
		i *= 2;	
	
	MCLK_Var = (EXT_OSC_CLK*(mdiv+8))/((pdiv+2)*i);		
}
//***************************************************************************

/****************************************************************************
【功能说明】
****************************************************************************/
void * malloc(unsigned nbyte) 
/*Very simple; Use malloc() & free() like Stack*/
//void *mallocPt=Image$$RW$$Limit;
{
    void *returnPt=mallocPt;

    mallocPt= (int *)mallocPt+nbyte/4+((nbyte%4)>0); //to align 4byte

    if( (int)mallocPt > HEAPEND )
    {
	mallocPt=returnPt;
	return NULL;
    }
    return returnPt;
}
//***************************************************************************

/****************************************************************************
【功能说明】
****************************************************************************/
void free(void *pt)
{
    mallocPt=pt;
}
//***************************************************************************

/****************************************************************************
【功能说明】
****************************************************************************/
void Cache_Flush(void)
{
    int i,saveSyscfg;
    
    saveSyscfg=rSYSCFG;

    rSYSCFG=SYSCFG_0KB; 		      
    for(i=0x10004000;i<0x10004800;i+=16)    
    {					   
	*((int *)i)=0x0;		   
    }
    rSYSCFG=saveSyscfg; 			    
}
//***************************************************************************


/*  Fout = (8 + M_DIV) * Fin / [ (2+P_DIV) * (2^S_DIV) ]  */
void SetPLL(int mdiv,int pdiv,int sdiv)
{
  rPLLCON = (mdiv << 12) | (pdiv << 4) | sdiv;
}


/************************* PORTS ****************************/
void Port_Init(void)
{
    //SMDK41100 B/D Status
    //LED D5  D6
    //    PB9 PB10
    //S/W S4  S5
    //    PG5 PG4

    //CAUTION:Follow the configuration order for setting the ports.
    // 1) setting value
    // 2) setting control register
    // 3) configure pull-up resistor.

    //16bit data bus configuration

⌨️ 快捷键说明

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