QQ:971586331

软件环境:

操作系统:windows 10

IDE:CCS7.4

代码生成工具:HALCoGen 04.07.01

烧写工具:CCS UniFlash

硬件环境:

目标板:TMDS570LS31HDK

本文内容:详细描述了TMS570系统处理器bootload跳转原理,编写2份程序,一个是bootload,一个是应用程序,在bootload中,使LED D5(HET1[00])闪烁5次后跳转到0x00180000处开始执行应用程序,应用程序中使LED D4(HET1[31])闪烁5次后软复位,再次执行bootload,如此往复。

1.编写bootload程序

按TMS570学习1中的流程新建工程boot_test,在hal下的sys_main.c中的编写主程序

/* USER CODE BEGIN (0) */
#include "sys_common.h"
#include "gio.h"
#include "delay.h"
#include "het.h"
#include "pinmux.h"
#include "F021.h"
/* USER CODE END *//* Include Files *//* USER CODE BEGIN (1) */#define APP1_START_ADDRESS  (0x00180000)
#define APP2_START_ADDRESS  (0x00040000)
#define APP3_START_ADDRESS  (0x00060000)
#define APP4_START_ADDRESS  (0x00080000)/* USER CODE END *//** @fn void main(void)
*   @brief Application main function
*   @note This function is empty by default.
*
*   This function is called after startup.
*   The user can use this function to implement the application.
*//* USER CODE BEGIN (2) */uint32 g_ulTransferAddress;/* USER CODE END */uint8  emacAddress[6U] =  {0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU};
uint32  emacPhyAddress  =  1U;int main(void)
{
/* USER CODE BEGIN (3) */int i = 0;gioInit();muxInit();/* Set high end timer GIO port hetPort pin direction to all output */gioSetDirection(hetPORT1, 0xFFFFFFFF);for( i=0; i<10; i++){gioSetPort(hetPORT1, gioGetPort(hetPORT1) ^ (1<<0));my_delay(1000);}g_ulTransferAddress = (uint32_t)APP1_START_ADDRESS;((void (*)(void))g_ulTransferAddress)();    //跳转程序指针while(1){}/* USER CODE END */return 0;
}/* USER CODE BEGIN (4) */
/* USER CODE END */

在主程序中,我们先初始化IO,让HET1[00]闪烁5次,然后让程序指针跳转到0x00180000处开始运行,因为要下载2个程序,为了把程序下载到指定地址和防止程序地址空间冲突,修改cmd文件。

/*                                                                            */
/*----------------------------------------------------------------------------*/
/* USER CODE BEGIN (0) */
/* USER CODE END *//*----------------------------------------------------------------------------*/
/* Linker Settings                                                            */--retain="*(.intvecs)"/* USER CODE BEGIN (1) */
/* USER CODE END *//*----------------------------------------------------------------------------*/
/* Memory Map                                                                 */MEMORY
{VECTORS (X)  : origin=0x00000000 length=0x00000020FLASH0  (RX) : origin=0x00000020 length=0x0017FFE0//FLASH1  (RX) : origin=0x00180000 length=0x00180000STACKS  (RW) : origin=0x08000000 length=0x00001500RAM     (RW) : origin=0x08001500 length=0x0003EB00/* USER CODE BEGIN (2) */
/* USER CODE END */
}/* USER CODE BEGIN (3) */
/* USER CODE END *//*----------------------------------------------------------------------------*/
/* Section Configuration                                                      */SECTIONS
{.intvecs : {} > VECTORS//.text    : {} > FLASH0 | FLASH1//.const   : {} > FLASH0 | FLASH1//.cinit   : {} > FLASH0 | FLASH1//.pinit   : {} > FLASH0 | FLASH1.text    : {} > FLASH0.const   : {} > FLASH0.cinit   : {} > FLASH0.pinit   : {} > FLASH0.bss     : {} > RAM.data    : {} > RAM.sysmem  : {} > RAM/* USER CODE BEGIN (4) */
/* USER CODE END */
}/* USER CODE BEGIN (5) */
/* USER CODE END *//*----------------------------------------------------------------------------*/
/* Misc                                                                       *//* USER CODE BEGIN (6) */
/* USER CODE END */
/*----------------------------------------------------------------------------*/

因为bootload程序上电启动,所以从0x00000000开始,FLASH1段的位置正好是我们放应用程序的位置,所以屏蔽掉,SECTIONS中的text等段就只能放在FLASH0中,编译下载,可以看到板上的HET1[00]灯闪烁5次后熄灭,因为0x00180000处没有代码可以执行,程序跑飞。

2.编写应用程序

按TMS570学习1中的流程新建工程test,在hal下的sys_main.c中的编写主程序

