[综合信息] 华大 MCU 之一 HC32F460 替换 STM32F411 移植记录

[复制链接]
2520|38
 楼主| 我爱台妹mmd 发表于 2021-11-29 10:25 | 显示全部楼层 |阅读模式
简介
  目前,部分产品需要国产化,首当其冲的就是更换国产 MCU。在经过几番研究之后,最终决定使用华大的 MCU 来代替(STM32F411 -> HC32F460)。工作的重点就是如何将现有项目代码一点点移植到 HC32F460 上。以下就是一些在移植过程中的记录。

首先从官网 https://www.hdsc.com.cn/ 下载各种资料、开发包


5929161a43a028cf43.png

开发环境

当前所以开发环境中,默认都没有华大的 MCU。因此,需要我们自己从华大的官网下载各 IDE 的配套工具包进行安装,具体有以下几个方面:


 楼主| 我爱台妹mmd 发表于 2021-11-29 10:26 | 显示全部楼层
MCU 选择
  默认 Keil 和 IAR 中并没有华大的 MCU,必须从其官网下载开发工具包,然后进行安装!实际使用中发现,安装之后的虽然可以选择华大 MCU,但是,里面竟然没有我对应的 MCU 类型。
 楼主| 我爱台妹mmd 发表于 2021-11-29 10:27 | 显示全部楼层
 楼主| 我爱台妹mmd 发表于 2021-11-29 10:28 | 显示全部楼层
貌似,目前其开发包中仅提供了几个类型的 MCU。包括下载算法,都没有我使用的 MCU 的!不过好在我们可以选择一个资源多一些的 MCU 下载算法代替!
 楼主| 我爱台妹mmd 发表于 2021-11-29 10:29 | 显示全部楼层
下载算法
  安装了早期的开发包(1.0.2)后,貌似并没有对应的 FLASH 下载算法,至少 Keil 里面不会显示下载算法。解决方法是:将华大提供的下载算法 Flash_HC32F46x.FLM (位于其开发包中对应的开发环境目录下)放到 Keil 的安装目录下的 D:\Keil_v5\ARM\Flash 中。不过,最新我从官网下载了最新 1.0.5 版本并安装,Keil 就可以显示 FLASH 下载算法了!
 楼主| 我爱台妹mmd 发表于 2021-11-29 10:31 | 显示全部楼层
 楼主| 我爱台妹mmd 发表于 2021-11-29 10:31 | 显示全部楼层
注意:如果想更新对应的驱动库,可要谨慎!我看了一下,新的驱动库与旧的并不兼容!
 楼主| 我爱台妹mmd 发表于 2021-11-29 10:32 | 显示全部楼层
Jlink/J-Flash 的配置
  如果开发中使用 Jlink 进行仿真调试,那么经常会用到 J-Flash 来读写 MCU。默认情况下 Jlink 中也是没有华大 MCU 的。解决方法是,手动编辑 Jlink 的安装目录下的配置文件
 楼主| 我爱台妹mmd 发表于 2021-11-29 10:34 | 显示全部楼层
JLinkDevices.xml,增加如下内容:
  1.   <!--                 -->
  2.   <!-- HDSC (HC32) -->
  3.   <!--                 -->
  4.   <Device>
  5.   <ChipInfo Vendor="HDSC" Name="HC32L176"  WorkRAMAddr="0x20000000" WorkRAMSize="0x2000" Core="JLINK_CORE_CORTEX_M0"/>
  6.   <FlashBankInfo Name="Flash_128K" BaseAddr="0x0" MaxSize="0x20000" Loader="Devices/HDSC/FlashHC32L17X_128K.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" AlwaysPresent="1"/>
  7.   </Device>
  8.   <Device>
  9.     <ChipInfo Vendor="HDSC" Name="HC32L136"  WorkRAMAddr="0x20000000" WorkRAMSize="0x2000" Core="JLINK_CORE_CORTEX_M0"/>
  10.     <FlashBankInfo Name="Flash_64K" BaseAddr="0x0" MaxSize="0x10000" Loader="Devices/HDSC/FlashHC32L13X_64K.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" AlwaysPresent="1"/>
  11.   </Device>
  12.   <Device>
  13.     <ChipInfo Vendor="HDSC" Name="HC32L130"  WorkRAMAddr="0x20000000" WorkRAMSize="0x2000" Core="JLINK_CORE_CORTEX_M0"/>
  14.     <FlashBankInfo Name="Flash_64K" BaseAddr="0x0" MaxSize="0x10000" Loader="Devices/HDSC/FlashHC32L13X_64K.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" AlwaysPresent="1"/>
  15.   </Device>
  16.   <Device>
  17.     <ChipInfo Vendor="HDSC" Name="HC32F030"  WorkRAMAddr="0x20000000" WorkRAMSize="0x2000" Core="JLINK_CORE_CORTEX_M0"/>
  18.     <FlashBankInfo Name="Flash_64K" BaseAddr="0x0" MaxSize="0x10000" Loader="Devices/HDSC/FlashHC32F030_64K.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" AlwaysPresent="1"/>
  19.   </Device>  
  20.   <Device>
  21.     <ChipInfo Vendor="HDSC" Name="HC32L110x4"  WorkRAMAddr="0x20000000" WorkRAMSize="0x800" Core="JLINK_CORE_CORTEX_M0"/>
  22.     <FlashBankInfo Name="Flash_16K" BaseAddr="0x0" MaxSize="0x4000" Loader="Devices/HDSC/FlashHC32L110_16K.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" AlwaysPresent="1"/>
  23.   </Device>  
  24.   <Device>
  25.     <ChipInfo Vendor="HDSC" Name="HC32L110x6"  WorkRAMAddr="0x20000000" WorkRAMSize="0x1000" Core="JLINK_CORE_CORTEX_M0"/>
  26.     <FlashBankInfo Name="Flash_32K" BaseAddr="0x0" MaxSize="0x8000" Loader="Devices/HDSC/FlashHC32L110_32K.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" AlwaysPresent="1"/>
  27.   </Device>
  28.   <Device>
  29.     <ChipInfo Vendor="HDSC" Name="HC32F003"  WorkRAMAddr="0x20000000" WorkRAMSize="0x800" Core="JLINK_CORE_CORTEX_M0"/>
  30.     <FlashBankInfo Name="Flash_16K" BaseAddr="0x0" MaxSize="0x4000" Loader="Devices/HDSC/FlashHC32F003_16K.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" AlwaysPresent="1"/>
  31.   </Device>  
  32.   <Device>
  33.     <ChipInfo Vendor="HDSC" Name="HC32F005"  WorkRAMAddr="0x20000000" WorkRAMSize="0x1000" Core="JLINK_CORE_CORTEX_M0"/>
  34.     <FlashBankInfo Name="Flash_32K" BaseAddr="0x0" MaxSize="0x8000" Loader="Devices/HDSC/FlashHC32F005_32K.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" AlwaysPresent="1"/>
  35.   </Device>
  36.   <Device>
  37.     <ChipInfo Vendor="HDSC" Name="HC32L15"  WorkRAMAddr="0x20000000" WorkRAMSize="0x1800" Core="JLINK_CORE_CORTEX_M0"/>
  38.     <FlashBankInfo Name="Flash_128K" BaseAddr="0x0" MaxSize="0x20000" Loader="Devices/HDSC/HC32L15.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" AlwaysPresent="1"/>
  39.   </Device>
  40.   <Device>
  41.     <ChipInfo Vendor="HDSC" Name="HC32F_M14"  WorkRAMAddr="0x20000000" WorkRAMSize="0x2000" Core="JLINK_CORE_CORTEX_M0"/>
  42.     <FlashBankInfo Name="Flash_128K" BaseAddr="0x0" MaxSize="0x20000" Loader="Devices/HDSC/HC32F_M14.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" AlwaysPresent="1"/>
  43.   </Device>
  44.   <Device>
  45.     <ChipInfo Vendor="HDSC" Name="HC32F46x"  WorkRAMAddr="0x20000000" WorkRAMSize="0x10000" Core="JLINK_CORE_CORTEX_M4"/>
  46.     <FlashBankInfo Name="Flash_512K" BaseAddr="0x0" MaxSize="0x80000" Loader="Devices/HDSC/HC32F46x.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" AlwaysPresent="1"/>
  47.   </Device>
  48.   <Device>
  49.     <ChipInfo Vendor="HDSC" Name="HC32L19x"  WorkRAMAddr="0x20000000" WorkRAMSize="0x8000" Core="JLINK_CORE_CORTEX_M0"/>
  50.     <FlashBankInfo Name="Flash_256K" BaseAddr="0x0" MaxSize="0x40000" Loader="Devices/HDSC/FlashHC32L19X_256K.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" AlwaysPresent="1"/>
  51.   </Device>
  52.   <Device>
  53.     <ChipInfo Vendor="HDSC" Name="HC32F19x"  WorkRAMAddr="0x20000000" WorkRAMSize="0x8000" Core="JLINK_CORE_CORTEX_M0"/>
  54.     <FlashBankInfo Name="Flash_256K" BaseAddr="0x0" MaxSize="0x40000" Loader="Devices/HDSC/FlashHC32F19X_256K.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" AlwaysPresent="1"/>
  55.   </Device>
  56.   <Device>
  57.     <ChipInfo Vendor="HDSC" Name="HC32F17x"  WorkRAMAddr="0x20000000" WorkRAMSize="0x4000" Core="JLINK_CORE_CORTEX_M0"/>
  58.     <FlashBankInfo Name="Flash_128K" BaseAddr="0x0" MaxSize="0x20000" Loader="Devices/HDSC/FlashHC32F17X_128K.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" AlwaysPresent="1"/>
  59.   </Device>
  60.   <Device>
  61.     <ChipInfo Vendor="HDSC" Name="HC32L17x"  WorkRAMAddr="0x20000000" WorkRAMSize="0x4000" Core="JLINK_CORE_CORTEX_M0"/>
  62.     <FlashBankInfo Name="Flash_128K" BaseAddr="0x0" MaxSize="0x20000" Loader="Devices/HDSC/FlashHC32L17X_128K.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" AlwaysPresent="1"/>
  63.   </Device>
  64.   <Device>
  65.     <ChipInfo Vendor="HDSC" Name="HC32F072"  WorkRAMAddr="0x20000000" WorkRAMSize="0x4000" Core="JLINK_CORE_CORTEX_M0"/>
  66.     <FlashBankInfo Name="Flash_128K" BaseAddr="0x0" MaxSize="0x20000" Loader="Devices/HDSC/FlashHC32F072_128K.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" AlwaysPresent="1"/>
  67.   </Device>
  68.   <Device>
  69.     <ChipInfo Vendor="HDSC" Name="HC32L07X"  WorkRAMAddr="0x20000000" WorkRAMSize="0x4000" Core="JLINK_CORE_CORTEX_M0"/>
  70.     <FlashBankInfo Name="Flash_128K" BaseAddr="0x0" MaxSize="0x20000" Loader="Devices/HDSC/FlashHC32L07X_128K.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" AlwaysPresent="1"/>
  71.   </Device>

评论

注意,如果升级了 Jlink 驱动,需要重新更改以上内容!  发表于 2021-11-29 10:45
 楼主| 我爱台妹mmd 发表于 2021-11-29 10:46 | 显示全部楼层
驱动库移植
这个不是很麻烦,根据下面的图,对应到原 ST 的目录结构中即可
9303961a43eda63284.png
 楼主| 我爱台妹mmd 发表于 2021-11-29 10:48 | 显示全部楼层
启动引脚
  HC32F460 的 BOOT 引脚(PB11)接高电平为从 Flash 启动,低电平为从 BOOT 启动。与 ST 正好相反。下面是 ST 和 华大 文档中的说明:
1576561a43f1983e6f.png
 楼主| 我爱台妹mmd 发表于 2021-11-29 10:54 | 显示全部楼层
驱动库中断处理
  HC32F460 的驱动库提供了一个 hc32f46x_interrupts.c/h 的文件,该文件将所有的中断进行了统一的处理,然后以弱函数的形式开发对外接口(hc32f46x_it.c 中定义的函数均为 hc32f46x_interrupts.c/h 中声明的弱函数接口)。但是,其弱函数的使用貌似并不是很规范。在我的项目中,弱函数并没有起作用,导致了中断接口不能用。具体解决方法:

