281x上电引导顺序
2019-04-14 21:43发布
生成海报
281x系列芯片是TI在24x基础上推出的C2000系列的DSP芯片,它配备的特定外设模块为电机控制提供了有力的支持。广泛用于电气的控制嵌入式领域。强大的功能,必然需要众多片上资源的支持,需要灵活的配置方式。281x芯片提供给我们多种不同的上电引导模式,以适应不同应用场合的需求。下面就来介绍。
总体来讲,281x是通过内部的bootloader引导程序配合几个特定的通用IO引脚来判断上电引导方式的。Bootloader位于芯片的Boot ROM中,是在芯片出厂时就写好了引导程序,除了引导程序外,其中还提供了供IQ math调用的数学运算表。关于数学运算表,这里就不再讨论了。
281x有两种运行模式,微处理器(Microprocessor)模式和微计算机(Microcomputer)模式,复位时,芯片判断XMP/MC引脚上的电平,当该引脚为高电平时,芯片进入微处理器模式,当为低电平时则进入微计算机模式。在微处理器模式下,芯片需要从第7外部接口区引导运行。只有在微计算机模式下,芯片才会从内部boot ROM引导。XMP/MC引脚的状态在复位时锁存入芯片配置寄存器XINTCNF2中MP/MC位,复位后,XMP/MC引脚上的电平就不在有效,芯片将不再关心其状态。用户可以通过改变XINTCNF2中的MP/MC位来重新配置芯片运行模式。
微处理器模式下,用户需要从第7外部接口(XINTF zone 7)配置引导程序。配置过程很是繁琐。本文仅介绍微计算机模式下的引导过程,即通过片内boot ROM中的botloader程序来引导。
281x器件的bootloader程序位于281x内部ROM中,当DSP运行在微计算机模式时,对器件进行复位就会使bootloader程序运行。
Bootloader程序的功能是在器件上电后将代码从外部存储器转移到器件内部或者外部接口(XINTF)存储器中。这就允许代码储存在外部的慢速非易失性存储器中,在运行时转移到内部高速存储器中运行。它提供了多种不同的代码转移方式,以适应不同的系统需求。当然,这些方式只有在DSP运行在微计算机模式(XMP/MC输入信号为低)时才可使用。
下图是基本的Bootloader流程图。
复位时,芯片采样XMP/MC引脚,以判断采用何种模式运行。
如果XMP/MC=1(微处理器模式),第7外部接口(XINTF zone 7)使能,复位向量从外部存储器中取得。此时,必须确保复位向量指向有效的代码执行地址。当然,这种模式只有在具有外部接口的器件上才可以采用,如2812。
如果XMP/MC=0(微计算机模式),第7外部接口(XINTF zone 7)不使能,使能内部boot ROM。此时,复位向量从内部boot ROM中取得。没有外部接口的芯片在内部将XMP/MC拉低,以保证总会使能内部boot ROM。
内部boot ROM中的复位向量指向引导初始化函数InitBoot,当芯片上电初始化完成后,检测几个特定通用IO口的状态,以确定采用何种引导模式。这些模式包括:跳转到内部Flash、跳转到H0 SARAM、跳转到OTP或者调用某一个片内程序。
引导模式选定后,执行所选定的引导。程序将从选定的引导模式所指向的入口地址处开始执行。如果需要调用boot loader,则由从外设模块发送来的数据流决定入口地址(对应从SPI、SCI-A或并口引导的模式)。如果不调用boot loader,即直接从Flash、OTP或H0 SARAM引导,每个存储块中入口地址都已经预先定义了。
Bootloader通过检测四个通用IO口的状态来确定使用哪种引导模式。四个IO状态及对应的引导模式如下表所示:
GPIOF4 (SCITXDA)
GPIOF12 (MDXA)
GPIOF3 (SPISTEA)
GPIOF2 (SPICLK)
引导模式
1
x
x
x
Flash引导模式,跳转到Flash地址 0x3F 7FF6
0
1
x
x
SPI引导模式,调用SPI_Boot,从外部串行SPI EEPROM启动
0
0
1
1
SCI引导模式,调用SCI_Boot从SCI-A引导启动
0
0
1
0
H0 SRAM引导模式,跳转到H0 SARAM地址 0x3F 8000
0
0
0
1
OTP引导模式,跳转到OTP地址 0x3D 7800
0
0
0
0
并行引导模式,调用Parallel_Boot从通用IO口B口启动
下图所示是微计算机模式下的引导过程的流程图。
通过检测相关IO口的状态,boot loader会选择相应的引导模式,这些引导模式包括:
● 跳转到Flash中的转移指令:
这种模式下,程序直接跳转到Flash中的地址0x3F7FF6处,这个地址位于代码安全模块(CSM)密码地址前面。用户代码需要在这个地址处放一个跳转指令,跳转到特定的boot-loader或者用户代码处。
在代码中的实现如下
在cmd文件中
/***********************************************************************************/
……
BEGIN_FLASH : origin = 0x3F7FF6, length = 0x000002 /*将地址0x3F7FF6开始的两个字节定义为BEGIN_FLASH段*/
……
codestart : > BEGIN_FLASH, PAGE = 0 /*codestart入口地址放入其中*/
/*************************************************************/
codestart函数在文件DSP281x_CodeStartBranch.asm中用汇编语言实现的。如下:
/**************************************************************/
.sect "codestart"
code_start:
.if WD_DISABLE == 1
LB wd_disable ;Branch to watchdog disable code
.else
LB _c_int00 ;Branch to start of boot.asm in RTS library
.endif
/*************************************************************/
执行codestart函数,程序将跳转到_c_int00处,这是在编译C语言工程时,由库函数rts.lib定义的,它实际上指向编译后的main()函数。即从main()开始执行用户代码。
● 跳转到H0 SARAM:
这种模式下,程序跳转到地址0x3F8000,H0 SARAM存储块的首地址处。
● 跳转到OTP存储块
程序直接跳转到OTP存储块的首地址0x3D7800。.
● 通用串口引导模式(SCI)
这种模式下,boot loader通过SCI-A口将代码装载到芯片中。
● SPI EEPROM引导模式
这种模式下,boot loader通过SPI口将代码从外部EEPROM装载到片上存储器中。
● GPIO口引导模式
这种模式下,boot loader通过GPIO口的B口从外部并行装载代码和数据。
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