DSP TMS320F28335串口二阶bootloader详解

在上个公司因业务需要进行了28335的二阶boot开发 苦于网上相关资源过少,TI的网站又出身保密局 专业藏文档,自己历经一个月的摸索编写了boot驱动源程序,在这里将原理和内容分享给大家。

思路

将程序分为两个工程,即BOOT引导程序和用户程序,boot引导程序储存在单独的sector里,用户程序存在另外的sector,引导完成后使用指针进行跳转

生成HEX文件

.out文件不能直接进行BOOT烧写,需要将用户程序的.out文件转换为HEX,BOOT程序先用烧写器烧写进芯片,然后再讲HEX通过串口发送到芯片由BOOT程序完成烧写,这里可以使用HEX2000等工具软件完成,注意HEX文件格式应为 地址-数据 地址-数据 或一个地址(flash sector)后跟一坨数据,在分配BOOT程序地址时应注意不与用户程序地址冲突 否则会出现花里胡哨的BUG

CMD文件修改

因为28335的flash只能按sector擦除,Boot引导程序和用户程序需要储存在不同的Flash sectoer中,故需要在CMD文件中进行修改,先让程序进入Boot引导程序,进行要升级程序的接收,在RAM里运行擦除及烧写flash,然后再跳转到用户程序执行。
以将BOOT程序存在flashA为例 需要修改的地方如下:

 FLASHA      : origin = 0x338002, length = 0x007F7E     /* on-chip FLASH */
 BEGIN       : origin = 0x338000, length = 0x000002     /* Part of FLASHA.  Used for "boot to Flash" bootloader mode. */
				Flash28_API:
				{
					-lFlash28335_API_V210.lib(.econst)
					-lFlash28335_API_V210.lib(.text)
				} LOAD = FLASHA,
				RUN = RAML0,
				LOAD_START(_Flash28_API_LoadStart),
				LOAD_END(_Flash28_API_LoadEnd),
				RUN_START(_Flash28_API_RunStart),
				PAGE = 0


			   /* Allocate program areas: */
			   //.USER_CODE		   : > FLASHE      PAGE = 0
			   .cinit              : > FLASHA   PAGE = 0
			   .pinit              : > FLASHA   PAGE = 0
			   .text               : > FLASHA   PAGE = 0
			   codestart           : > BEGIN    PAGE = 0
			//	ramfuncs           : > FLASHH   PAGE = 0
			   ramfuncs            : LOAD = FLASHA,
			                         RUN = RAML0,
			                         LOAD_START(_RamfuncsLoadStart),
			                         LOAD_END(_RamfuncsLoadEnd),
			                         RUN_START(_RamfuncsRunStart),
			                         PAGE = 0

升级过程

当不需要升级程序时需要跳过Bootloader进入主程序,这里我的思路为等待超时0.5S未收到上位机指令则认为不需要升级程序,直接跳转到用程序,跳转代码如下:

#define FlashH 0x300000
Uint32 BeginAdress=FlashH; //为了后期可进行由上位机指定的地址烧写,可不用
inline void UserMain()
{
	(*(void(*)(void))BeginAdress)();
}

当需要进行烧写时,则用到了TI的flash API,协议可由自己拟定,若文件较小可采用单次接收完再烧写,文件较大则采用上位机分包。这里提供烧写示例和擦除示例:

char Erase_Sec_Once(Uint16 Sector)
{
	char outflag = 0xff;
	DINT;
	if(SysCtrlRegs.PLLSTS.bit.MCLKSTS==0)outflag=Flash_Erase(Sector, &FlashStatus);
	EINT;
    return outflag;
}
		if(Erase_Sec_Once(SECTORH|SECTORG|SECTORF|SECTORE|SECTORD|SECTORC|SECTORB)!= STATUS_SUCCESS) UartXmit("EraseErro\r\n");
		else UartXmit("OK\r\n");
    	if(Flash_Program((Uint16 *)ProgAdress,(Uint16 *)UartBuf,DatNum,&FlashStatus)!=STATUS_SUCCESS) UartXmit("ProgramErro\r\n");
   		else ProgAdress+=DatNum;

Flash_Erase和Flash_Program均为TI提供的API函数
烧写完成后由指针跳转到用户函数,即烧写的首地址

注意,进行BOOT烧写后不能再使用调试器进行烧写或调试,否则会覆盖掉boot程序,这里建议首先将用户程序调试完成再由BOOT烧写,
本程序的源码已经上传到我的CSDN下载里(来自白嫖党的凝视)(https://download.csdn.net/download/qq_35364022/11240579)
本程序不再免费开源,技术支持可联系主页qq。
本程序仅供参考,需要配合上位机软件才能正常使用,包含断点续传、指定地址等功能,希望有所帮助。

  • 17
    点赞
  • 126
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
TMS320F28335是一款数字信号处理器(DSP),它具有丰富的外设功能,包括串口通信功能。串口通信是一种常用的数据传输方式,可以实现设备之间的数据交换与通信。 TMS320F28335中的串口通信功能是通过中断来实现的。中断是一种处理器的特殊指令,当特定事件发生时,会中断正常的程序执行,转而执行中断服务程序。串口中断就是当接收到或发送完成一个字节的数据时,处理器会中断当前的程序执行,转而执行串口中断服务程序。 要使用TMS320F28335串口中断功能,首先需要配置串口通信的参数,如波特率、数据位宽等。然后,需要编写中断服务程序,即处理接收或发送数据的具体操作。可以根据需求选择中断类型,如接收中断、发送中断或接收/发送中断等。 在中断服务程序中,可以通过读取或写入相应的寄存器与串口进行数据交互。例如,可以通过读取接收缓冲寄存器来获取接收到的数据,或者通过写入发送缓冲寄存器来发送数据。 使用串口中断可以更好地处理数据的实时性和可靠性,能够充分利用处理器的性能。通过合理地设计中断服务程序,可以实现稳定高效的数据传输和通信。 总结来说,TMS320F28335串口中断功能能够实现可靠的数据传输与通信。通过配置串口参数和编写中断服务程序,可以灵活地使用串口中断功能,满足各种应用需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值