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

📄 board.c

📁 基于ARM7的直流电机的驱动,还有FLASH驱动,LCD驱动等
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "44b0x.h"
#include "defs.h"
#include <avt.h>
#include <avtcpu.h>
#include <string.h>

void TickHandler(void);
void Timer1Handler(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
Timer1Isr(void){

}


// 错误显示函数
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;

⌨️ 快捷键说明

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