📄 bsp.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 + -