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

📄 bsp.c

📁 AT91RM9200-UC/OS-II,clock,irq,usart,pio等驱动
💻 C
字号:
/*
*********************************************************************************************************
*                                                Logic PD
*                                         Board Support Package
*                                          LH79520 Card Engine
*
*                             (c) Copyright 2004, Micrium, Inc., Weston, FL
*                                          All Rights Reserved
*
*
* File         : BSP.C
* Originally by: Jean J. Labrosse
*********************************************************************************************************
*/

#include "includes.h"
#include "interrupt.h"
#include "serial.h"
#include "timer.h"

/*
*********************************************************************************************************
*                                           IRQ ISR HANDLER
*
* Description : This function is called by OS_CPU_IRQ_ISR() to determine the source of the interrupt
*               and process it accordingly.
*
* Arguments   : none
*********************************************************************************************************
*/
/*******************************************************************************
* 名称:OS_CPU_IRQ_ISR_Handler()
* 功能:IRQ中断处理程序
* 入口参数:无
* 出口参数:无
* 说明:从中断状态寄存器中读出中断源,以该中断源为索引从中断处理程序列表中读出
*		相应的中断处理程序及产生该中断的外设基地址,如果相应的处理程序不为空,
*		则以该外设基地址为参数执行该中断处理程序
*******************************************************************************/
void  OS_CPU_IRQ_ISR_Handler (void)
{
    PFNCT2  pfnct;
	int vector,base_reg;
	
    pfnct = (PFNCT2)(AT91C_BASE_AIC->AIC_IVR);   				//读产生中断的中断源的处理程序地址并清相应的中断标志          
    															/* Read the interrupt vector from the VIC               */
    vector = (AT91C_BASE_AIC->AIC_ISR);							//读出产生中断的中断源序号
    base_reg = interrupt_handling_table[vector].base_reg;		//产生中断的外设基地址
    pfnct = interrupt_handling_table[vector].interrupt_handling;//对应中断处理程序
    
    if(vector == 1)
    	vector = 1;
    if (pfnct != (PFNCT1)0) {                    				/* Make sure we don't have a NULL pointer               */
        (*pfnct)(base_reg,vector);          							/* Execute the ISR for the interrupting device          */
    }
	AT91C_BASE_AIC->AIC_EOICR = 1;								//告知CPU中断处理结束
}

/*
*********************************************************************************************************
*                                           FIQ ISR HANDLER
*
* Description : This function is called by OS_CPU_FIQ_ISR() to determine the source of the interrupt
*               and process it accordingly.
*
* Arguments   : none
*********************************************************************************************************
*/

void  OS_CPU_FIQ_ISR_Handler (void)
{
    PFNCT  pfnct;
#if 1   
    pfnct = (PFNCT)AT91C_BASE_AIC->AIC_FVR;             /* Read the interrupt vector from the VIC               */
    if (pfnct != (PFNCT)0) {                    /* Make sure we don't have a NULL pointer               */
        (*pfnct)();                             /* Execute the ISR for the interrupting device          */
    }
#else    
    pfnct = (PFNCT)(AT91C_BASE_AIC->AIC_FVR);             /* Read the interrupt vector from the VIC               */
    while (pfnct != (PFNCT)0) {                 /* Make sure we don't have a NULL pointer               */
      (*pfnct)();                               /* Execute the ISR for the interrupting device          */
        pfnct = (PFNCT)VIC->vectoraddr;         /* Read the interrupt vector from the VIC               */
    }
#endif 
}


void AT91F_DBGU_Printk(char *buffer) 
{
	while(*buffer != '\0') {
		while (!AT91F_US_TxReady((AT91PS_USART)AT91C_BASE_DBGU));
		AT91F_US_PutChar((AT91PS_USART)AT91C_BASE_DBGU, *buffer++);
	}
}


extern void Reset(void);
/*******************************************************************************
* 名称:Undef_Abort()
* 功能:未定义指令异常处理函数
* 入口参数:无
* 出口参数:无
* 说明:现在只是提示产生未定义异常,然后复位
*******************************************************************************/
void Undef_Abort(void)
{
	//UartPrintf(0,"\n\rUndef_Abort!!!!");
	AT91F_DBGU_Printk("\n\rUndef_Abort!!!!");
	Reset();
}

/*******************************************************************************
* 名称:Swi_Abort()
* 功能:Swi指令异常处理函数
* 入口参数:无
* 出口参数:无
* 说明:现在只是提示产生Swi异常,然后复位
*******************************************************************************/
void Swi_Abort(void)
{
	//UartPrintf(0,"\n\rSwi_Abort!!!!");
	AT91F_DBGU_Printk("\n\rSwi_Abort!!!!");
	Reset();	
}

/*******************************************************************************
* 名称:Prefetch_Abort()
* 功能:预取指令异常处理函数
* 入口参数:无
* 出口参数:无
* 说明:现在只是提示产生预取指令异常,然后复位
*******************************************************************************/
void Prefetch_Abort(void)
{
	//UartPrintf(0,"\n\rPrefetch_Abort!!!!");
	AT91F_DBGU_Printk("\n\rPrefetch_Abort!!!!");
	Reset();		
}

/*******************************************************************************
* 名称:Data_Abort()
* 功能:数据访问中止异常处理函数
* 入口参数:无
* 出口参数:无
* 说明:现在只是提示产生数据访问中止异常,然后复位
*******************************************************************************/
void Data_Abort(void)
{
	//UartPrintf(0,"\n\rData_Abort!!!!");
	AT91F_DBGU_Printk("\n\rData_Abort!!!!");
	Reset();		
}

/*******************************************************************************
* 名称:Reserved_Abort()
* 功能:数据访问中止异常处理函数
* 入口参数:无
* 出口参数:无
* 说明:现在只是提示产生数据访问中止异常,然后复位
*******************************************************************************/
void Reserved_Abort(void)
{
	//UartPrintf(0,"\n\rReserved_Abort!!!!");
	AT91F_DBGU_Printk("\n\rReserved_Abort!!!!");
	Reset();			
}


/*******************************************************************************
* 名称:SetDubegUart()
* 功能:初始化调试串口
* 入口参数:无
* 出口参数:无
* 说明:
*******************************************************************************/
void InitDubegUart(void)
{
	AT91_CHAN chan = INIT_UART;	
	
	//设置测试串口属性		
	chan.Id = AT91C_ID_SYS;
	
	//初始化测试串口
	//jgh 2007-6-1
	//----此刻系统还没对bss段进行初始化,因此在该函数中对
	//----UART_CHAN[0]的初始化设置会被毁掉,但该串口已经可
	//----用啦,因为这些设置已经设置到串口的寄存器中啦,但
	//----UART_CHAN[0]中该函数临时设置的数据被毁掉啦,原有
	//----的数据保持不变,因此如果在应用程序中用到该串口的
	//----属性参数,建议应用程序启动后重新设置
	//----该函数也对中断函数处理列表interrupt_handling_table[1]
	//----进行了设置,但下面对bss的初始化会毁掉interrupt_handling_table[1]
	//----中的数据,因此如果在应用程序中用到该串口的中断功能,
	//----建议在应用程序启动后重新设置
	SerialInit(chan);
}


#define TEST_ADDR 0x00000008			//内部RAM测试地址
#define VECTOR_DEST_ADDR 0x00000000		//内部地址0,用于放置中断向量
#define VECTOR_SRC_ADDR  0x20000000		//外部SDRAM基地址,前面64字节为中断向量

/*******************************************************************************
* 名称:LowLevelInit()
* 功能:CPU初步初始化
* 入口参数:无
* 出口参数:无
* 说明:关闭所有中断,把内部RAM重映射到地址0处,把应用程序的中断向量复制到该位置
		处,打开测试串口,显示提示信息
*******************************************************************************/
void LowLevelInit()
{
	int i,TestData;
	
	
	//清空中断源	
	// Init Interrupt Controller
	for (i=0;i<32;i++)
		AT91F_AIC_DisableIt(AT91C_BASE_AIC,i); 
	for(i = 0; i < 8; i ++)
		AT91F_AIC_AcknowledgeIt(AT91C_BASE_AIC);
	
	//重映射,把内部RAM映射到地址0处
	// if not remaped then Remap SRAM from 0x200000 to 0x0
	// AT91C_BASE_MC->MC_RCR = 1;
	TestData = *((INT32S *)TEST_ADDR);
	*((INT32S *)TEST_ADDR)=TestData+1;
	if (*((INT32S *)TEST_ADDR)!=TestData+1)
		AT91C_BASE_MC->MC_RCR = 1;
	
	
	//搬移中断向量
	for(i = 0; i < 16; i ++)
		*((INT32S *)VECTOR_DEST_ADDR + i) = *((INT32S *)VECTOR_SRC_ADDR + i);

	//初始化调试串口
	InitDubegUart();
	
	//UartPrintf(0,"\n\rLowInit Finished !!!");
	AT91F_DBGU_Printk("\n\rLowInit Finished!!!!");
}


/*******************************************************************************
* 名称:StartSysTimer()
* 功能:设置系统调度时钟
* 入口参数:无
* 出口参数:无
* 说明:打开系统中断时钟--TC0,中断处理函数OSTimeTick,时间间隔10ms
*******************************************************************************/
void StartSysTimer(void)
{
	TC tc;  
	
	tc.Id = AT91C_ID_TC0;
	tc.dly = 10;
	tc.pTCBASE = AT91C_BASE_TC0;
	tc.tc_handling = OSTimeTick;
	TC_init(tc);	
}


extern int bottom_of_heap;
extern int top_of_heap;
/*******************************************************************************
* 名称:InitUserStack()
* 功能:初始化用户的堆栈
* 入口参数:无
* 出口参数:无
* 说明:用于浮点数的打印等操作
*******************************************************************************/
void InitUserStack(void)
{
	int  bottom,top;

	bottom = (int)(&bottom_of_heap);
	top = (int)(&top_of_heap);
	
	__rt_lib_init(bottom,top);		
}


/*******************************************************************************
* 名称:Bsp_init()
* 功能:板级初步初始化
* 入口参数:无
* 出口参数:无
* 说明:打开系统中断时钟....
*******************************************************************************/
void Bsp_init(void)
{
	//打开系统中断时钟
	StartSysTimer();	
}

⌨️ 快捷键说明

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