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