基于ARM核的Bootloader代码的分析与设计
- 格式:pdf
- 大小:99.40 KB
- 文档页数:3
stm32f103 bootload原理STM32F103是一款基于Cortex-M3内核的微控制器,具有丰富的外设和高性能的计算能力。
在实际应用中,常常需要对STM32F103进行固件更新或更改,以实现新功能或修复已知问题。
为了实现这一目标,STM32F103具备了bootloader(启动加载器)功能,即可以通过引导加载器进行固件的更新。
本文将以STM32F103的bootloader原理为主题,详细讲解其实现过程。
一、什么是bootloader?在计算机领域,bootloader是一种可以加载操作系统或其他应用程序的程序。
它位于系统内存的固定位置,并在系统启动时执行。
相似地,STM32F103的bootloader也是一种程序,它位于芯片内部的固定位置,并在芯片上电启动时执行。
STM32F103的bootloader专门用于加载和烧录新的固件。
二、bootloader的功能1. 固件更新:STM32F103的bootloader使得可以通过各种方式,如串行端口、USB、以太网等,将新的固件烧录到芯片内部的闪存中,并更新原有的固件。
2. 故障修复:当出现问题导致原有的固件无法正常运行时,通过bootloader 可以重新烧录固件,以修复问题。
3. 调试功能:通过bootloader,可以在运行时上传代码和调试信息,方便开发人员进行调试和验证。
三、bootloader的实现原理1. 前提条件:为了实现bootloader功能,首先需要将bootloader程序烧录到STM32F103芯片内部的闪存中,并保证固件的启动顺序正确。
一般来说,bootloader程序的入口地址为0x08000000,而应用程序的入口地址为0x08002000。
2. 硬件连接:为了与外部设备进行通信,需要将STM32F103的串口、USB或以太网等接口与外部设备相连,以实现数据传输。
3. bootloader程序逻辑:bootloader程序首先进行固件检测,判断当前是否需要更新固件。
主题:STM32F030 Bootloader 例程一、简介STM32F030是STMicroelectronics公司推出的一款32位ARM Cortex-M0内核的微控制器。
它具有丰富的外设,如GPIO、UART、SPI、I2C等,适用于各种嵌入式系统应用。
在嵌入式系统开发中,Bootloader是一个重要的组成部分,它能够实现固件的更新和管理,提高系统的灵活性和可靠性。
本文将介绍如何使用STM32F030的Bootloader例程进行固件升级。
二、准备工作在使用STM32F030的Bootloader例程之前,我们需要准备好以下工具和材料:1. STM32F030开发板2. USB转TTL串口模块3. ST-Link下载器4. 针对STM32F030系列的Bootloader例程源码三、下载和安装Bootloader例程源码1. 在STMicroelectronics官全球信息站下载针对STM32F030的Bootloader例程源码2. 将下载的源码解压缩到本地3. 打开Keil MDK-ARM开发环境,导入源码并进行编译四、烧录Bootloader程序1. 使用ST-Link下载器将编译好的Bootloader程序烧录到STM32F030开发板上2. 确保烧录成功后,通过串口工具连接USB转TTL串口模块到STM32F030的串口引脚上五、固件升级测试1. 将需要升级的固件通过串口工具上传到开发板2. 在Bootloader程序中编写相关代码来实现固件的升级和校验3. 运行Bootloader程序,进行固件升级测试六、总结通过本文的介绍,我们了解了如何使用STM32F030的Bootloader 例程进行固件升级。
在实际的嵌入式系统开发中,Bootloader的作用不仅局限于固件升级,还可以实现固件的管理和安全验证。
掌握Bootloader的开发和使用对于提高系统的稳定性和可靠性是非常重要的。
bootloader启动代码分析1,bootloader(第一部分)主要完成以下工作:1,设置CPU工作模式;2,关闭中断;3,关闭Cache和Write buffer;4,初始化SDRAM,配置存储设备;5,复制FLASH中的代码和数据到SDRAM中;6,内存重映射,配置存储设备;7,把RM和ZI从LOAD ADDR 复制到execute ADDR.8,设置栈空间指针,跳转到C语言函数入口(启动代码第二部分)。
2,具体代码分析1,设置CPU工作模式MRS r0, cpsr#读取CPSR状态寄存器的值CPSR状态寄存器结构:BIC r0, r0, #MASK_MODE&定义值为0x0000003F,把MODE清零;ORR r0, r0, #MODE_SVC32&宏定义值为0x00000013,把MODE设置为SVC模式;ORR r0, r0, #I_BIT&宏定义值为0x80,关IRQ;ORR r0, r0, #F_BIT&宏定义值为0x40,关FIQ;MSR cpsr_c, r0&回写cpsr状态寄存器设置完CPSR后,状态寄存器中的值:2,关闭中断LDR r2, =ARM7_INTMASK& ARM7_INTMASK宏定义值为ASIC_BASE+0x4008,读取interrupt controller寄存器MVN r1, #0&FFFFFFFFSTR r1, [r2]&回写interrupt controller寄存器,之后寄存器的值为全1,既关闭所有的中断源;LDR r2, =ARM7_INTPEND&ARM7_INTPEND宏定义值为ASIC_BASE+0x4004,取interrupt pend 寄存器.MVN r1, #0 &FFFFFFFFSTR r1, [r2]&回写ARM7_INTPEND寄存器,之后寄存器的值为全1,既关闭所有的中断标志位;3,关闭Cache和Write bufferASIC_BASE宏定义值为0x03ff0000LDR r0, =ARM7_SYSCFG &宏定义值为ASIC_BASE+0x0000LDR r1, =0x87ffffA00X87ffffA0的二进制为 1000 0111 1111 1111 1111 1111 1010 0000 SE Must be set to zero.CE When set to '1', cache operations are enabled. 设置为0,将CACHE禁用。
bootloader架构设计
2440 ARM 处理器启动流程:从nand flash ⽅式启动,处理器将前端的4k的内容复制到SRAM(stepping stone)⾥,⼤于4k的内容复制到内存中。
bootloader被分成两部分:
BL1:
1. 核⼼初始化
1. 设置异常向量表
2. 设置处理器为svc模式
3. 关闭看门狗
4. 关闭所有中断
5. 关闭mmu和cache
2. C语⾔编程环境设置
1. 设置堆栈
2. 清楚bss段
3. LED初始化
4. 初始化系统时钟
5. 内存初始化
6. 复制nand flash中的BL2到内存中
1. 简单初始化nand flash
2. 复制代码到内存
3. 跳转到第⼆阶段⼊⼝
BL2:
1. mmu初始化
2. 中断初始化
1. 中断初始化
2. 按键初始化
3. 初始化串⼝
1. 串⼝初始化
2. 移植printf函数
4. ⽹卡初始化
5. LCD初始化
1. 触摸屏的初始化
2. LCD 初始化
6. 解析执⾏⽤户命令
1. 移植tftp命令
2. 移植bootm命令。
•Bootloader是在单片机上电启动时执行的一小段程序。
也称作固件,通过这段程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用应用程序准备好正确的环境。
Boot代码由MCU启动时执行的指令组成。
这里的loader指向MCU的Flash中写入新的应用程序。
因此,Bootloader是依赖于特定的硬件而实现的,因此,在众多嵌入式产品中目前还不可能实现通用Bootloader。
Bootloader的最大优点是:在不需要外部编程器的情况下,对嵌入式产品的应用代码进行更新升级。
它使得通过局域网或者Intemet远程更新程序成为可能。
例如,如果有5 000个基于MCU的电能表应用程序需要更新,电能表制造商的技术人员就可以避免从事对每一个电能表重新编程的巨大工作量,通过使用Bootloader的功能,由控制中心通过电能表抄表系统网络,远程对5 000个电表重新编程。
可见,Bootloader功能对于嵌入式系统的广泛应用具有十分重要的意义。
1 78K0/Fx2系列单片机简介78K0/Fx2系列是带CAN控制器的8位单片机,该系列单片机广泛应用于汽车电子,智能仪表等领域。
其内置POC(可编程上电清零电路)/LVI(可编程低电压指示器),单电压自编程闪存,引导交换功能(闪存安全保护),具有低功耗、宽电压范围、超高抗干扰等性能。
78K0系列单片机支持自编程(Self-programming)。
所谓自编程,是指用Flash存储器中的驻留的软件或程序对Flash存储器进行擦除/编程的方法。
通过单片机的自编程功能,可以设计Bootloader程序,通过串口等通信接口实现对产品重新编程、在线升级的功能。
以μPD78F0881为例。
μPD78F0881为78KO/Fx2系列中的一款44管脚单片机,内置32 KB Flash ROM,2 KB RAM,自带2个串行通信接口。
基于ARM7TDMI的嵌入式系统BootLoader的设计与实现汪金宝;陶玉贵;陈付龙
【期刊名称】《徐州工程学院学报(自然科学版)》
【年(卷),期】2011(026)003
【摘要】通过设计ARM7TDMI核心板,扩展和增加USB接口,分析BootLoader 原理,以及在启动模式、中断处理、硬件初始化和最终引导linux内核上的一系列关键技术,最终实现了一个支持从U盘加载嵌入式linux系统镜像的BootLoader,通过对实验结果的分析,该BootLoader能更好地满足用户和开发人员的要求.【总页数】4页(P50-53)
【作者】汪金宝;陶玉贵;陈付龙
【作者单位】安徽师范大学数学与计算机科学学院,安徽芜湖241003;芜湖信息技术职业学院,安徽芜湖241000;安徽师范大学数学与计算机科学学院,安徽芜湖241003
【正文语种】中文
【中图分类】TP302
【相关文献】
1.基于ARM嵌入式系统的Bootloader的设计与实现 [J], 朱华宽;朱维杰
2.基于ARM7TDMI的嵌入式系统设计与实现 [J], 万晨妍;侯颖欣
3.基于ARM的嵌入式系统Bootloader的设计与实现 [J], 潘孝帮;刘连浩
4.基于ARM9的嵌入式系统Bootloader设计与实现 [J], 任斌;赖树明;陈卫;吴忠良
5.基于S3C44B0X的嵌入式系统Bootloader设计与实现 [J], 郭瑛;李树华;铁勇;孙永凤;俞宗佐
因版权原因,仅展示原文概要,查看原文内容请购买。
ARMlinux启动分析-Nathan.Yu的专栏-CSDN博客linux启动分析(1)---bootloader启动内核过程我分析的是2.4.19的内核版本,是xscale的平台,参考了网上很多有价值的帖子,也加入了自己的一些看法,陆续总结成文字,今天是第一篇:内核一般是由bootloader来引导的,通过bootloader启动内核一般要传递三个参数,第一个参数放在寄存器0中,一般都为0,r0 = 0;第二个参数放在寄存器1中,是机器类型id,r1 = Machine Type Number;第三个参数放在寄存器2中,是启动参数标记列表在ram中的起始基地址;bootloader首先要将ramdisk(如果有)和内核拷贝到ram当中,然后可以通过c语言的模式启动内核:void (*startkernel)(int zero, int arch, unsigned int params_addr) = (void(*)(int, int, unsigned int))KERNEL_RAM_BASE;startkernel(0, ARCH_NUMBER, (unsigned int)kernel_params_start);其中KERNEL_RAM_BASE为内核在ram中启动的地址,ARCH_NUMBER是Machine Type Number,kernel_params_start 是参数在ram的偏移地址。
这时候就将全力交给了内核。
linux启动分析(2)---内核启动地址的确定内核编译链接过程是依靠vmlinux.lds文件,以arm为例vmlinux.lds文件位于kernel/arch/arm/vmlinux.lds,但是该文件是由vmlinux-armv.lds.in生成的,根据编译选项的不同源文件还可以是vmlinux-armo.lds.in,vmlinux-armv-xip.lds.in。
基于ARM9的Bootloader的分析及设计作者:王景存高峰来源:《现代电子技术》2010年第02期摘要:Bootloader是ARM嵌入式系统的重要组成部分。
对于不同内核的系统板,其Bootloader也不尽相同,针对每个裸板都要对其烧写针对自己的Bootloader。
在此简要介绍S3C2410及其两种启动方式,着重分析S3C2410从NAND FLASH启动的过程中,对各个内部功能模块进行的初始化过程,并设计出基于S3C2410嵌入式系统的Bootloader。
通过在线仿真及实际测试表明,该Bootloader具有良好的稳定性、实时性和可移植性。
关键词:ARM;Bootloader;嵌入式系统;启动方式中图分类号:TP311文献标识码:B文章编号:1004-373X(2010)02-044-03Analysis and Design of Bootloader Based on ARM9WANG Jingcun,GAO Feng(College of Information Science and Engineering,Wuhan University of Science and Technology,Wuhan,430081,China)Abstract:Bootloader is an important part of ARM embedded system.For different kernel system board,its Bootloader is also different.Each bare_board should programmer its ownBootloader.Therefore,the development of specific Bootloader is particularly important,the superiority of Bootloader directly affects on the performance of embedded systems.The S3C2410 and its two start_up mode are introduced,focusing on analysing the process during the S3C2410 starts from NAND FLASH,the initializing process of each internal modules.A Bootloader based on S3C2410 embedded system is designed.Through online simulation and practical tests show that the Bootloader has good stability,real_time performance and portability.Keywords:ARM;Bootloader;embedded system;start_up mode0 引言Bootloader是在嵌入式操作系统内核运行之前运行的一小段程序,它相当于PC机中的BIOS(Basic Input/Output System)。
bsp岗位职责(通用4篇)随着社会不绝地进步,岗位职责起到的作用越来越大,订立岗位职责能够有效的地防止由于职位调配不合理而导致部门之间或是员工之间显现工作推脱、责任推卸等现象发生。
什么样的岗位职责才是有效的呢?这次为您整理了4篇《bsp岗位职责》,希望能为您的思路供应一些参考。
bsp岗位职责篇一岗位职责:1.负责linux bsp 驱动软件的分析设计、移植开发和调试工作,适配于新的硬件平台;2.搭配硬件工程师调试和解决硬件问题,提升系统硬件性能;3.linux 系统性能分析优化,提出优化措施并实施;4.搭配高层软件工程师完成整机功能和性能调测。
5.搭配产品生产中软件升级及产线测试。
岗位要求:1.精通c 语言,了解arm 汇编语言,有坚固结实的编程功底;2.具备3 年以上嵌入式平台开发经验3.精通linux gcc/g++,makefile4.具有3 以上年bsp 驱动软件开发经验;5.精通底层调试技术,具有技术研讨本领和刻苦精神;6. 熟识uboot 、linux 内核架构和驱动模型,有linux 驱动(以太网phy/ddr/usb/eeprom/flash/sim 卡等)开发移植经验;7.熟识arm 系列、mips 系列的。
cpu 的架构及原理;8.有责任心和团队精神,擅长理解和沟通。
9.有基站开发经验者优先10.熟识tcp/ip 协议经验者优先。
11.熟识lte mifi/router/openwrt 开发经验者优先。
12. 具备良好的英语读写本领。
bsp岗位职责篇二职位描述:linux bsp开发工程师2名车载或移动电话岗位职责:1、负责linux常见驱动的开发与维护。
2、负责linux bsp相关代码和文档的编写与整理 .3、负责搭配硬件工程师验证硬件功能、调试硬件问题。
任职资格:1、计算机、电子、通信等相关专业,本科学历,工作2年以上。
2、熟识c/c++编程。
3、熟识linux开发环境4、了解linux内核驱动模型。
邮局订阅号:82-946360元/年技术创新ARM开发与应用《PLC技术应用200例》您的论文得到两院院士关注基于ARM核的Bootloader代码的分析与设计TheAnalysisAndDesignOfBootloadercodeBasedOnARMCore(江南大学)张宏财赵曾贻Zhang,HongcaiZhao,Zengyi摘要:Bootloader是系统上电或复位后首先运行的一段代码,Bootloader代码(即启动代码)的好坏对整个系统的运行效率有着重要的影响,而Bootloader代码与芯片的特性有着紧密的联系。
本文根据用LPC2210在ADS(ARMDeveloperSuite)开发环境下进行嵌入式系统设计的实际经验,总结出基于ARM7TDMI内核的LPC2210处理器的Bootloader代码设计的详细流程及其中的一些关键技术和代码关键词:ARM7TDMI核;ADS;Bootloader代码;LPC2210中图分类号:TP368.1文献标识码:AAbstract:Bootloaderisasectionofcodewhichfirstlyrunsaftersystemgettingelectricityandresetting.Thequalityofbootloadercodehasimportantinfluenceonrunningefficiencyofwholesystem.Butthebootloadercodehascloseconnectionwiththecharacter-isticofchip.ThispaperaccordingtopraticalexperienceofdesigningLPC2210embeddedsysteminADS(ARMDeveloperSuite)de-velopedcircumstance,concludethatdetailedflowandkeytechnologyandcodeofdesigningbootloaderwhichbasedonARM7TDMIcore’sLPC2210processor.Keywords:ARM7TDMICore;ADS;BootloaderCode;LPC2210文章编号:1008-0570(2006)05-2-0137-03前言基于ARM核的微处理器是目前嵌入式领域应用最广泛的RISC微处理器,以其低成本、低功耗、高性能等优点占据了嵌入式系统应用领域的领先地位。
基于ARM核的芯片多数为复杂的片上系统集成,在芯片上电或复位时,需要专门的一段代码来完成对系统的初始化。
启动代码就是芯片上电或复位后进入应用程序main()函数前执行的一段代码,它主要为运行C程序提供基本的运行环境。
1启动代码的流程Bootloader(启动)代码类似于PC机的BIOS(基本输入输出系统),它从系统上电或复位开始接管CPU,Bootloader根据实现的功能不同,其复杂程度也各不相同,一般随具体的目标系统和开发系统有所区别,使得每一种芯片的启动代码差别较大,不易编出统一的启动代码,但通常包括以下几个步骤:・设置程序入口指针・设置中断向量表・初始化存储器系统・初始化CPU各种模式的堆栈和寄存器・初始化目标系统中要使用的各种片内外设・初始化用户程序执行环境・引导主应用程2基于LPC2210的Bootloader关键代码设计2.1LPC2210的Bootloader代码流程:根据前面介绍的一般步骤,利用ARM公司推出的ADS开发工具,设计出LPC2210的Bootloader的具体流程(如图1)和关键代码。
Philips公司生产的LPC2210是基于ARM7TDMI核的RISC微处理器,特别适用于工业控制、医疗系统、访问控制。
ADS是ARM公司推出的ARM核微处理器集成开发工具,成熟的版本是ADS1.2,ADS由命令行开发工具、ARM实时库、GUI开发环境、实用程序和支持软件组成,支持软件调试及JTAG硬件仿真调试,支持汇编、C和C++源程序。
图1基于LPC2210的Bootloader代码流程张宏财:硕士研究生137--技术创新中文核心期刊《微计算机信息》(嵌入式与SOC)2006年第22卷第5-2期360元/年邮局订阅号:82-946《现场总线技术应用200例》ARM开发与应用2.2设置中断向量表ARM芯片上电或复位后,系统进入管理模式、ARM状态、PC(R15)指向0x00000000地址处,所以必须保证向量表代码定位在0x00000000处,或者映射到0x00000000处,LPC2210系统上电或复位时,存储器映射控制寄存器(MEMMAP)等于0,BootBlock被重映射到地址0x00000000处,选择从BootBlock读取中断向量。
中断向量表为每一个中断设置1个字(4个字节)的存储空间,存放一条跳转指令,通过这条指令使PC指针指向相应的中断服务程序入口,继而执行相应的中断处理程序。
LPC2210的中断向量表和其它基于ARM核的芯片中断向量表较类似,只要注意LPC2210要使向量表所有数据32位累加和为零(0x00000000 ̄0x0000001C的8个字的机器码累加),才能使用户的程序脱机运行,限于篇幅,在此省略中断向量表的代码。
2.3初始化存储器系统初始化存储器系统是初始化代码中的一个重要部分,因为许多操作系统在开始运行之前,希望了解存储器的组织情况。
存储器系统初始化是通过软件设定FLASH、RAM存储器的地址范围,数据总线宽度。
由于LPC2210是总线开放型芯片,具有4个Bank的存储器组,总线宽度可设置为8位、16位或32位。
初始化存储器系统代码如下:ResetInitLDRR0,=PINSEL2IF:DEF:EN_CRPLDRR1,=0x0f814910;芯片加密,禁止JTAG调试ELSELDRR1,=0x0f814914;设置总线的I/O引脚ENDIFSTRR1,[R0]LDRR0,=BCFG0LDRR1,=0x1000ffefSTRR1,[R0];设置外部第0个存储区LDRR0,=BCFG1LDRR1,=0x1000ffefSTRR1,[R0];设置外部第1个存储区LDRR0,=BCFG2LDRR1,=0x2000ffefSTRR1,[R0];设置外部第2个存储区LDRR0,=BCFG3LDRR1,=0x2000ffefSTRR1,[R0];设置外部第3个存储区2.4初始化堆栈、改变处理器模式ARM处理器有7种处理器模式,分别为:用户模式(usr)、快速中断模式(fiq)、普通中断模式(irq)、管理模式(svc)、数据访问中止模式(abt)、未定义指令中止模式(und)、系统模式(sys)。
除用户模式之外的其他6种模式称为特权模式,在这些模式下,程序可以访问所有的系统资源,也可以任意进行处理器模式的切换。
每一种模式的堆栈指针寄存器(SP)都是独立的,因此对程序中需要用到的每一种模式都要给SP寄存器定义一个堆栈地址。
方法是改变状态寄存器CPSR中的状态位,使处理器切换到相应的模式,然后再给SP赋值。
这里有两点要注意:一、要尽量给堆栈分配快速和高带宽的存储器,因为堆栈性能的好坏对系统整体性能有非常重要的影响。
二、在处理器模式切换时,不要过早地进入用户模式,因为进入用户模式就不能对CPSR进行修改切换到别的模式,这样会对接下去地程序造成影响,一般在系统初始化的最后阶段才将运行模式切换到用户模式。
初始化堆栈代码如下:InitStackMOVR0,LR;因芯片模式切换,故将程序返回地址保存到R0,同时在初始化堆栈完成后使用R0返回MSRCPSR_c,#0xd3LDRSP,StackSvc;设置管理模式堆栈MSRCPSR_c,#0xd2LDRSP,StackIrq;设置中断模式堆栈MSRCPSR_c,#0xd1LDRSP,StackFiq;设置快速中断模式堆栈MSRCPSR_c,#0xd7LDRSP,StackAbt;设置中止模式堆栈MSRCPSR_c,#0xdbLDRSP,StackUnd;设置未定义模式堆栈MSRCPSR_c,#0xdfLDRSP,=StackUsr;设置用户模式堆栈MOVPC,R02.5初始化目标系统为了LPC2210基本能够工作,在进入main()函数前,须对目标系统进行一些基本的初始化工作。
如:LPC2210有不同的存储器映射方式,须根据硬件来设置存储器映射方式;为了避免混乱,最好在进入main()函数前设置系统各部分时钟等,关键代码如下:voidTargetResetInit(void){#ifdef__DEBUGMEMMAP=0x3;#endif#ifdef__OUT_CHIPMEMMAP=0x3;#endif#ifdef__IN_CHIPMEMMAP=0x1;/*根据预定义的宏,设138--邮局订阅号:82-946360元/年技术创新ARM开发与应用《PLC技术应用200例》您的论文得到两院院士关注置存储器映射方式*/#endif/*设置系统各部分时钟*/PLLCON=1;/*使能PLL(锁相环),但不连接PLL*/#if(Fpclk/(Fcclk/4))==1VPBDIV=0;#endif#if(Fpclk/(Fcclk/4))==2VPBDIV=2;#endif#if(Fpclk/(Fcclk/4))==4VPBDIV=1;#endif/*设置外设时钟(VPB时钟pclk)与系统时钟(cclk)的分频比*/#if(Fcco/Fcclk)==2PLLCFG=((Fcclk/Fosc)-1)|(0<<5);#endif#if(Fcco/Fcclk)==4PLLCFG=((Fcclk/Fosc)-1)|(1<<5);#endif#if(Fcco/Fcclk)==8PLLCFG=((Fcclk/Fosc)-1)|(2<<5);#endif#if(Fcco/Fcclk)==16PLLCFG=((Fcclk/Fosc)-1)|(3<<5);/*根据PLL的电流控制振荡器和系统时钟的频率比,设置PLL的乘因子和除因子*/#endifPLLFEED=0xaa;PLLFEED=0x55;/*使用芯片要求的访问序列把数据写入PLL相关寄存器*/while((PLLSTAT&(1<<10))==0);/*等待PLL跟踪完成*/PLLCON=3;PLLFEED=0xaa;PLLFEED=0x55;/*使PLL连上系统*//*设置存储器加速模块(MAM)*/MAMCR=0;/*关闭MAM*/#ifFcclk<20000000MAMTIM=1;#else#ifFcclk<40000000MAMTIM=2;#elseMAMTIM=3;/*根据Fcclk的大小来设置MAM定时寄存器*/#endif#endifMAMCR=2;/*使能MAM*//*初始化VIC*/VICIntEnClr=0xffffffff;禁止所有中断VICVectAddr=0;设置向量地址寄存器(VICVectAddr)的值为0VICIntSelect=0;将所有中断设置为IRQ中断程序中的Fcclk、Fcco、Fpclk须在头文件中定义。