修改驱动库,具体可以参考 ST 的 HAL 库中对于弱函数的使用
增加一个连接器参数,如下图所示:
7123461a440b9d4176.png

评论

这么搞,弱函数的使用上不就复杂了?多此一举了?  发表于 2021-11-29 10:55
 楼主| 我爱台妹mmd 发表于 2021-11-29 10:56 | 显示全部楼层
在实际使用中,大部分中断(中断号 32 ~ 127)必须先定义一个回调函数,然后将使用的中断注册到 hc32f46x_interrupts.c/h 中定义的方法表中。例如:
  1.     /* Select External Int Ch.3 */
  2.     stcIrqRegiConf.enIntSrc = INT_PORT_EIRQ3;
  3.     /* Register External Int to Vect.No.007 */
  4.     stcIrqRegiConf.enIRQn = Int007_IRQn;
  5.     /* Callback function */
  6.     stcIrqRegiConf.pfnCallback = &ExtInt03_Callback;    /* 这里定义一个回调函数 */
  7.     /* Registration IRQ */
  8.     enIrqRegistration(&stcIrqRegiConf);
 楼主| 我爱台妹mmd 发表于 2021-11-29 10:58 | 显示全部楼层
对于不需要注册的中断,则直接定义弱函数接口。例如:
  1. /**
  2. *******************************************************************************
  3. ** \brief SysTick interrupt callback function.
  4. **
  5. ** \param None
  6. **
  7. ** \retval None
  8. **
  9. ******************************************************************************/
  10. void SysTick_IrqHandler(void)
  11. {
  12.     SysTick_IncTick();
  13. }
 楼主| 我爱台妹mmd 发表于 2021-11-29 10:59 | 显示全部楼层
个人感觉这个文件真的是多此一举!在启动的 .s 文件中,各中断处理函数接口都已经声明并以死循环来处理了。这里把中断再以另一个名字放出去,完全就是为了增加代码量,在使用上没有任何便捷之处。这个文件编译后就近 10K 的代码量,然后还得占一堆 RAM!有没有考虑过 MCU 100 多个中断实际才用几个,一股脑全给搞一块去了!
wubangmi 发表于 2021-11-29 11:01 | 显示全部楼层

华大的KEIL  IDE 包官网都已经升级到1.0.8了,你还在用1.0.5,没找到HC32F460KCTA,怪你自己
 楼主| 我爱台妹mmd 发表于 2021-11-29 11:27 | 显示全部楼层
9690561a4425bd166a.png

评论

关于弱函数的使用,请参考博文 ARM 之十一__weak 和 attribute((weak)) 关键字的使用  发表于 2021-11-29 11:28
wubangmi 发表于 2021-11-29 12:36 | 显示全部楼层
我爱台妹mmd 发表于 2021-11-29 10:59
个人感觉这个文件真的是多此一举!在启动的 .s 文件中,各中断处理函数接口都已经声明并以死循环来处理了。 ...

你可以根据自己的需求精简啊,比如把中断号128开始的共享中断全部屏蔽掉。那样中断部分的代码量就很少了
 楼主| 我爱台妹mmd 发表于 2021-11-29 13:08 | 显示全部楼层
由于 FLASH 空间不足,目前正在更换 HC32F460KETA
 楼主| 我爱台妹mmd 发表于 2021-11-29 13:09 | 显示全部楼层
看门狗
  目前,看门狗(SWDT)的配置可以必须在库文件 hc32f46x_icg.h 中进行配置(WDT 可以使用 hc32f46x_wdt.c/h 中进行配置),然后将 hc32f46x_icg.c 包含到自己的项目中,否则配置依旧无效!在更改了驱动库源码之后,在更新驱动库时需要注意!
  此外,上面这种配置方**间接导致一个问题:由于我们的程序分为 IAP 和 APP 两部分。看门狗的配置必须放到 IAP 中,且 APP 中不能再包含该文件,否则在调试烧写时会报错!具体见下文的 [程序下载异常] 章节
您需要登录后才可以回帖 登录 | 注册

本版积分规则

72

主题

648

帖子

0

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