AT91RM9200+AIC总结

2018-10-24 09:35

AT91RM9200 AIC总结

当ARM处理器上电或者Reset之后,处理器从0x0取指。因此,必须保证系统上电时,0x0处有指令可以执行。所以,上电的时候,0x0地址处必定是ROM或者Flash(NOR)。

Remap

1.什么是Remap?

在ROM从0x0用几句指令引导系统之后,把RAM映射到0x0就是Remap。比如AT91RM9200,系统资源:片内128K的rom,片内16K的SRAM。复位后片内的ROM可以通过0x0和0x0010_0000来访问,片内SRAM通过0x0020_0000来访问。系统启动后,通过Remap命令可以把片内SRAM映射到0x0处,即remap后,只能通过0x0010_0000访问片内rom,通过地址0x0和0x0020_0000访问片内SRAM。 Remap前后,不同之处就是片内RAM的位置变了。 2.Remap的作用,为何要进行remap呢?有什么好处?

为了加快启动的速度,也方便可以更改异常向量表,加快中断响应速度,往往把异常向量表映射到更快、更宽的RAM中。但是异常向量表的开始地址是由ARM架构决定的,必须位于0x0处,因此,必须把RAM映射到0x0处。 所以9200如果要执行带中断的程序,必须Remap。 3.Remap的实现

Remap的实现和ARM处理器的实现相关。 1)如果处理器有专门的寄存器可以完成Remap。那么Remap是通过Remap寄存器的相应bit置1完成的。如Atmel AT91RM9200的MC_RCR寄存器中RCB位,注意该命令位是切换的,如果已经remap了,执行后将取消remap。

2)如果处理器没有专门的寄存器,但是memory的bank控制寄存器可以用来配置bank的起始地址,那么只要把RAM的起始地址编程为0x0,也可以完成remap。如samsung s3c4510

3)如果上面两种机制都没有,那么Remap就不要做了。因为处理器实现决定了SDRAM对应的bank地址是不能改变的。如Samsung S3c2410. 4)如果象2410那样不能Remap的话怎么办?2410不是不能Remap吗?为了加快启动速度,可以这样做:

A.使用它的NAND boot模式。为什么NAND boot会比较快,那是因为2410里面有块小石头——“SteppingStone”,一块4KB SRAM,它是映射在0x0的。启动程序会自动被copy到这个石头里面。自然异常向量的入口放到这个地方,一样可以达到比NOR boot快的启动、异常响应速度。

B.如果你对NOR Boot情有独衷,那么你只好把你的异常向量的入口copy到SDRAM里面,实现所谓的High Vector. Initboot.c

一般在LowlevelInit()部分设置向量表: // Init Interrupt Controller AT91F_AIC_Open( AT91C_BASE_AIC, // pointer to the AIC registers AT91C_AIC_BRANCH_OPCODE, // IRQ exception vector AT91F_UndefHandler, // FIQ exception vector AT91F_UndefHandler, // AIC default handler AT91F_SpuriousHandler, // AIC spurious handler 0); // Protect mode,当需要单步跟踪AIC寄存器值时,设置为1,即工作在保护模式下 // Perform 8 End Of Interrupt Command to make sure AIC will not Lock out nIRQ //因为AIC有八级优先级,最多的情况是中断嵌套了8次,所以执行8次中断结束命令 AT91F_AIC_AcknowledgeIt(AT91C_BASE_AIC); AT91F_AIC_AcknowledgeIt(AT91C_BASE_AIC); AT91F_AIC_AcknowledgeIt(AT91C_BASE_AIC); AT91F_AIC_AcknowledgeIt(AT91C_BASE_AIC); AT91F_AIC_AcknowledgeIt(AT91C_BASE_AIC); AT91F_AIC_AcknowledgeIt(AT91C_BASE_AIC); AT91F_AIC_AcknowledgeIt(AT91C_BASE_AIC); AT91F_AIC_AcknowledgeIt(AT91C_BASE_AIC); AT91F_AIC_SetExceptionVector((unsigned int *)0x0C, AT91F_FetchAbort); AT91F_AIC_SetExceptionVector((unsigned int *)0x10, AT91F_DataAbort); AT91F_AIC_SetExceptionVector((unsigned int *)0x4, AT91F_Undef);

程序主体部分:main.c #include \ #include \ #include extern void AT91F_IRQ0_ASM_HANDLER(void); char receive[10000]; int i=0; void AT91F_IRQ0_HANDLER(void) { //串口中断 int temp; temp=AT91C_BASE_US1->US_RHR; //receive[i++]=temp; while(!(AT91C_BASE_US1->US_CSR&AT91C_US_TXRDY)); AT91C_BASE_US1->US_THR=temp; } void AICUS1Init() { AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, // AIC base address AT91C_ID_US1, // System peripheral ID AT91C_AIC_PRIOR_HIGHEST, // Max priority AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED, AT91F_IRQ0_ASM_HANDLER ); // Enable IRQ0 interrupt AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_US1); } void UART1Init() { //Configure PIO controllers to drive US1 signals AT91F_US1_CfgPIO(); //Enable Peripheral clock in PMC for US1 AT91F_US1_CfgPMC(); //外设时钟在PMC初始化时设为60MHz,现在把串口配置为8数据位,没有校验位,1个停止位,波特率为115200,时间保障为0 AT91F_US_Configure ( (AT91PS_USART) AT91C_BASE_US1, // US1 base address


AT91RM9200+AIC总结.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:北京智新超越推荐:培养一个善于创造的大脑才是家长的第一要务

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: