打印
[APM32F4]

国产优秀替代_APM32F407替代STM32F407记录

[复制链接]
1844|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
WuKaiLi|  楼主 | 2022-5-9 15:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 WuKaiLi 于 2022-5-9 15:43 编辑

前言
    最近一段时间在玩极海的APM32F407系列的MCU,在研究一段时间后发现其资源和意法半导体的STM32F407不相上下。通过对比两者的数据手册和参考手册,我发现APM32F407替代STM32F407绰绰有余。我拿出了我吃灰已久的一块开发板“启明欣欣 IMT407 V5.1”(淘宝搜索“启明欣欣”)。预计将开发板上的STM32F407芯片替换成APM32F407的芯片,看看会发生什么样的事情。
本文记录一下我使用APM32F407替代STM32F407制作的一个小demo(使用SPI外设读取W25Q128)。该demo使用原开发板电路,看看将主控换成APM32F407后看看能不能做到pin对pin的完美替代。
本文使用环境:

硬件
    1.启明欣欣 IMT407 V5.1(APM32F407ZGT6)
    2.J-link v9.7
    3.MT 2.8 TFTLCD
    4.USB转TTL
软件:
    1.MDK-ARM Plus Version: 5.36.0.0
    2.fireTools
固件或例程库:
    1.APM32F4xx_SDK_V1.1
    2.启明欣欣STM32F407(高配版V5.1)学习资料(\2 各资源学习例程\标准库版本\15 SPI_W25Qxx)
参考文档:
    1.APM32F4xxx用户手册 V1.1
    2.APM32F405xG 407xExG数据手册 V1.1
    3.启明欣欣407开发板(高配版)V5.1原理图
    4.STM32F4xx中文参考手册
    5.STM32F407ZGT6数据手册.pdf

先上一下替换芯片后的板子照片(原谅我的渣渣焊工):


1 环境配置
1.1 APM32F407开发环境
    在极海官网获取最新的SDK"APM32F4xx_SDK_V1.1",在其目录下有Pack“Geehy.APM32F4xx_DFP.1.0.1.pack”,安装完毕后才能使用keil开发APM32F407芯片。

1.2 添加APM32F407驱动库文件
    a.在原工程下添加APM32F407的驱动库(本文节取原开发板例程中的SPI_W25Qxx例程),复制APM32F4xx_SDK_V1.1下的Library文件夹至工程目录,改名为APM32F4xx_Library。

    b.在原工程下添加APM32F407的中断控制函数文件。将“APM32F4xx_SDK_V1.1\Examples\Template\Template\Source\”和“APM32F4xx_SDK_V1.1\Examples\Template\Template\Include\”下的“apm32f4xx_int.c”和“apm32f4xx_int.h”复制至工程目录“Main\”下。

1.3 添加APM32F407工程及目录
    a.在“Project Items”目录下新增“APM32F407”工程,以便换不同的工程进行编辑编译下载。
    b.在“Groups”目录下新增“APM32F4xx_StdPeriphDriver”与“APM32F4xx_Startup_config”分组。
    c.分别在“APM32F4xx_StdPeriphDriver”与“APM32F4xx_Startup_config”分组下添加本次例程使用到的驱动文件。
    d.在“Main”分组下添加我们上一节增加的内容“apm32f4xx_int.c”。



1.4 更改APM32F407工程芯片
    将工程“APM32F407”的芯片选型设置为“APM32F407ZG”。

1.5 设置编译选择
    a.设置不同工程目录下的编译选择,以控制不同的工程下编译的文件。

    “APM32F407”工程去除STM32的编译文件包含。

    b.设置“APM32F407”工程的声明为“APM32F40X”。
    c.增加“APM32F407”工程中APM32F407驱动库文件头文件目录。


2 底层驱动替换
    更改代码,将STM32的驱动函数替换为APM32的驱动函数,这部分比较繁琐,需要慢慢替换。可根据工程所需外设的驱动进行对照替换。如我们现在的工程主要涉及到的外设有:misc/gpio/spi/fsmc/usart/rcm。可以通过查看两者的参考手册,查看那些寄存器功能基本一致的对应的库函数的功能也基本一致。
2.1 外设与库函数对照
    我这里也整理了本次替代过程中常用外设的寄存器与库函数的参照,供大家参考。这里截取部分内容,更多内容请查阅附件表格。

2.2 驱动替换方式
     由于前文我们已经将“APM32F407”工程的声明设置为“APM32F40X”,这里我们仅需将涉及外部功能模块的源码文件内的驱动进行替换。通过宏定义的方式以支持不同平台的文件。
如包含头文件时:
#ifdef STM32F40_41xxx

        /** 原 stm32 接口或外设驱动 */

    #include "stm32f4xx.h"

#endif


#ifdef APM32F40X

        /** 替换为 apm32 接口或外设驱动 */

    #include "apm32f4xx.h"

    #include "apm32f4xx_misc.h"

    #include "apm32f4xx_spi.h"

    #include "apm32f4xx_rcm.h"

    #include "apm32f4xx_smc.h"

    #include "apm32f4xx_gpio.h"

    #include "apm32f4xx_usart.h"

#endif
   如替换GPIO外设驱动时:
