📄 csp.c
字号:
/**---------------------Copyright (c)-----------------------------------------------------***
*** Author:Yan Zhangjian ***
*** jenkinyan@163.com ***
*** ***
***---------------------File Info---------------------------------------------------------***
*** 创 建 人: 颜章健 ***
*** 创建日期: 2008-03-02 ***
*** 创建版本: V1.0.0 ***
*** 文件描述: 片上外设支持包 ***
***---------------------------------------------------------------------------------------***
*** 修 订 人: ***
*** 修订日期: ***
*** 修订版本: ***
*** 修订描述 ***
***---------------------------------------------------------------------------------------**/
#include "config.h"
#include <stdarg.h>
static uint32 uart0GetDataTimeOutCnt;
/********************************************************************************************
*** 函数名称: GetKey
*** 函数描述: 读取板上按键键值
*** 入 口:
*** 出 口:
********************************************************************************************/
uint8 GetKey(uint32 delay) // delay:按键取值延时参数。任何延时下都没有抖动
{
uint8 key,i;
uint32 tmp,j;
if((IO1PIN & KEY_BUS) == KEY_BUS)
{
return 0;
}
else
{
tmp = (IO1PIN & KEY_BUS) >> 29;
key = (unsigned char) tmp | 0xf8;
if(delay != 0)
{
for(i=15; i!=0; i--)
{
while((IO1PIN & KEY_BUS) != KEY_BUS);
}
for(j=0; j<delay; j++);
}
return ( key );
}
}
void WaitKeyPop(void)
{
uint8 i;
for(i=8; i>0; i--)
{
while((IO1PIN & KEY_BUS) != KEY_BUS);
}
}
/********************************************************************************************
*** 函数名称:
*** 函数描述:
*** 入 口:
*** 出 口:
********************************************************************************************/
void Uart0Init (uint32 baud)
{
/* uint16 Fdiv;
PINSEL0 = (PINSEL0 & (~(0x03<<0 )))|(0x01<<0); //P0.00 Use UART0
PINSEL0 = (PINSEL0 & (~(0x03<<2 )))|(0x01<<2); //P0.01 Use UART0
U0LCR = 0x83; // DLAB=1,允许设置波特率
Fdiv = (Fpclk / 16) / baud; // 设置波特率
U0DLM = Fdiv / 256;
U0DLL = Fdiv % 256;
U0LCR = 0x03;
*/
uint16 fdiv;
float tout,cnt_tmp;
// UART1设备初始化
PINSEL0 = (PINSEL0 & (~(0x03<<0 )))|(0x01<<0); // P0.0 Use UART0
PINSEL0 = (PINSEL0 & (~(0x03<<2 )))|(0x01<<2); // P0.1 Use UART0
U0LCR = 0x83; // DLAB=1,允许设置波特率
fdiv = (Fpclk / 16) / baud; // 设置波特率
U0DLM = fdiv / 256;
U0DLL = fdiv % 256;
U0LCR = 0x03;
// 计算接收超时计数器数值
// 测试数据:uartGetDataTimeOut = 1579886 in 1 second (@ Fcclk = 44236800Hz)
// 超时时间,单位:微秒
tout = (float)1000000 // 以微秒为单位
* 11 // 一帧数据以11bit计算
* 20 // 5帧数据的时间内没有数据到达则认为是超时
/ baud; // 1bit 的时间
// 设置接收超时计数器数值
cnt_tmp = (float)(Fcclk / 44236800) * 1579886 * tout / 1000000;
uart0GetDataTimeOutCnt = (uint32)cnt_tmp;
}
/********************************************************************************************
*** 函数名称:
*** 函数描述:
*** 入 口:
*** 出 口:
********************************************************************************************/
/*
char Uart0GetChar (void)
{
uint8 rcv_dat;
while ((U0LSR & 0x01) == 0);
rcv_dat = U0RBR;
return (rcv_dat);
}*/
uint8 Uart0GetChar(char *dat)
{
uint32 time_out = 0;
while ((U0LSR & 0x01) == 0)
{
time_out++;
if(time_out > uart0GetDataTimeOutCnt) return 0;
}
*dat = U0RBR;
return 1;
}
/********************************************************************************************
*** 函数名称:
*** 函数描述:
*** 入 口:
*** 出 口:
********************************************************************************************/
/*
void Uart0GetStr (char *s, uint32 len)
{
while(len--)
{
*s++ = Uart0GetChar();
}
}*/
uint32 Uart0GetStr // 返回实际收到的字符数
(
char *buf, // 接收缓冲区
uint32 buf_len // 缓冲区长度
)
{
uint32 cnt = 0;
while(Uart0GetChar(buf) == 0);
cnt++;
while(buf_len--)
{
if(Uart0GetChar(++buf) == 0) break;
cnt++;
}
return cnt;
}
/********************************************************************************************
*** 函数名称:
*** 函数描述:
*** 入 口:
*** 出 口:
********************************************************************************************/
void Uart0PutChar (char dat)
{
U0THR = dat;
while ((U0LSR & 0x40) == 0); // 等待数据发送完毕
}
/********************************************************************************************
*** 函数名称:
*** 函数描述:
*** 入 口:
*** 出 口:
********************************************************************************************/
void Uart0PutStr (char *s)
{
while (*s)
{
Uart0PutChar(*s++); // 发送数据
}
}
uint8 Uart0RecvNew(void)
{
if((U0LSR & 0x01) == 0) return 0;
else return 1;
}
uint8 MemCmp(uint8 *m1,uint8 *m2, uint32 len)
{
while(len--)
{
if(*m1 != *m2) return 0;
m1++;
m2++;
}
return 1;
}
/********************************************************************************************
*** 函数名称:
*** 函数描述:
*** 入 口:
*** 出 口:
********************************************************************************************/
int Printf(const char *fmt,...)
{
int cnt;
va_list ap;
char string[256];
va_start(ap,fmt);
cnt = vsprintf(string,fmt,ap);
Uart0PutStr(string);
va_end(ap);
return cnt;
}
/********************************************************************************************
*** 文件结束 ***
********************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -