按照DSP复位后的执行情况,Boot-loader分为以下几部分:
DSP的启动模式配置为从FLASH启动【参考】,硬件引脚配置如下:
引脚 |
GPIO18 |
GPIO29 |
GPIO34 |
电平 |
高 |
高 |
高 |
表1 DSP启动模式硬件引脚配置
从FLASH启动模式下,DSP复位后将跳转到地址0x3F7FF6处,由于从0x3F7FF8开始是128位的代码安全密码区。故只有0x3F7FF6-0x3F7FF7允许编程。若使能RAM自检功能,则此处应是跳转到RAM自检代码入口的分支指令;RAM自检通过后,调用TI的C环境初始化函数入口_c_int00,完成C环境初始化及跳转到boot-loader main函数入口。如果没有使能RAM自检功能,则包含到C环境初始化函数入口__c_int00的分支指令。
_c_int00是TI的C环境初始化函数入口地址,包含在.reset段中,编译器连接时自动加入.reset段(需不需要对_c_ini00实现显式的重定位?TBD)。
出于安全考虑,每次DSP复位后在使用RAM前先进行RAM自检。
RAM自检包括数据线测试和地址线测试。
如果RAM自检失败,这种情况下如果加载应用程序可能会导致数据错误或堆栈错误,所以失败后DSP进入disable模式。
RAM自检时DSP禁止中断及软件看门狗(硬件看门狗TBD)。
DSP在disable模式下应禁止中断及软件看门狗,GPIO也应设置到安全的状态(如禁止逆变器)。接着使能看门狗中断,并周期性喂狗。等待外部重新上电复位。
相关文件:bblk_startup.asm。
RAM自检通过后,boot-loader会检查DSP FLASH中是否存在有效的应用程序(app_check())。
函数原型 |
bool app_check(void) |
函数作用 |
检查FLASH中是否有有效应用程序 |
函数参数 |
无 |
函数说明 |
完成RAM自检后,被main()调用 |
表2 函数app_check()说明
Boot-loader主要检查应用程序的完整性。在应用程序代码区的开始和结束分别存储一个完整性标识字,boot-loader将检查这两个标识字是否正确。如果正确,代表有有效应用程序,boot-loader跳转到应用程序入口(jump_to_app())。
函数原型 |
void jump_to_app(void) |
函数作用 |
跳转到应用程序 |
函数参数 |
无 |
函数说明 |
此函数不返回 |
表3 函数jump_to_app()说明
由于boot-loader和应用程序分属两个独立的工程,应用程序的符号表不能导入到boot-loader。故应在开发应用程序时指示连接器将应用程序入口存储在指定的FLASH地址,boot-loader将用汇编指令跳转到该地址。
当应用程序接收到有效的刷新请求之后,擦除完整性标识字(由于FLASH的特性,实际擦除完整性标识字所在的整个扇区),然后触发软件看门狗复位。复位后由于完整性标识被擦除,DSP进入刷新模式。
另,整个代码区的有效性将由应用程序执行:采用32位的CRC算法(TBD)。
进入刷新主程序之前,必须将配置外围时钟,并将GPIO等置于安全状态,之后才能初始化CAN模块,进入刷新主程序。
函数原型 |
void bblk_init(void) |
函数作用 |
跳转到应用程序 |
函数参数 |
无 |
函数说明 |
被main()调用 |
表4函数bblk_init()说明
图3 boot-loader刷新模式初始化
外部晶振频率为20MHz, 经过PLL后产生100MHz的系统时钟。
使能用于诊断的CAN模块时钟(CANA/CANB:TBD)。
函数原型 |
void bblk_init_periphral_clk (void) |
函数作用 |
配置系统时钟及模块时钟 |
函数参数 |
无 |
函数说明 |
被bblk_init()调用 |
表5函数bblk_init_periphral_clk()说明
配置相应的GPIO的数据方向,并将输出设置为安全的状态。
需要配置的为数字输出的端口有三个:即逆变器使能、硬件看门狗输出和FLASH操作的翻转测试(Toggle Test)。
函数原型 |
void bblk_init_gpio(void) |
函数作用 |
配置GPIO |
函数参数 |
无 |
函数说明 |
被bblk_init()调用 |
表6 函数bblk_init_gpio()说明
本步骤初始化CAN模块,指定刷新使用的CAN ID。如果CAN模块初始化失败,MCU进入disable模式,等待复位。
函数原型 |
Bool bblk_init_can(void) |
函数作用 |
初始化用于诊断的CAN模块 |
函数参数 |
无 |
函数说明 |
被bblk_init()调用 |
表7函数bblk_init_can()说明
由于要对FLASH进行操作,所以必须初始化FLASH时钟,频率为MHz(TBD)。
函数原型 |
void bblk_init_flash_clock (void) |
函数作用 |
配置FALSH时钟 |
函数参数 |
无 |
函数说明 |
被bblk_init()调用 |
表8函数bblk_init_flash_clock()说明
配置中断向量表:bblk_pie_table_config()。
函数原型 |
void bblk_pie_table_config (void) |
函数作用 |
配置中断向量表 |
函数参数 |
无 |
函数说明 |
被bblk_init()调用 |
表9函数bblk_pie_table_config ()说明