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

📄 board.c.bak

📁 基于ARM7的直流电机的驱动,还有FLASH驱动,LCD驱动等
💻 BAK
字号:
#include "44b0x.h"
#include "defs.h"
#include <avt.h>
#include <avtcpu.h>
#include <string.h>

void TickHandler(void);
void URX0Handler(void);
void UTX0Handler(void);
void UndefHandler(void);
void PrefechAbortHandler(void);
void DataAbortHandler(void);
void SwiHandler(void);

void EINT0Handler(void);
void EINT1Handler(void);
void EINT2Handler(void);
void EINT3Handler(void);



#define	MCLK	60000000

// S3C44B0X定时器寄存器
#define PWM5_UPDATE			(0x1 << 25)
#define PWM5_START			(0x1 << 24)

// 串口收发缓冲区
#define	BUFSZ	1024
static UCHAR TxdBuf[BUFSZ];
static UCHAR RxdBuf[BUFSZ];

// 缓冲区读写指针
static UINT TxdR, TxdW;
static UINT RxdR, RxdW;

// 串口信号量
UINT smUart0;


// 根任务堆栈大小
UINT root_stack_size = 4096;

// iva interrupt vector address
// isa interrupt service address
void
IntConnect(UINT iva, UINT isa ) {          //功能是将中断函数注册到中断向量表。加载分支指令
    *(UINT*)iva = 0xEA000000 | ((isa - iva - 8)>>2);//矢量中断模式的指令机器码,目标地址-向量地址
}



// 串口0接收中断
void
URX0Isr(void) {
	UINT	n, ifs;
	UCHAR	t, ntf;
	
	ntf = FALSE;
	ifs = interrupts_disable();
	t = rUFSTAT0;//?TX/RX状态寄存器,初始值0X6。FIFO满16字节,[9]=1,[4:7]TXFIFO中的数据数量,[0:3]RXFIFO中的数据数量
	while(t & 0xF) { // 接收FIFO大小
		t = rURXH0;//接受到的数据?发送保持寄存器,内容
		
		// 放入接收缓冲区
		n = (RxdW + 1) & (BUFSZ - 1);//写指针下个位置和终点比较,N 为下一个写地址
		if(n != RxdR) {
			RxdBuf[RxdW] = t;
			RxdW = n;
		}
		// 需要执行v操作
		ntf = TRUE;
		t = rUFSTAT0;
	}
	if(ntf)
		sm_v(smUart0);
	interrupts_enable(ifs);
	
	rI_ISPC = BIT_URXD0;
}

// 串口0发送中断
void
UTX0Isr(void) {
	UINT	stop, ifs;
	
	ifs = interrupts_disable();
	stop = TxdR == TxdW;
	
	// 将发送缓冲区中数据填入串口FIFO
	while(!(rUFSTAT0 & 0x200) && TxdR != TxdW) {
		rUTXH0 = TxdBuf[TxdR++];
		TxdR &= BUFSZ - 1;
	}
	// 发送完成后关闭发送中断
	if(stop) {
		rINTMSK |= BIT_UTXD0;
	}
	interrupts_enable(ifs);
	rI_ISPC = BIT_UTXD0;
}

// 从串口接收一个字节
int
ReadByte(void) {
	UCHAR	c;

	// 如果接收缓冲区空,则等待
	while(RxdR == RxdW)
		sm_p(smUart0, FOREVER);
	
	c = RxdBuf[RxdR];
	RxdR = (RxdR + 1) & (BUFSZ - 1);
	return c;
}

/////////////////////////////////////////

// 从串口接收一个字节,*不等待*
UCHAR
getkey(void)
{
	if(rUTRSTAT1 & 0x1)    //Receive data ready
    	    return rURXH1;
	else
	    return 0;
}

// 发送一个字节
// data: 待发送字节数据
//
void
bsp_putc(int data)
{
	int	psw;
	
	psw = interrupts_disable();
	// 如果是\n,则再发送\r
	if(data == '\n') {
	    while(!(rUTRSTAT1 & 0x2));//发送缓冲器中不含有效数据时为0X2
	    rUTXH1 = '\r';
	}
	while(!(rUTRSTAT1 & 0x2)); //Wait until THR is empty.
	rUTXH1 = data;
	
	interrupts_enable(psw);
}

// 发送字符串
void
bsp_puts(const char *pt) {
	int	psw;

	CHECK_PTR(pt);

	psw = interrupts_disable();
	while(*pt)
		bsp_putc(*pt++);
	
	interrupts_enable(psw);
	
}

void
EINT0Isr(void) {
	UINT	ifs;
	ifs = interrupts_disable();

  		bsp_puts("EINT0中断...\n");  
  		speed++;
  		    rPDATC ^= 1;

  
	interrupts_enable(ifs);
	
	rI_ISPC = BIT_EINT0;
}

void
EINT1Isr(void) {
	UINT	ifs;
	ifs = interrupts_disable();

  		bsp_puts("EINT1中断...\n");  
  
	interrupts_enable(ifs);
	
	rI_ISPC = BIT_EINT1;
}

void
EINT2Isr(void) {
	UINT	ifs;
	ifs = interrupts_disable();

  		bsp_puts("EINT2中断...\n");  
  
	interrupts_enable(ifs);
	
	rI_ISPC = BIT_EINT2;
}

void
EINT3Isr(void) {
	UINT	ifs;
	ifs = interrupts_disable();

  		bsp_puts("EINT3中断...\n");  
  
	interrupts_enable(ifs);
	
	rI_ISPC = BIT_EINT3;
}


// 错误显示函数
void
internal_fatal(const char *msg) {
	bsp_puts(msg);
	while(1);
}

// 异常处理函数
void
DoException(uint *regs, int type) {
	char	*tstr;
	
	interrupts_disable();

	switch(type) {
	case 0:
		tstr = "未定义的指令异常!\n";
		break;
	case 1:
		tstr = "指令预取中止异常!\n";
		break;
	case 2:
		tstr = "数据访问中止异常!\n";
		break;
	case 3:
		tstr = "SWI!\n";
		break;
	default:
		tstr = "未知异常中断!";
	}
	bsp_puts(tstr);

	while(1);
}

// 串口初始化
void
bspInitSio(void) {
	
	TxdR = TxdW = 0;
	RxdR = RxdW = 0;
	rULCON0 = 0x03;      //Normal,No parity,1 bit stop,8 bit data,字长为8
    rUCON0 = 0x02C5;       //控制寄存器   5,BDMA0请求,C允许RX超时中断和错误中断,TX电平方式 
    //rUFCON0 = 0xF7;      // FIFO CONTROL  , ENable FIFO
    rUFCON0 = 0x17;      // FIFO CONTROL  , ENable FIFO
    
    rUMCON0 = 0x01;		// nRTS valid
    
    //rUBRDIV0 = MCLK / (16UL * 115200UL) - 1;
    rUBRDIV0 = MCLK / (16UL * 9600UL) - 1;//波特率分频寄存器
    
    
    rULCON1 = 0x03;      //Normal,No parity,1 bit stop,8 bit data
    rUCON1 = 0x02C5;           
    rUFCON1 = 0x17;      // FIFO CONTROL  , ENable FIFO
    rUMCON1 = 0x00;
    rUBRDIV1 = MCLK / (16UL * 115200UL) - 1;
    
    IntConnect(ISR_UTXD0, (UINT)UTX0Handler);
	IntConnect(ISR_URXD0, (UINT)URX0Handler);
	
	//rINTMSK &= ~(BIT_URXD0);
}

//10ms时钟中断函数
extern tm_tick();
void 
tick_wrapper(void) {
	// 调用操作系统时钟处理
	tm_tick();
}

//
// 初始化时钟
//
static void
bspInitClock(void) {
	rTCFG0 = (0x1 << 24) | (29 << 16); // T5 = MCLK / 30
    rTCFG1 = 0x00000000; // T5 = T5/2
    rTCON = 0x04CCCC0C; 

	//
	// 10000 -> 10ms
	//
	rTCNTB5= MCLK/(HZ * 30 * 2);
    rTCON = rTCON | PWM5_UPDATE;
    rTCON = rTCON & (~PWM5_UPDATE);
	rTCON = rTCON | PWM5_START;            //开始计数

	rINTMSK &= ~(BIT_TIMER5);
}

// 每微秒循环数
static ULONG	dlycnt;
static ULONG	factor = 0xC4BA;

// 微秒延时
void
udelay(ULONG us) {
	dlycnt = us * factor / 10000;
	while(dlycnt != 0)
		dlycnt--;
}

// 毫秒延时
void
mdelay(ULONG ms) {
	while(ms--)
		udelay(1000);
}

static 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;//端口数据寄存器
	rPCONB |= 1 << 4;

    //*********端口 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   Input          00

    //  PortC.07   VD4            11
    //  PortC.06   VD5            11
    //  PortC.05   VD6            11
    //  PortC.04   VD7            11
    //  PortC.03   IISCLK         11    01     OUTPUT
    //  PortC.02   IISDI          11    01     OUTPUT
    //  PortC.01   IISDO          11    01     OUTPUT
    //  PortC.00   IISRLCK        11    01     OUTPUT
    rPCONC = 0x0F54FF55;
    rPDATC = 0xFEFF;
    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  10  TOUT4          D5
    //  PortE.06   OutPut         01            D4
    //  PortE.05   OutPut         01            D3
    //  PortE.04   OutPut         01  10  TOUT1          D2
    //  PortE.03   OutPut         01            D1
    //  PortE.02   RxD0           10
    //  PortE.01   TxD0           10
    //  PortE.00   OutPut         00            
    rPCONE = 0x00029668;
    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;

    //*********端口 PortG配置********/  8-bit input/output
    //    引脚      功能        配置值
    //  PortG.07   IISLRCK        10
    //  PortG.06   IISDO          10
    //  PortG.05   IISDI          10
    //  PortG.04   IISCLK         10
    //  PortG.03   INPUT          00      11  --EINT3
    //  PortG.02   EINT2          11
    //  PortG.01   EINT1          11
    //  PortG.00   EINT0          11    
    rPCONG = 0xAAFF;
	rPDATG = 0x2;
	rPUPG = 0x0;

    /***** 外部中断触发模式配置 *****/
    
    // 000 低电平中断
    // 001 高电平中断
    // 01x 下降沿触发
    // 10x 上升沿触发
    // 11x 沿触发
    
    // SL811HS高电平中断输出,我们将它反向接EINT0
	rEXTINT = 0x22;		// FIXED ME!!! SL811HS/EINT0下降沿触发,MCP2510/EINT1低电平触发
    
}

//将BIN码转换成BCD码
#define Byte2Bcd(x)	__bin2bcd[x]

//将BCD码转换成BIN码
#define Bcd2Byte(x)	__bcd2bin[x];

const UCHAR __bcd2bin[] = {
	 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 0, 0, 0, 0, 0, 0,
	10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 0, 0, 0, 0, 0,
	20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0,
	30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 0, 0, 0, 0, 0, 0,
	40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 0, 0, 0, 0, 0, 0,
	50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 0, 0, 0, 0, 0, 0,
	60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 0, 0, 0, 0, 0, 0,
	70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 0, 0, 0, 0, 0, 0,
	80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 0, 0, 0, 0, 0, 0,
	90, 91, 92, 93, 94, 95, 96, 97, 98, 99
};

const UCHAR __bin2bcd[] = {
	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
	0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
	0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29,
	0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
	0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
	0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
	0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
	0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
	0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
	0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99
};

// 设置时钟时间
void
SetTime(struct tm *t) {
	int psw;
	
	CHECK_PTR(t);
	
	psw = interrupts_disable();
	rRTCCON = 0x01;    // R/W enable, 1/32768, Normal(merge), No reset
	rBCDYEAR = Byte2Bcd(t->tm_year - 2000);
    rBCDMON  = Byte2Bcd(t->tm_mon);
    rBCDDAY  = Byte2Bcd(t->tm_mday);
    //rBCDDATE = Byte2Bcd(t->tm_wday);// SUN:1 MON:2 TUE:3 WED:4 THU:5 FRI:6 SAT:7
    rBCDHOUR = Byte2Bcd(t->tm_hour);
    rBCDMIN  = Byte2Bcd(t->tm_min);
    rBCDSEC  = Byte2Bcd(t->tm_sec);
    rRTCCON = 0x00;
    interrupts_enable(psw);
}

// 读时钟时间
void
GetTime(struct tm *t) {
	int psw;
	
	CHECK_PTR(t);
	
	psw = interrupts_disable();
    rRTCCON = 0x01;    // R/W enable, 1/32768, Normal(merge), No reset
   	t->tm_year = 2000 + Bcd2Byte(rBCDYEAR);
   	t->tm_mon = Bcd2Byte(rBCDMON);
   	t->tm_mday = Bcd2Byte(rBCDDAY);
   	t->tm_wday = Bcd2Byte(rBCDDATE);
   	t->tm_hour = Bcd2Byte(rBCDHOUR);
   	t->tm_min = Bcd2Byte(rBCDMIN);
   	t->tm_sec = Bcd2Byte(rBCDSEC);
    rRTCCON = 0x00;
    interrupts_enable(psw);
}


// 初始化实时实钟
static void
bspRtcInit(void) {
	rRTCALM = 0x0;	// disable alarm
    rRTCCON = 0x00; // R/W disable(for power consumption), 1/32768, Normal(merge), No reset
}

PwmInit(void){
	
    rPDATE |= 1 << 5;     //LS2置高 
    rPDATE |= 1 << 6;     //LS1置高
    
    rPDATC |= 1;          //MC33883 GN控制置高
    
    
    
/*设置定时器的预分频值:TIME0/1=255,TIME2/3=0,TIME4/5=255*/
rTCFG0=0Xfa00fa;//参考TCFG0表
/*设置定时器的工作模式;中断模式,设置时频驱动器取值:TIME0、TIME1、TIME2、TIME3、TIME4为1/4*/
rTCFG1=0x11111;//参考TCFG1表

   rTCON=0x0;
   rTCNTB1=60;
   rTCMPB1=40;       //设置占空比
   rTCNTB4=60;
   rTCMPB4=40;       //设置占空比
   rTCON=0xa00a00;   /*手工装载定时器的计数值*/
   rTCON=0x900900;   /*启动定时器,并周期触发*/
}


// bsp初始化
void
bspInit(void) {
	//配置Cache
   	//rSYSCFG = SYSCFG_8KB;		//使用8K字节的指令缓存
   	//rNCACHBE0=((0x0c000000UL>>12)<<16)|(0x02000000UL>>12);
   	rSYSCFG = (0 << 0)	// stall disable
   		| (3 << 1)		// Full Cache enable (8KB cache)
   		| (1 << 3)		// Enable write buffer operation
   		| (0 << 4)		// read stall disable
   		| (0 << 5)		// Enable data abort
   		;

	//rSYSCFG = 0;

   	// DISABLE CACHE nGCS3(SL811HS) AND LCD VIDEORAM
	rNCACHBE0 = ((0x0C080000UL >> 12) << 16) | (0x200000UL >> 12);
	
	ChangePllValue(52, 3, 1 );	//设置CPU频率为60M
	
	Port_Init();
	
	clrwtd();
	
	// 关闭蜂鸣器
	rPCONB |= 1 << 4;

	// 设置中断向量
	IntConnect(ISR_UNDEF, (uint)UndefHandler);
	IntConnect(ISR_PABORT, (uint)PrefechAbortHandler);
	IntConnect(ISR_DABORT, (uint)DataAbortHandler);
	IntConnect(ISR_SWI,	(uint)SwiHandler);
	
	// 设置EINT0-EINT3中断向量
	IntConnect(ISR_EINT0, (uint)EINT0Handler);
	IntConnect(ISR_EINT1, (uint)EINT1Handler);
	IntConnect(ISR_EINT2, (uint)EINT2Handler);
	IntConnect(ISR_EINT3, (uint)EINT3Handler);

	
	// 设置系统时钟中断向量
	IntConnect(ISR_TIMER5, (uint)TickHandler);
	
	// 初始化系统时钟
	bspInitClock();
	
	// 初始化实时时钟
	bspRtcInit();

	// 初始化Pwm
	PwmInit();
	
	//bspInitSio();
	
	// 允许中断
	rINTMSK &= ~(BIT_GLOBAL);
	// 允许EINT0中断
	rINTMSK &= ~(BIT_EINT0);
	rINTMSK &= ~(BIT_EINT1);
	rINTMSK &= ~(BIT_EINT2);
	rINTMSK &= ~(BIT_EINT3);
	
}

⌨️ 快捷键说明

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