/* USER CODE BEGIN (0) */
/* USER CODE END *//* Include Files */#include "sys_common.h"/* USER CODE BEGIN (1) */
#include "rti.h"
#include "het.h"
#include "gio.h"
#include "emif.h"
#include "pinmux.h"
#include "sci.h"
#include "delay.h"
#include <stdio.h>
#include <reg_system.h>
/* USER CODE END *//** @fn void main(void)
*   @brief Application main function
*   @note This function is empty by default.
*
*   This function is called after startup.
*   The user can use this function to implement the application.
*//* USER CODE BEGIN (2) *//* USER CODE END */uint8 emacAddress[6U] =  {0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU};
uint32  emacPhyAddress  =  0U;int main(void)
{
/* USER CODE BEGIN (3) */int i=0;int ret;int buff;/* Initialize RTI driver */gioInit();rtiInit();muxInit();sciInit();sciEnableNotification(sciREG, SCI_RX_INT);/* Set high end timer GIO port hetPort pin direction to all output */gioSetDirection(hetPORT1, 0xFFFFFFFF);/* Enable RTI Compare 0 interrupt notification */rtiEnableNotification(rtiNOTIFICATION_COMPARE0);/* Enable IRQ - Clear I flag in CPS register *//* Note: This is usually done by the OS or in an svc dispatcher */_enable_IRQ();/* Start RTI Counter Block 0 */rtiStartCounter(rtiCOUNTER_BLOCK0);//让HET1[31]闪烁5次for( i=0; i<10; i++){gioSetPort(hetPORT1, gioGetPort(hetPORT1) ^ (1<<31));my_delay(1000);}systemREG1->SYSECR = 0x8000;    //软件复位/* Run forever */while(1){//gioSetPort(hetPORT1, gioGetPort(hetPORT1) ^ (1<<0));my_delay(1000);}/* USER CODE END */return 0;
}/* USER CODE BEGIN (4) */
/* Note-You need to remove rtiNotification from notification.c to avoid redefinition */
void rtiNotification(uint32_t notification)
{/*  enter user code between the USER CODE BEGIN and USER CODE END. *//* Toggle HET pin 0 */gioSetPort(hetPORT1, gioGetPort(hetPORT1) ^ (1<<17));}
/* USER CODE END */

在主程序中,先初始化IO,然后让HET1[31]闪烁5次,然后让程序软复位,因为应用程序要放到0x00180000位置,所以要修改cmd文件

/*                                                                            */
/*----------------------------------------------------------------------------*/
/* USER CODE BEGIN (0) */
/* USER CODE END *//*----------------------------------------------------------------------------*/
/* Linker Settings                                                            */--retain="*(.intvecs)"/* USER CODE BEGIN (1) */
/* USER CODE END *//*----------------------------------------------------------------------------*/
/* Memory Map                                                                 */MEMORY
{//VECTORS (X)  : origin=0x00000000 length=0x00000020VECTORS (X)  : origin=0x00180000 length=0x00000020//FLASH0  (RX) : origin=0x00000020 length=0x0017FFE0FLASH1  (RX) : origin=0x00180020 length=0x0001FFE0STACKS  (RW) : origin=0x08000000 length=0x00001500RAM     (RW) : origin=0x08001500 length=0x0003EB00/* USER CODE BEGIN (2) */
/* USER CODE END */
}/* USER CODE BEGIN (3) */
/* USER CODE END *//*----------------------------------------------------------------------------*/
/* Section Configuration                                                      */SECTIONS
{.intvecs : {} > VECTORS//.text    : {} > FLASH0 | FLASH1//.const   : {} > FLASH0 | FLASH1//.cinit   : {} > FLASH0 | FLASH1//.pinit   : {} > FLASH0 | FLASH1.text    : {} > FLASH1.const   : {} > FLASH1.cinit   : {} > FLASH1.pinit   : {} > FLASH1.bss     : {} > RAM.data    : {} > RAM.sysmem  : {} > RAM/* USER CODE BEGIN (4) */
/* USER CODE END */
}/* USER CODE BEGIN (5) */
/* USER CODE END *//*----------------------------------------------------------------------------*/
/* Misc                                                                       *//* USER CODE BEGIN (6) */
/* USER CODE END */
/*----------------------------------------------------------------------------*/

因为程序要在0x00180000开始,所将起始地址改为0x00180000,屏蔽FLASH0,SECTIONS中的段放在FLASH1中,编译程序,此时不能仿真因为程序不是下载到0地址的

3.烧写引导程序和应用程序

用TI的CCS UniFlash工具一次性烧写引导和应用程序

点Add选择引导和应用程序的out文件,点击Program,按下开发板上的复位键,可以观察到HET1[0]闪烁5次后HET1[31]闪烁5次,然后重复,说明先运行了bootload程序,然后运行了应用程序,应用程序运行完后程序复位,又运行bootload程序。

