前言
最近一段时间在玩极海的APM32F407系列的MCU,在研究一段时间后发现其资源和意法半导体的STM32F407不相上下。通过对比两者的数据手册和参考手册,我发现APM32F407替代STM32F407绰绰有余。我拿出了我吃灰已久的一块开发板“启明欣欣 IMT407 V5.1”(淘宝搜索“启明欣欣”)。预计将开发板上的STM32F407芯片替换成APM32F407的芯片,看看会发生什么样的事情。
本文记录一下我使用APM32F407替代STM32F407制作的一个小demo(使用SPI外设读取W25Q128)。该demo使用原开发板电路,看看将主控换成APM32F407后看看能不能做到pin对pin的完美替代。
本文使用环境:
硬件
启明欣欣 IMT407 V5.1(APM32F407ZGT6)
J-link v9.7
IMT 2.8 TFTLCD
USB转TTL
软件:
MDK-ARM Plus Version: 5.36.0.0
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.1ExamplesTemplateTemplateSource”和“APM32F4xx_SDK_V1.1ExamplesTemplateTemplateInclude”下的“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 外设与库函数对照
我这里也整理了本次替代过程中常用外设的寄存器与库函数的参照,供大家参考。这里截取部分内容,更多内容请查阅附件(*附件下载链接:https://bbs.21ic.com/forum.php?mod=viewthread&tid=3220654&page=1&extra=)。
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都有着非常优秀的替代能力。在原有硬件无需改动的情况下,简单的进行驱动更换后也能很好运行起来。国产优秀替代者极海也!各位小伙伴可以和我一起讨论替代过程中发生的趣事~
上一篇:基于STM32H750的RTC自动唤醒
下一篇:STM32F03定时器基础知识基本简介
推荐阅读最新更新时间:2024-11-12 09:36
设计资源 培训 开发板 精华推荐
- LT1172HVIQ、-10 至 -26/1.25A LCD 对比度电源的典型应用
- 具有真正输出断开或输入/输出旁路选项的 0.65V 启动同步升压稳压器的典型应用,适用于 3.3V 输出
- MPC86XADS、XPC8xx 参考板,基于 XPC866X MPU PowerQUICC MPC8xx 处理器
- LTC2992IDE 具有高达 200V 瞬态保护的 -48V 冗余馈电的典型应用(1.5kHz I2C 接口)
- DC2620A-B,使用 LTC7106EDDB-1 7 位电流 DAC 和数字 PMBus 接口的演示板
- 使用 ON Semiconductor 的 NCP2815 的参考设计
- 使用 ROHM Semiconductor 的 BD5230 的参考设计
- PASSZEN功放板
- LTM8052AEY ±5A、2.5V、2 象限稳压器的典型应用
- AM2G-0509DH30Z ±9V 2 瓦 DC-DC 转换器的典型应用
- 上演你的“ADI实验室电路”DIY!
- Quartus Prime设计软件15.1版 带你体验革命性的设计生涯
- 有奖直播|TI MSP430™民用超声波水表开发指南及其智能模拟组合模块在传感器检测中的应用
- Keysight示波器主题月有奖系列活动之 注册大奖天天抽 抢楼踩中亦有奖
- e络盟大讲堂—告别冗长的手动测试
- TI有奖直播|C2000™ F280013x实现更低成本且更高效的实时控制方案
- 【问题征集】大学生美国TI行,你问我送礼!
- 调查:全新 TI E2E中文社区等你体验,等你抽奖!还可邀请好友助你一臂之力!
- 英特尔 SoC FPGA 开发者论坛 (ISDF) 预约报名享好礼!
- 9月24日 直播|Microchip mSiC™产品及其在电动出行中的典型应用方案