完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
简介
目前,部分产品需要国产化,首当其冲的就是更换国产 MCU。在经过几番研究之后,最终决定使用华大的 MCU 来代替(STM32F411 -> HC32F460)。工作的重点就是如何将现有项目代码一点点移植到 HC32F460 上。以下就是一些在移植过程中的记录。 首先从官网 下载各种资料、开发包 开发环境 当前所以开发环境中,默认都没有华大的 MCU。因此,需要我们自己从华大的官网下载各 IDE 的配套工具包进行安装,具体有以下几个方面: MCU 选择 默认 Keil 和 IAR 中并没有华大的 MCU,必须从其官网下载开发工具包,然后进行安装!实际使用中发现,安装之后的虽然可以选择华大 MCU,但是,里面竟然没有我对应的 MCU 类型。 貌似,目前其开发包中仅提供了几个类型的 MCU。包括下载算法,都没有我使用的 MCU 的!不过好在我们可以选择一个资源多一些的 MCU 下载算法代替! 下载算法 安装了早期的开发包(1.0.2)后,貌似并没有对应的 FLASH 下载算法,至少 Keil 里面不会显示下载算法。解决方法是:将华大提供的下载算法 Flash_HC32F46x.FLM (位于其开发包中对应的开发环境目录下)放到 Keil 的安装目录下的 D:Keil_v5ARMFlash 中。不过,最新我从官网下载了最新 1.0.5 版本并安装,Keil 就可以显示 FLASH 下载算法了! 注意:如果想更新对应的驱动库,可要谨慎!我看了一下,新的驱动库与旧的并不兼容!Jlink/J-Flash 的配置 如果开发中使用 Jlink 进行仿真调试,那么经常会用到 J-Flash 来读写 MCU。默认情况下 Jlink 中也是没有华大 MCU 的。解决方法是,手动编辑 Jlink 的安装目录下的配置文件 JLinkDevices.xml,增加如下内容: 注意,如果升级了 Jlink 驱动,需要重新更改以上内容! 驱动库移植 这个不是很麻烦,根据下面的图,对应到原 ST 的目录结构中即可 启动引脚 HC32F460 的 BOOT 引脚(PB11)接高电平为从 Flash 启动,低电平为从 BOOT 启动。与 ST 正好相反。下面是 ST 和 华大 文档中的说明: 驱动库中断处理 HC32F460 的驱动库提供了一个 hc32f46x_interrupts.c/h 的文件,该文件将所有的中断进行了统一的处理,然后以弱函数的形式开发对外接口(hc32f46x_it.c 中定义的函数均为 hc32f46x_interrupts.c/h 中声明的弱函数接口)。但是,其弱函数的使用貌似并不是很规范。在我的项目中,弱函数并没有起作用,导致了中断接口不能用。具体解决方法:
/* Select External Int Ch.3 */ stcIrqRegiConf.enIntSrc = INT_PORT_EIRQ3; /* Register External Int to Vect.No.007 */ stcIrqRegiConf.enIRQn = Int007_IRQn; /* Callback function */ stcIrqRegiConf.pfnCallback = &ExtInt03_Callback; /* 这里定义一个回调函数 */ /* Registration IRQ */ enIrqRegistration(&stcIrqRegiConf) 对于不需要注册的中断,则直接定义弱函数接口。例如: /** ******************************************************************************* ** brief SysTick interrupt callback function. ** ** param None ** ** retval None ** ******************************************************************************/ void SysTick_IrqHandler(void) { SysTick_IncTick(); } 个人感觉这个文件真的是脱裤子放屁,多此一举!在启动的 .s 文件中,各中断处理函数接口都已经声明并以死循环来处理了。这里把中断再以另一个名字放出去,完全就是为了增加代码量,在使用上没有任何便捷之处。这个文件编译后就近 10K 的代码量,然后还得占一堆 RAM!有没有考虑过 MCU 100 多个中断实际才用几个,一股脑全给搞一块去了! 由于 FLASH 空间不足,目前正在更换 HC32F460KETA 看门狗 目前,看门狗(SWDT)的配置可以必须在库文件 hc32f46x_icg.h 中进行配置(WDT 可以使用 hc32f46x_wdt.c/h 中进行配置),然后将 hc32f46x_icg.c 包含到自己的项目中,否则配置依旧无效!在更改了驱动库源码之后,在更新驱动库时需要注意! 此外,上面这种配置方法会间接导致一个问题:由于我们的程序分为 IAP 和 APP 两部分。看门狗的配置必须放到 IAP 中,且 APP 中不能再包含该文件,否则在调试烧写时会报错!具体见下文的 [程序下载异常] 章节 DMA 在使用串口 DMA 接收的时候,发现驱动库提供的接口并不能满足实际需要。具体表现为,串口的 DMA 是工作在循环模式下的,这就要求在必要的时候可以获取 DMA 接收的数据长度,不过驱动库貌似没有对应的接口! DMA 驱动中只有设置接口,没有读取接口! 。无奈自己增加了几个接口! GPIO 华大应该称为 PORT 时钟 貌似,华大 MCU 并不能像 ST MCU 似得,开启或者关闭某个 GPIO 的时钟。所以在配置 IO 时,无需要处理时钟的问题。 特殊配置 某些 IO 在上电时默认是用作其他功能的。例如:
具体见用户手册的 2.2 引脚功能表。在我的项目中,出现了 SPI_CLK 引脚无法映射的问题。 程序下载异常 在使用中发现,在下载程序之后并不能正常启动。我的项目结构是 IAP(在线升级) + APP,每次下载 APP 之后,IAP 就会被清除。一开始没有具体分析错误的原因的情况下,想当然的通过如下解决方法来处理。 但是,如上图修改之后,在实际下载的时候,Keil 会提示如下的警告,不过貌似没啥影响 虽然调试没啥影响,但是在生成 .bin 文件时却会出现错误! 但实际该方法并没有解决根本。通过详细分析,最后发现该问题是由于看门狗的配置导致的。具体:由于 APP 中包含了 看门狗的配置,看门狗的配置其实是 FLASH 中的固定一块空间。我们的 APP 偏移之后,自然没有看门狗部分的操作算法! 最终解决方法: 我们不需要上面的更改,只需要将看门狗的配置放到 IAP 中即可! IAP 肯定是从起始地址开始,自然不会有问题! |
|
|
|
外设反初始化
我的项目结构是 IAP(在线升级) + APP,外设在 IAP 中工作正常,但是在 APP 中工作不正常。这主要是由于:外设在 IAP 中已经初始化,然而在调整到 APP 之后,这部分外设由于已经被初始化,导致不会再次被初始化。这一点其实对于 ST 的 MCU 同样适用。因此,需要我们来特殊处理! 例如 hc32f46x_interrupts.c/h 中配置的中断,如果在 IAP 中已经被设置,跳转到 APP 后,就无法再正常配置了(全局变量中会检查是否被配置过) e en_result_t enIrqRegistration(const stc_irq_regi_conf_t *pstcIrqRegiConf) { // todo, assert ... stc_intc_sel_field_t *stcIntSel; en_result_t enRet = Ok; //DDL_ASSERT(NULL != pstcIrqRegiConf->pfnCallback); DDL_ASSERT(IS_NULL_POINT(pstcIrqRegiConf->pfnCallback)); /* IRQ032~127 whether out of range */ if (((((pstcIrqRegiConf->enIntSrc/32)*6 + 32) > pstcIrqRegiConf->enIRQn) || (((pstcIrqRegiConf->enIntSrc/32)*6 + 37) < pstcIrqRegiConf->enIRQn)) && (pstcIrqRegiConf->enIRQn >= 32)) { enRet = ErrorInvalidParameter; } else { stcIntSel = (stc_intc_sel_field_t *)((uint32_t)(&M4_INTC->SEL0) + (4u * pstcIrqRegiConf->enIRQn)); if (0x1FFu == stcIntSel->INTSEL) /* 如果已经初始化过,这里将不能再初始化 */ { stcIntSel->INTSEL = pstcIrqRegiConf->enIntSrc; IrqHandler[pstcIrqRegiConf->enIRQn] = pstcIrqRegiConf->pfnCallback; } else { enRet = ErrorUninitialized; } } return enRet; } 具体方法就是使用 enIrqResign 函数进行重新标记! |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1683 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1582 浏览 1 评论
1013 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
703 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1627 浏览 2 评论
1892浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
675浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
538浏览 3评论
557浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
526浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-4 01:14 , Processed in 1.249420 second(s), Total 80, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号