TMS570学习2-bootload跳转实验相关推荐

  1. Arduino小白的学习记录:RGB-LED传感器实验

    在上一个实验中我们介绍了双色LED灯的实验,但如果仅有两种颜色是不是觉得有些单调呢,接下来就让我们通过这个实验来组合出更多的颜色吧! 一.介绍 RGB-LED模块可以发出各种颜色的光.红色.绿色和蓝色 ...

  2. 汇编学习笔记:对抗反汇编实验2019092801

    汇编学习笔记:对抗反汇编实验2019092801 实验描述 实验环境 实验过程 实验结论 实验描述 使用相连的jz和jnz指令跳转到紧接着jnz指令的call指令的第二个字节.call指令实际上无效. ...

  3. 【跃迁之路】【578天】程序员高效学习方法论探索系列(实验阶段335-2018.09.06)...

    [跃迁之路][578天]程序员高效学习方法论探索系列(实验阶段335-2018.09.06) @(跃迁之路)专栏 [跃迁之路]奖励金计划正式开始 从2018.7.1起,[跃迁之路]奖励金计划正式起航, ...

  4. 8086汇编学习小记-王爽汇编语言实验12

    8086汇编学习小记-王爽汇编语言实验12 0号中断处理程序,开始安装在0000:0200处的程序最后用死循环导致显示不出'divided error',改成直接退出就正常显示了.注意修改ss,sp之 ...

  5. 学习通信原理之——从实验中理解频谱/功率谱/功率谱密度(MATLAB演示)

    我的个人博客文章链接如下:学习通信原理之--从实验中理解频谱/功率谱/功率谱密度(MATLAB演示) 前言 最近在复习通信原理,每次到了功率谱这一块就感到困惑,每次都要去查,我觉得不能再这样循环下去了 ...

  6. 根据今天时星期几,输出当天工作安排,学校安排周一到周五学习编程,周六上机实验,周日休息 例如: 键盘上输入4,控制台输出学习编程

    //根据今天时星期几,输出当天工作安排,学校安排周一到周五学习编程,周六上机实验,周日休息 例如: 键盘上输入4,控制台输出学习编程 import java.util.Scanner; public ...

  7. 【深度学习基础】数字手势识别实验:1.任务描述

    本实验系列文章目录如下,相关代码(python)托管在我的Github - SIGNS experiment,欢迎访问: 1.任务描述 2.MLP 3.Momentum 4.Batch-Norm 5. ...

  8. 【深度学习基础】数字手势识别实验:2.MLP

    本实验系列文章目录如下,相关代码(python)托管在我的Github - SIGNS experiment,欢迎访问: 1.任务描述 2.MLP 3.Momentum 4.Batch-Norm 5. ...

  9. TMS570学习【1】了解什么是TMS570

    TMS570学习[1]了解什么是TMS570 鉴于TMS570的功能强大,在嵌入式中超高性能的地位,因此本明同学开始对TMS570的学习和应用,当然还是以应用为主哈,毕竟是个机械的工科生,向大家分享一 ...

最新文章

  1. iOS技术篇1-CocoaPods
  2. C语言中 指针强化训练之 memcpy
  3. Swift面向对象基础(上)——Swift中的类和结构体(下)
  4. 如何对依赖ZooKeeper的代码写单元测试
  5. 使用“另类” Cloud Foundry Gradle插件无需停机
  6. 链表node中保存的是什么_Redis源码解析一 --链表结构
  7. 开源 非开源_开源突破“舒适区”
  8. 60-270-040-源码-指标监测-Flink自定义metric监控流入量
  9. Linux系统基本操作(一)—光盘挂载/卸载
  10. 提升开发者安全的七大可行实践
  11. word | word一键排版 | word极速排版 | 真正的一键排版
  12. matlab数字信号处理程序,MATLAB数字信号处理 85个案例分析 全书程序
  13. 反斜杠“\”的几个用法!
  14. c语言编程矩阵范数,矩阵2范数计算 这个二阶矩阵的二范数怎么
  15. 关于求两个球相交部分体积计算
  16. 【办公协作软件】万彩办公大师教程丨全能文档转换工具
  17. CSS3火焰文字特效制作教程
  18. qq邮箱的er图_QQ邮箱正确格式
  19. 生于忧患,死于安乐。
  20. 产品 · B端生意的定义和分类

热门文章

  1. Nginx源码从模块开发入手,3个项目弄透nginx模块开发丨Linux服务器开发丨C++后端开发丨中间件开发丨分布式丨web服务器
  2. 电大计算机理工英语19年秋季,电大3894《理工英语1》单元自测7网上形考作业答案最新(课程号:04005)...
  3. The friend said jokingly, what? Give me five hundred million
  4. 2021年化工自动化控制仪表考试总结及化工自动化控制仪表操作证考试
  5. LeetCode1609. 奇偶树
  6. 录音-语音流(pyAudio)
  7. TMS320F28335-CAN模块编程
  8. 实战gdbserver
  9. iframe屏蔽内部超链接点击(iframe onload)
  10. STM8105X4 AD采样