APM pin to pin替换STM32,程序需要修改的地方

目录

一、关于APM

二、问题描述

三、解决办法


一、关于APM

APM32是基于ARM® Cortex®-M0+/M3/M4内核的优质国产(Geehy 极海半导体)32位通用MCU,具有低功耗、高性能、高集成度以及快速移植等特性。凭借优异的系统性能、丰富的协处理功能以及灵活的使用体验,有助于用户缩短产品设计时间、降低开发成本、实现性能最优化。目前可广泛应用于工业控制、医疗设备、汽车电子以及智慧家庭等领域。

发展时间线:

二、问题描述

APM的同系列型号是完全可以pin to pin替换STM32,软件还是使用STM32的工程。但是在用APM的单片机在pin to pin替换STM32单片机的时候,遇到了一些坑,给项目应用带来了不小的麻烦,投入了不少精力反复的测试验证才最终解决

替换芯片:STM32F103RET6 ---> APM32F103RET6

问题:参数被写成NAN值、远程升级死机、boot前4字节被置为0。这些问题都有一个共同点,就是都是对片内FLASH进行操作

三、解决办法

1、修改Flash操作等待周期,改成到4

APM的HCLK最高是96MHZ,所以FLASH等待周期也要对应的改为4,也就是3WS,LATENCY[2:0] = 0011

程序修改:

(1)、LL_FLASH_SetLatency设置为LL_FLASH_LATENCY_3

(2)、LL_FLASH_LATENCY_3如果没有找到定义,需要自己添加上

2、操作FLASH的时候都要先关全局中断、再开全局中断

FLASH操作函数(写、擦除)中,HAL_FLASH_Unlock()前加入__disable_interrupt(),HAL_FLASH_Lock()后加入__enable_interrupt()。注意,如果有boot,boot中有操作FLASH的地方也需要一并修改!

STM32的单片机也一样需要添加上,ST的我之前也遇到过参数被写成NAN值的,通过写检验、增加备份等方式反反复复也没有根治,大概率也是这个原因导致的,只是ST出现的概率要比APM的小很多

程序修改:

int stm32_flash_erase(uint32_t addr, uint32_t size)
{
    ...

    __disable_interrupt();
    HAL_FLASH_Unlock();

    ...
    HAL_FLASH_Lock();
    __enable_interrupt();

    ...
}

3、外部晶体起振时间改成0xFFFFFFFF或是死等

这里是用的LL库的时钟初始化,在初始化HSE和PLL的时候都会死等时钟起来

如果是用的HAL库的时钟初始化,将CLOCKSWITCH_TIMEOUT_VALUE、HSE_TIMEOUT_VALUE 改为0xFFFFFFFF即可


版权声明:本文为m0_37845735原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。