📄 44blib.c
字号:
#include "..\inc\44b.h"
#include "..\inc\44blib.h"
#include "..\inc\DataType.h"
#include "..\inc\option.h"
#include <stdarg.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.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;
//***************************************************************************
/****************************************************************************
【功能说明】通用延时函数,延时time个100us
time=0: adjust the Delay function by WatchDog timer.
time>0: the number of loop time
100us resolution.
****************************************************************************/
static int delayLoopCount=400;
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)
}
}
//***************************************************************************
/****************************************************************************
【功能说明】IO端口功能、方向设定
****************************************************************************/
void Port_Init(void)
{
///****PortA 使用默认值****/ 10-bit output
//*********断口 PortB配置********/ 11-bit output
// 引脚 功能 配置值
// PortB.10 nGCS5 1
// PortB.09 nGCS4 1
// PortB.08 nGCS3 1
// PortB.07 nGCS2 1
// PortB.06 nGCS1 1
// PortB.05 OUTPUT 0
// PortB.04 OUTPUT 0
// PortB.03 nSRAS 1
// PortB.02 nSCAS 1
// PortB.01 SCLK 1
// PortB.00 SCKE 1
rPCONB = 0x000007CF;
rPDATB = 0x07EF;
//*********断口 PortC配置********/ 16-bit input/output
// 引脚 功能 配置值
// PortC.15 Input 00
// PortC.14 Input 00
// PortC.13 RxD1 11
// PortC.12 TxD1 11
// PortC.11 Output 01
// PortC.10 Output 01
// PortC.09 Output 01
// PortC.08 OutPut 01
// PortC.07 VD4 11
// PortC.06 VD5 11
// PortC.05 VD6 11
// PortC.04 VD7 11
// PortC.03 IISCLK 11
// PortC.02 IISDI 11
// PortC.01 IISDO 11
// PortC.00 IISRLCK 11
rPCONC = 0x0F55FF50;
rPDATC = 0xFFFF;
rPUPE |= 0xC000;
//*********断口 PortD配置********/ 8-bit input/output
// 引脚 功能 配置值
// PortD.07 VFRAME 10
// PortD.06 VM 10
// PortD.05 VLINE 10
// PortD.04 VCLK 10
// PortD.03 VD3 10
// PortD.02 VD2 10
// PortD.01 VD1 10
// PortD.00 VD0 10
rPCOND = 0x0000AAAA;
rPDATD = 0xFF;
//*********断口 PortE配置********/ 9-bit input/output
// 引脚 功能 配置值
// PortE.08 CODECLK 10
// PortE.07 OutPut 01 D5 LED
// PortE.06 OutPut 01 D4 LED
// PortE.05 OutPut 01 D3 LED
// PortE.04 OutPut 01 D2 LED
// PortE.03 OutPut 01 D1 LED
// PortE.02 RxD0 10
// PortE.01 TxD0 10
// PortE.00 OutPut 00
rPCONE = 0x00025568;
rPDATE = 0x1FF;
rPUPE |= 0x0FF06;
//*********断口 PortF配置********/ 9-bit input/output
// 引脚 功能 配置值
// PortF.08 SIOCLK 011
// PortF.07 SIORxD 011
// PortF.06 SIORDY 011 001 OUTPUT
// PortF.05 SIOTXD 011
// PortF.04 nXDREQ0 11
// PortF.03 nXDACK0 11
// PortF.02 nWAIT 10
// PortF.01 IICSDA 10
// PortF.00 IICSCL 10
//rPCONF = 0x001B2FEA;
rPCONF = 0x000827EA;
rPDATF = 0x1FF;
rPUPF |= 0x3; //SDA,SCL 接上拉电阻
//*********断口 PortG配置********/ 8-bit input/output
// 引脚 功能 配置值
// PortF.07 InPut 00 S4
// PortF.06 InPut 11 S3
// PortF.05 InPut 11 S2
// PortF.04 InPut 11 S1
// PortF.03 EINT3 11
// PortF.02 EINT2 11
// PortF.01 EINT1 11
// PortF.00 EINT0 11
rPCONG = 0x000000FF;
rPDATG = 0xFF;
/***** 外部中断触发模式配置 *****/
// 中断 信号 配置值
// EINT7 下降缘触发 011
// EINT6 下降缘触发 011
// EINT5 下降缘触发 011
// EINT4 下降缘触发 011
// EINT3 下降缘触发 011
// EINT2 下降缘触发 011
// EINT1 高电平触发 001
// EINT0 下降缘触发 011
rEXTINT = 0x33333313;
rSPUCR=0x7; //D15-D0 pull-up disable
rSPUCR=0x7; //D15-D0 pull-up disable
/*所有的外部硬件中断为低电平触发*/
rEXTINT=0x0;
}
//***************************************************************************
/****************************************************************************
【功能说明】选择串口通道为COM0或者COM1
****************************************************************************/
static int whichUart=0;
void Uart_Select(int ch)
{
whichUart=ch;
}
//***************************************************************************
/****************************************************************************
【功能说明】异步串行口初始化
****************************************************************************/
void Uart_Init(int mclk,int baud)
{
int i;
if(mclk==0)
mclk=MCLK;
rULCON0 = 0x03; //Normal,No parity,1 bit stop,8 bit data
rUCON0 = 0x02C5;
rUFCON0 = 0x17; // FIFO CONTROL , ENable FIFO
rUMCON0 = 0x00;
rUBRDIV0=( (int)(mclk/16./baud + 0.5) -1 );
//UART1
//rULCON1=0x7; //Normal,No parity,2 stop,8 bit
rULCON1=0x3;
rUCON1=0x245;
rUBRDIV1=( (int)(mclk/16./baud + 0.5) -1 );
for(i=0;i<100;i++);
}
//***************************************************************************
/****************************************************************************
【功能说明】等待直到串口发送缓冲区内部的数据发送完毕
****************************************************************************/
void Uart_TxEmpty(int ch)
{
if(ch==0)
while(!(rUTRSTAT0 & 0x4)); //wait until tx shifter is empty.
else
while(!(rUTRSTAT1 & 0x4)); //wait until tx shifter is empty.
}
//***************************************************************************
/****************************************************************************
【功能说明】从串口接收一个字符
****************************************************************************/
char Uart_Getch(void)
{
if(whichUart==0)
{
while(!(rUTRSTAT0 & 0x1)); //Receive data read
return RdURXH0();
}
else
{
while(!(rUTRSTAT1 & 0x1)); //Receive data ready
return rURXH1;
}
}
//***************************************************************************
/****************************************************************************
【功能说明】从串口接收一个字符,如果没有收到数据返回0
****************************************************************************/
char Uart_GetKey(void)
{
if(whichUart==0)
{
if(rUTRSTAT0 & 0x1) //Receive data ready
return RdURXH0();
else
return 0;
}
else
{
if(rUTRSTAT1 & 0x1) //Receive data ready
return rURXH1;
else
return 0;
}
}
//***************************************************************************
/****************************************************************************
【功能说明】从串口获取一个字符串
****************************************************************************/
void Uart_GetString(char *string)
{
char *string2=string;
char c;
while((c=Uart_Getch())!='\r') //输入字符不等于回车
{
if(c=='\b') //输入字符等于退格
{
if( (int)string2 < (int)string )
{
Uart_Printf("\b \b");
string--;
}
}
else
{
*string++=c;
Uart_SendByte(c);
}
}
*string='\0'; //内容为空
Uart_SendByte('\n'); //换行
}
//***************************************************************************
/****************************************************************************
【功能说明】从串口获取一个整型数
****************************************************************************/
int Uart_GetIntNum(void)
{
char str[30];
char *string=str;
int base=10;
int minus=0;
int lastIndex;
int result=0;
int i;
Uart_GetString(string);
if(string[0]=='-')
{
minus=1;
string++;
}
if(string[0]=='0' && (string[1]=='x' || string[1]=='X'))
{
base=16;
string+=2;
}
lastIndex=strlen(string)-1;
if( string[lastIndex]=='h' || string[lastIndex]=='H' )
{
base=16;
string[lastIndex]=0;
lastIndex--;
}
if(base==10)
{
result=atoi(string);
result=minus ? (-1*result):result;
}
else
{
for(i=0;i<=lastIndex;i++)
{
if(isalpha(string[i]))
{
if(isupper(string[i]))
result=(result<<4)+string[i]-'A'+10;
else
result=(result<<4)+string[i]-'a'+10;
}
else
{
result=(result<<4)+string[i]-'0';
}
}
result=minus ? (-1*result):result;
}
return result;
}
//***************************************************************************
/****************************************************************************
【功能说明】向串口发送一个字节的整型数
****************************************************************************/
void Uart_SendByte(int data)
{
if(whichUart==0)
{
if(data=='\n')
{
while(!(rUTRSTAT0 & 0x2));
// Delay(10); //because the slow response of hyper_terminal
WrUTXH0('\r');
}
while(!(rUTRSTAT0 & 0x2)); //Wait until THR is empty.
// Delay(10);
WrUTXH0(data);
}
else
{
if(data=='\n')
{
while(!(rUTRSTAT1 & 0x2));
// Delay(10); //because the slow response of hyper_terminal
rUTXH1='\r';
}
while(!(rUTRSTAT1 & 0x2)); //Wait until THR is empty.
// Delay(10);
rUTXH1=data;
}
}
//***************************************************************************
/****************************************************************************
【功能说明】向串口送出一串字符
****************************************************************************/
void Uart_SendString(char *pt)
{
while(*pt)
Uart_SendByte(*pt++);
}
//***************************************************************************
/****************************************************************************
【功能说明】以标准输出格式向串口输出各种信息
****************************************************************************/
//if you don't use vsprintf(), the code size is reduced very much.
#define MAX_TBUF 1000
static char tbuf[MAX_TBUF]= {0, };
void Uart_Printf(char *fmt,...)
{
/*
va_list ap;
char string[256];
va_start(ap,fmt);
vsprintf(string,fmt,ap);
Uart_SendString(string);
va_end(ap);
*/
va_list v_list;
char *ptr;
int i= 0;
va_start(v_list, fmt); // Initialize variable arguments.
vsprintf(tbuf, fmt, v_list );
va_end(v_list);
ptr= tbuf;
while( (*ptr) && i<MAX_TBUF) {
Uart_SendByte(*ptr);
ptr++; i++;
}//while
}
//***************************************************************************
/****************************************************************************
【功能说明】锁相环设置,修改系统主频
Fout = (8 + M_DIV) * Fin / [ (2+P_DIV) * (2^S_DIV) ]
****************************************************************************/
void ChangePllValue(int mdiv,int pdiv,int sdiv)
{
rPLLCON = (mdiv << 12) | (pdiv << 4) | sdiv;
}
//***************************************************************************
/****************************************************************************
【功能说明】申请内存空间
****************************************************************************/
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;
}
//***************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -