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

📄 hal.c

📁 ARM的串口源码
💻 C
字号:
   //*********************************************************************
   //				  VANDER  PROPRIETARY
   //		
   //		COPYRIGHT (c)   2006 BY VANDER ENGINEERING LTD.
   //              --  ALL RIGHTS RESERVED  --
   //
   //
   // File Name:	HAL.c
   // Author:		Willie Hu
   // Created:		23 Juen 06
   // Modified:
   // Revision:		2.0
   // Description:  Hardware platform interface layer
   //*********************************************************************/

#include "common.h"
#include "HAL.H"

unsigned long IntEnTemp;

unsigned char SL811Read(unsigned char a)
{  
	unsigned long nVal;
	disable_INT();
	IO0DIR = IO0DIR|(0XFF<<SL811_DATA);		//DATA口设置为输出
	IO0CLR = 0XFF<<SL811_DATA;				//写入地址
	IO0SET = a<<SL811_DATA;
	IO0CLR = (1<<SL811_CS)|(1<<A0)|(1<<SL811_WRn);			//SL811_CS=0,A0=0,WRn=0
	IO0SET = (1<<SL811_WRn)|(1<<A0);					//A0=1 ,WRn=1
	IO0CLR = 1<<SL811_RDn;						//RDn=0
	IO0DIR = IO0DIR&(~(0XFF<<SL811_DATA));  //读出数据
	nVal   = IO0PIN>>SL811_DATA;
	IO0SET = 1<<SL811_RDn;
	IO0SET = 1<<SL811_CS;						//SL811_CS = 1
	enable_INT();
	return (unsigned char) nVal;
}


void SL811Write(unsigned char a, unsigned char d)
{  
	disable_INT();
	IO0DIR = IO0DIR|(0XFF<<SL811_DATA);		//DATA口设置为输出
	IO0CLR = 0XFF<<SL811_DATA;				//写入地址
	IO0SET = a<<SL811_DATA;
	IO0CLR = (1<<SL811_CS)|(1<<A0)|(1<<SL811_WRn);			//SL811_CS=0,A0=0,WRn=0
	IO0SET = (1<<SL811_WRn)|(1<<A0);					//A0=1,WRn=1
	IO0CLR = 0XFF<<SL811_DATA;				//写入数据
	IO0SET = d<<SL811_DATA;
	IO0CLR = 1<<SL811_WRn;						//WRn=0
	IO0SET = 1<<SL811_WRn;						//WRn=1
	IO0SET = 1<<SL811_CS;						//SL811_CS=1;
	enable_INT();
}

void SL811BufRead(unsigned char addr, unsigned char *s, unsigned char c)
{	
	unsigned long i;
	disable_INT();
	IO0DIR = IO0DIR|(0XFF<<SL811_DATA);		//DATA口设置为输出
	IO0CLR = 0XFF<<SL811_DATA;				//写入地址
	IO0SET = addr<<SL811_DATA;
	IO0CLR = (1<<SL811_CS)|(1<<A0)|(1<<SL811_WRn);			//SL811_CS=0,A0=0,WRn=0
	IO0SET = (1<<SL811_WRn)|(1<<A0);					//A0=1 ,WRn=1
	IO0DIR = IO0DIR&(~(0XFF<<SL811_DATA));  //读出数据
	for(i=0;i<c;i++)
		{
			IO0CLR = 1<<SL811_RDn;				//RDn=0
			*s++ = (unsigned char)(IO0PIN>>SL811_DATA);
			IO0SET = 1<<SL811_RDn;
		}
	IO0SET = 1<<SL811_CS;					    //SL811_CS = 1
	enable_INT();
}

void SL811BufWrite(unsigned char addr, unsigned char *s, unsigned char c)
{
	disable_INT();	
	IO0DIR = IO0DIR|(0XFF<<SL811_DATA);		//DATA口设置为输出
	IO0CLR = 0XFF<<SL811_DATA;				//写入地址
	IO0SET = addr<<SL811_DATA;
	IO0CLR = (1<<SL811_CS)|(1<<A0)|(1<<SL811_WRn);			//SL811_CS=0,A0=0,WRn=0				                            
	IO0SET = (1<<SL811_WRn)|(1<<A0);					//A0=1,WRn=1
	while (c--)
		{
		 IO0CLR = 0XFF<<SL811_DATA;			//写入数据
		 IO0SET = *s++<<SL811_DATA;
		 IO0CLR = 1<<SL811_WRn;				//WRn=0
		 IO0SET = 1<<SL811_WRn;				//WRn=1	
		}
	IO0SET = 1<<SL811_CS;						//SL811_CS=1;
	enable_INT();
}

unsigned short WordSwap(unsigned short input)
{
	return(((input&0x00FF)<<8)|((input&0xFF00)>>8));
}

void DelayMs(unsigned long nFactor)
{
	unsigned long i;
	unsigned long j;

	for(i=0; i<nFactor; i++)
		{
		for(j=0;j<1000;j++)
		         j=j;
		}
}

unsigned short LSwapINT16(unsigned short dData1,unsigned short dData2)
{
    unsigned short dData;
    dData = ((dData2<<8)&0xff00)|(dData1&0x00ff);
	return dData;
}

unsigned long LSwapINT32(unsigned long dData1,unsigned long dData2,unsigned long dData3,unsigned long dData4)
{
    unsigned long dData;
    dData = ((dData4<<24)&0xff000000)|((dData3<<16)&0xff0000)|((dData2<<8)&0xff00)|(dData1&0xff);
	return dData;
}

void ComSendByte(unsigned char c)
{
	while((U0LSR&0X40)==0);		 //等待发送数据结束
	U0THR = c;					 //发送数据
}

void disable_INT(void)			//关闭IRQ和FIQ
{
  long tmp;
  __asm
  {
    MRS tmp, CPSR
    ORR tmp, tmp, #0x80		 	//置位I_Bit
    MSR CPSR_c, tmp
	ORR tmp, tmp, #0x40			//置位F_Bit
	MSR CPSR_c, tmp
  }
}

void enable_INT(void)		   //使能IRQ和FIQ
{
  long tmp;
  __asm
  {
    MRS tmp, CPSR
    BIC tmp, tmp, #0xc0			 //清除F_Bit和I_Bit
    MSR CPSR_c, tmp
  }
}

⌨️ 快捷键说明

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