#ifdef STM32F40_41xxx

    /** 原 stm32 接口或外设驱动 */

    GPIO_InitTypeDef  GPIO_InitStructure;

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);    //使能GPIOF时钟


    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9; //KEY0 KEY1 KEY2 KEY3对应引脚

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;             //普通输入模式

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;       //100M

    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;             //上拉

    GPIO_Init(GPIOF, &GPIO_InitStructure);                   //初始化GPIOF6,7,8,9

#endif


#ifdef APM32F40X

        /** 替换为 apm32 接口或外设驱动 */

    GPIO_Config_T  GPIO_InitStructure;

    RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOF);

    GPIO_InitStructure.pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;

    GPIO_InitStructure.mode = GPIO_MODE_IN;

    GPIO_InitStructure.speed = GPIO_SPEED_100MHz;

    GPIO_InitStructure.otype = GPIO_OTYPE_PP;

    GPIO_InitStructure.pupd = GPIO_PUPD_UP;

    GPIO_Config(GPIOF, &GPIO_InitStructure);

#endif
   替换过程较为繁琐,这里不再一一赘述。具体代码实现大家可参考附件源码。
3 程序下载与仿真
    由于我们的已做双工程处理,在修改底层驱动至APM32F407时并不影响原工程内容,我们可以通过选择不同的工程对目标芯片进行下载。我这里选择"APM32F407"工程通过J-LINK下载我手上的板子。

    程序下载过程中会提示我们选择芯片平台,这里选择“M4”即可。

4 最后效果
    a.程序开始运行后,屏幕会显示请用户发送数据到串口1“Please send data to usart1”,此时用户就要通过串口助手向开发板发送数据,发送格式为S…….E。“….…”为用户所需要发送的数据,发送后数据存在 receive_str[ ]数值中并在显示屏显示。

    b.将接收到的数据写入W25Q128,KEY0按下,将串口1接收到的数据(receive_str[ ]中数据)写入25Q128。
    c.将写入到W25Q128的数据读出并显示,KEY1按下,将写入到W25Q128中的数据读出并显示。

5 总结
    以上便是本次使用APM32F407替代STM32F407的简要过程。通过本次替代经历,发现极海的APM32F407芯片的硬件与软件环境对STM32F407都有着非常优秀的替代能力。在原有硬件无需改动的情况下,简单的进行驱动更换后也能很好运行起来。国产优秀替代者极海也!各位小伙伴我们在评论区一起讨论替代过程中发生的趣事~
整个内容较多,个人能力有限,些许地方可能存在较多问题,欢迎大家指出。

声明
•1.本代码(文档),仅供学习参考。
•2.代码(文档)参考了网上开源的代码。如涉及贵方版权,请联系本人删除。






国产优秀替代_APM32F407替代STM32F407记录.zip

4.6 MB

使用特权

评论回复
评论
dianzimcu 2024-3-31 16:51 回复TA
大神,请教一下,用极海407替代STM时候发现是每次都是上电时能加载一次(20K~5M都可以加载),而且加载完之后程序不能自动启动运行,要按一次复位键才运行(我在JLINK加载选项里选择了加载后RESET AND RUN的),之后在程序运行中,再次加载就不行了。这种情况程序FLASH好像是被擦除了,没有程序运行了,但是新代码没有下载进去 
沙发
fuqinyyy| | 2022-5-10 08:21 | 只看该作者
谢谢分享经验

使用特权

评论回复
评论
WuKaiLi 2022-5-10 16:12 回复TA
感谢支持 
板凳
kai迪皮| | 2022-5-14 23:56 | 只看该作者
码字不易,支持一波

使用特权

评论回复
地板
地球十强666| | 2022-6-12 22:53 | 只看该作者
这篇帖子很多地方都转发了~~厉害,

使用特权

评论回复
5
七毛钱| | 2022-6-13 16:55 | 只看该作者
极海芯片替代stm32的经典案例

使用特权

评论回复
6
yangxiaor520| | 2022-6-13 18:48 | 只看该作者
多谢分享经验

使用特权

评论回复
7
zjh20070904| | 2022-6-13 19:11 | 只看该作者
不改开发板“启明欣欣 IMT407 V5.1(APM32F407ZGT6)”自带的程序、Keil工程,也不装APM32F407的packe包,直接烧录代码,可以运行吗?

使用特权

评论回复
评论
zjh20070904 2022-6-18 10:06 回复TA
@WuKaiLi :厉害厉害厉害 
WuKaiLi 2022-6-16 13:35 回复TA
可以的哦~ 
8
迪圣-欧丽良| | 2022-12-27 10:48 | 只看该作者
zjh20070904 发表于 2022-6-13 19:11
不改开发板“启明欣欣 IMT407 V5.1(APM32F407ZGT6)”自带的程序、Keil工程,也不装APM32F407的packe包,直 ...

可以的  需要资料或技术支持可以加V 15813376719 极海一级代理

使用特权

评论回复
9
Undshing| | 2023-1-3 15:20 | 只看该作者
替代stm32的经典案例

使用特权

评论回复
10
caigang13| | 2024-4-1 08:17 | 只看该作者
M3和M4内核的MCU现在国产替代选择性大。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

37

帖子

1

粉丝