电子说
内容提要
引言
云途配置工具(YCT - Yuntu Config Tool)自去年Q4推出以来,已经有不少云途车规MCU的客户在实际项目使用了。它简明快捷高效的SDK和MCAL配置界面以及强大的工具链整合能力大大提高了用户汽车电子ECU应用代码的开发效率,深受好评。
Tips:关于云途YCT工具的功能特性(features)、下载安装和使用请参考以下公众号文章(点击文章标题即可直接跳转阅读):
《云途配置工具(YCT)快速上手指南(QSG)》
随着云途车规MCU型号的日益增加(cover越来越多汽车电子应用),云途SDK和MCAL也在不断升级,作为配套的图形化配置工具YCT也进行了若干次升级,在修改已知bug的同时也新增了不少新功能。
最近,云途车规MCU的非AUTSOAR架构驱动软件包 - YTM32 SDK进行了一次比较大的升级,强烈推荐大家将之前使用的SDK升级到最新的RTM v1.1.1版本,以快速修改已知云途车规MCU外设底层驱动代码的bug及硬件勘误表(Errata)的Workaroud,以下为YTM32 SDK RTM v1.1.1版本的Release note的下载链接,供大家参考:
为了方便大家进行SDK的快速升级替换,特撰写本文介绍升级YCT创建的云途SDK配置工程的详细步骤和方法。
确认当前应用工程的YCT配置工程使用的SDK/MCAL版本
打开应用工程根目录下的YCT工程,在YCT的顶行Home菜单旁边即为当前YCT工程使用的SDK或者MCAL的版本信息。
MCAL的YCT配置工程:
SDK的YCT配置工程:
确认要升级目标版本的SDK/MCAL软件包已经安装好
通过YCT主页界面的SDK/MCAL升级界面确实确认要升级目标版本的SDK/MCAL软件包已经安装好,比如本文想要将上面的MD14的v0.8.1版本SDK的应用工程升级到v1.1.1版本:
修改YCT文件中的SDK版本信息
使用任意文本编辑器,比如Notepad++或者在VSCode中双击打开工程根目录下的yct文件,Ctrl + F查找“sdkVersion”配置:
将其从原有的“0_8_1”修改为新版本“1_1_1”,并保存:
修复YCT工程中的SDK外设差异配置error
接下来,使用YCT工具打开上一步骤修改后的应用工程YCT文件,修改Problems窗口提示的所有配置error。
本文示例工程,打开后有eTMR/PWM和CAN两个配置报错,下面介绍具体修复方法。
4.1 修复CAN驱动模块的波特率配置错误
在v0.8.1版本SDK的CAN通信波特率配置中传输段(Propagation Segment)、相位段1(Phase Segment 1)、相位段2(Phase Segment 2)和时钟预分频因子(Prescaler Division factor)在配置时会将配置值减1写入FlexCAN模块的寄存器,而在新版本v1.1.1 SDK中这些配置将被直接写入FlexCAN模块的寄存器,因此,为了实现相同的波特率(500Kbit/s)相应的配置值需要减1。
v0.8.1版本的CAN波特率配置在v1.1.1中为错误配置:
v1.1.1版本SDK中相应波特率(500kbit/s)的正确配置如下:
4.2 修改eTMR/PWM驱动模块的配置错误
v1.1.1版本SDK相对于之前老版本的SDK驱动和配置界面做了一些bug修改,因为需要先Disable ETMR模块的配置,然后重新Enable进行配置才能解决相关error。
首先、Disable ETMR驱动模块,之前的配置信息将全部丢失:
然后,重新Enable ETMR模块,添加Common配置:
使能PWM配置,并根据原有工程的需求添加PWM通道配置:
Tips:为了减少应用代码中调用SDK配置参数的修改,需要将以上ETMR驱动模块的Common和PWM配置的配置结构体名字和配置参数保持与原工程相同。
重新生成工程和替换SDK底层驱动
将以上配置error全部修复之后,点击保存(Save),然后重新生成(Generate):
点击确认覆盖(OverWrite)原有工程的SDK驱动静态代码即可完成SDK驱动更新和版本升级:
Tips:连续点击多个文件覆盖后,YCT会提示是否覆盖所有文件,点击“OK”确认即可快速完成覆盖替换:
重新编译应用工程,修改编译错误
重新编译工程,根据编译错误和SDK releasenote中的bug list,修复/调整所有SDK API的参数,比如PWM占空比更新函数--eTMR_DRV_UpdatePwmChannel()的0.8.1与1.1.1版本SDK的差异如下:
------------------------------------------------------------- //v10.8.1 SDK: ------------------------------------------------------------- /*! * @brief This function updates the waveform output in PWM mode (duty cycle and phase). * * @param [in] instance The eTMR peripheral instance number. * @param [in] channel The channel number. In combined mode, the code finds the channel. * @param [in] typeOfUpdate The type of PWM update in the duty cycle/pulse or in ticks. * @param [in] alignMode The alignment of PWM update in the duty cycle/pulse or in ticks. * @param [in] dutyCycle Duty cycle of PWM. * @param [in] offset the offset from counter initial value to the first rising edge. * It is used for asymmetrical alignment pwm. When in edge align and * center align pwm mode, it is forced to 0. * @return success * - STATUS_SUCCESS : Completed successfully. * - STATUS_ERROR : Error occurred. */ status_t eTMR_DRV_UpdatePwmChannel(uint32_t instance, uint8_t channel, etmr_pwm_update_option_t typeOfUpdate, etmr_pwm_align_mode_t alignMode, uint32_t dutyCycle, uint32_t offset); ------------------------------------------------------------- //v1.1.1 SDK: ------------------------------------------------------------- /*! * @brief This function updates the waveform output in PWM mode (duty cycle and phase). * * @param [in] instance The eTMR peripheral instance number. * @param [in] channel The channel number. In combined mode, the code finds the channel. * @param [in] dutyCycle Duty cycle of PWM. * @param [in] offset The offset from counter initial value to the first rising edge. * It is used for asymmetrical alignment pwm. When in edge align and * center align pwm mode, it is forced to 0. * @return success * - STATUS_SUCCESS : Completed successfully. * - STATUS_ERROR : Error occurred. */ status_t eTMR_DRV_UpdatePwmChannel(uint32_t instance, uint8_t channel, uint32_t dutyCycle, uint32_t offset);
在新版本SDK中,该API函数少了typeOfUpdate和alignMode两个参数,需要将其删除。
另外,PWM通道参数配置结构体etmr_pwm_param_t的通道配置成员名由*pwmIndependentChannelConfig改为了*pwmChannelConfig,也需要做相应的调整:
------------------------------------------------------------- //v0.8.1 SDK: ------------------------------------------------------------- /*! * @brief eTMR driver PWM parameters * * Implements : etmr_pwm_param_t_Class */ typedef struct { uint8_t nNumIndependentPwmChannels; /*!< Number of independent PWM channels */ etmr_channel_mode_t mode; /*!< eTMR pwm mode */ uint32_t uFrequencyHZ; /*!< PWM period in Hz */ etmr_counter_init_src_t counterInitSrc; /*!< Counter initial value source */ etmr_independent_ch_param_t *pwmIndependentChannelConfig; /*!< Configuration for independent PWM channels */ #if (0 == FEATURE_eTMR_SUPPORT_CHANEL_DEADTIME) uint16_t evenDeadTime; /*!< Enable/disable dead time for channel 0,2,4,6 */ uint16_t oddDeadTime; /*!< Enable/disable dead time for channel 1,3,5,7 */ #endif etmr_fault_param_t *faultConfig; /*!< Configuration for PWM fault */ } etmr_pwm_param_t; ------------------------------------------------------------- //v1.1.1 SDK: ------------------------------------------------------------- /*! * @brief eTMR driver PWM parameters * * Implements : etmr_pwm_param_t_Class */ typedef struct { uint8_t nNumPwmChannels; /*!< Number of independent PWM channels */ etmr_channel_mode_t mode; /*!< eTMR pwm mode */ uint32_t uFrequencyHZ; /*!< PWM period in Hz */ #if FEATURE_eTMR_HAS_CNT_INIT_SRC bool counterInitValFromInitReg; /*!< Counter initial value source from INIT register or not */ #endif uint32_t cntVal; /*!< Counter initial value from CNT register */ etmr_pwm_ch_param_t *pwmChannelConfig; /*!< Configuration for independent PWM channels */ #if !FEATURE_eTMR_DEADTIME_CONFIG_EACH_CHANNEL etmr_deadtime_param_t *deadtimeConfig; /*!< Configuration for PWM dead time */ #endif etmr_fault_param_t *faultConfig; /*!< Configuration for PWM fault */ } etmr_pwm_param_t;
PWM占空比更新API函数调用修改如下:
v0.8.1版本SDK调用:
/* update the PWM output duty cycle */ eTMR_DRV_UpdatePwmChannel(eTMR_INST, eTMR0_CH5_PWM_Config.pwmIndependentChannelConfig[0].hwChannelId, etmrStatePtr[eTMR_INST]->typeOfUpdate, etmrStatePtr[eTMR_INST]->alignMode, (0x8000U * pwm_duty), 0x0000U);
v1.1.1版本SDK调用:
/* update the PWM output duty cycle */ eTMR_DRV_UpdatePwmChannel(eTMR_INST, eTMR0_CH5_PWM_Config.pwmChannelConfig[0].hwChannelId, (0x8000U * pwm_duty), 0x0000U);
修复所有编译error后,编译成功即完成SDK升级:
总结
本文详细介绍了基于YCT的云途SDK配置工程升级方法,希望对大家有所帮助。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !