[G32R] R501-将工程从DSP28025移植到G32R501的经验总结(pin2pin)

[复制链接]
75|1
zyz0926 发表于 2025-11-29 14:07 | 显示全部楼层 |阅读模式
本帖最后由 zyz0926 于 2025-11-29 14:17 编辑

#申请原创# #技术资源#

1 工程基本情况
产品代码使用TI的芯片,控制两台步进电机,使用的是025芯片,准备切换到G32R501平台要实现的是pin-2-pin,硬件无需更改,直接更换芯片
软件架构为:初始化+背景处理+中断处理,中断为20KHz,重点使用的外设包括IIC,CAN,ECAP,ADC,PWM等。中断包括PWM1中断,主要处理步进电机运行逻辑函数;CANA0中断,主要处理CAN通信以及数据处理,ECAP1中断,主要获取位置反馈脉冲,计算当前位置。程序功能实现上较为简单,但是涵盖的处理内容较多。

2 移植遇到的问题及解决方案2.1 AIO配置的差异以及SDK存在的问题
首先在硬件上,DSP28025R501AIO的管脚上就存在差异,需要对比用户的硬件原理图以及极海G32R501的封装图,一一进行比对来确认。如下图所示,在部分区域内的AIO引脚需要仔细参考极海G32R501数据手册,一一进行比对。

98664692a8dca84ca8.png
file:///C:/Users/apex/AppData/Local/Temp/ksohtml5452/wps1.jpg

下图为产品代码在025上对AIO引脚的配置代码如下,但是,极海R501AIO功能在外设配置上,是没有复用功能,是不需要进行复用管脚的函数配置的。
//AI0233 for JMP6  pin14=AI0253 A15
GPI0 setPinConfig(GPI0_253_GPI0253);
GPIO setAnalogMode(253,GPIO ANALOG_DISABLED);//SET as AIOGPIO
GPI0 setQualificationMode(253GPIO_QUAL_6SAMPLE);
GPI0 setQualificationPeriod(253,10);


R501在配置AIO时,是不需要加入GPIO_setPinConfig函数的,该函数定义如下,主要用于配置复用MUX
file:///C:/Users/apex/AppData/Local/Temp/ksohtml5452/wps2.jpg 85314692a8f4bd025f.png

同时,SDK上存在问题,导致248以上的AIO无法生效,需要更改driver_lib里面gpio.h中的GPIO_isPinValid函数,将上限247改到254即可。
file:///C:/Users/apex/AppData/Local/Temp/ksohtml5452/wps3.jpg 38397692a8de16c9ab.png

对原厂的建议:数据手册上,将具体的AIO号标注到芯片引脚排布图上面,现在的引脚分配图,还需要每个引脚去查具体的复用表格,非常麻烦,
7227692a8deb3f2c0.png
file:///C:/Users/apex/AppData/Local/Temp/ksohtml5452/wps4.jpg
2.2 025/039R501ePWM同步的硬件上存在较大差异
02x03xePWM同步设计上差异不大,但04xePWM同步策略做了较大改动。设计思想中的一个较大差异是,02xSyncInSyncOut信号选择都有disable选项,且后级模块可选择忽略同步信号,而04xdisable选项,只能由后级模块选择忽略该同步信号。此外,相关寄存器也有较大改动。R501要实现同等disable的功能,一个可能的配置是同步信号路径为:InputXBar5->EXTSYNCIN1->ePWMxSyncIn,然后将InputXBar5配置为接“1”或接“0”。

用户代码只用到一处同步信号,其他均配置为disable,恰好可以在R501上配置为相同的功能,但需要小幅重构用户代码。移植难点之一在于寄存器和driverlib API不一致,包括函数名,参数类型,和枚举名称。

用户接触这个问题的初期,对R501同步信号没有disable选项感到疑虑,认为通过置零PHSEN忽略同步信号,和disable同步信号虽然现象一致,但本质不同(客户原话“性质不同”)。后来客户通过对比阅读竞品的参考手册,对ePWM模块有了更深的理解,了解到SyncInePWM模块唯一的用途就是加载TBPHS寄存器到TBCTR,认可了置零PHSEN的替换方案。移植、调试完成后,初步测试PWM波形正常,待客户自行做更深入的测试。

但确如用户所说,R501的同步策略性质不同,同步信号是一定会传播的。如果不使用同步功能,则要么在前级配置同步信号输入为InputXBar并接至“0”或“1”电平,要么后级配置ePWMeCAP等模块忽略同步信号,都需要较多的修改和检查。

差异点
02x
04x
Sync 寄存器
ePWM.EPWMSYNCINSEL
ePWM.EPWMSYNCOUTEN
SysCtl.SyncSocRegs
SysCtl.SyncSocRegs ePWM.TBCTL.SYNCOSEL
Driverlib API
EPWM_setSyncInPulseSource()
SysCtl_setSyncInputConfig()
SyncIn信号
每个ePWM可选,由EPWMSYNCINSEL 配置。
可选disable
同步链分组,ePWM1/4/7 可选,其他 ePWM SyncIn 固定为上一个ePWMSyncOut。由SyncSocRegs.ePWMxSyncIn 配置。
disable选项。只能通过置零 PHSEN 忽略 SyncIn 信号。
SyncOut
每个 ePWM 可选,EPWMSYNCOUTEN 使能, SyncSocRegs.SYNCSELECT 选择。
可选 disable
每个 ePWM可选,TBCTL.SYNCOSEL 配置。
disable 选项。需后级模块配置为忽略同步信号。


下图为02x TRMSec 17.4.3.3)部分ePWM同步策略及寄存器。
file:///C:/Users/apex/AppData/Local/Temp/ksohtml5452/wps5.jpg
file:///C:/Users/apex/AppData/Local/Temp/ksohtml5452/wps6.jpg 93296692a8df87078b.png
file:///C:/Users/apex/AppData/Local/Temp/ksohtml5452/wps7.jpg 59196692a8dfe2fcb8.png
86135692a900bdcb02.png

file:///C:/Users/apex/AppData/Local/Temp/ksohtml5452/wps8.jpg 50828692a8e11c22ab.png

下图为04x TRMSec 18.4.3.3)部分ePWM同步策略及寄存器。
file:///C:/Users/apex/AppData/Local/Temp/ksohtml5452/wps9.jpg 94252692a8e19c7284.png
77114692a8e1f0ab54.png
14702692a8e25072fc.png

file:///C:/Users/apex/AppData/Local/Temp/ksohtml5452/wps10.jpg
file:///C:/Users/apex/AppData/Local/Temp/ksohtml5452/wps11.jpg

2.3 ADC采样问题
外部基准与内部基准的问题,本次遇到了ADC采样值为准确值的一半的问题,经过排查后,定位为:实际硬件上,接入了REF外部基准管脚3.3V电压,但是程序软件上,配置为内部基准,导致实际采样值为理论值的一半。更改客户的程序为外部基准参考即可。

2.4 025部分PINGPIO标号与R501存在差异
这个点容易忽略,举例说明,如下图所示,MOT2_CLK这个引脚,同为56号引脚,但是在025芯片上,可配置的GPIOGPIO40,在R501上,可配置的GPIOGPIO49。所以后续涉及到025R501的移植,需要对客户使用的所有GPIO统一进行一次排查。

file:///C:/Users/apex/AppData/Local/Temp/ksohtml5452/wps12.jpg 1228692a8e309d499.png

2.5 数据类型转换的问题
R501SDK已经做好了数据类型转换的定义,在g32r501_device.h文件里面,实际移植时,需要在客户的文件代码上,添加包含该头文件即可解决数据类型未定义的问题。
file:///C:/Users/apex/AppData/Local/Temp/ksohtml5452/wps13.jpg 1874692a8e3c4d4a6.png

2.6 CAN通讯函数的数据定义问题
主要的问题点在于传输的数据长度定义,按照025代码直接移植过来,会存在数据类型冲突的问题,需要更改025代码内的传输数组的数据类型定义,否则会存在实际数据读取错误的问题。
涉及到的函数包括CAN_sendMessageCAN_readMessage函数。
file:///C:/Users/apex/AppData/Local/Temp/ksohtml5452/wps14.jpg 48540692a8e43890a3.png

2.7 注意寄存器的写保护
由于客户的代码存在不规范的现象,主要在于客户的代码既用到了driver_lib,底层配置大部分是用库函数写的,使用库函数,函数里面自带写保护,不会存在问题,但客户同时也用到了bit_field,部分配置使用结构体寄存器直接写的,且客户的部分代码的寄存器读写并没有增加写保护,从而导致部分寄存器写入不生效的情况。这里在移植时,需要严格定义排查该项问题。

 楼主| zyz0926 发表于 2025-11-29 14:18 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

30

主题

62

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0