前言
最近一段時(shí)間在玩極海的APM32F407系列的MCU,在研究一段時(shí)間后發(fā)現(xiàn)其資源和意法半導(dǎo)體的STM32F407不相上下。通過對(duì)比兩者的數(shù)據(jù)手冊(cè)和參考手冊(cè),我發(fā)現(xiàn)APM32F407替代STM32F407綽綽有余。我拿出了我吃灰已久的一塊開發(fā)板“啟明欣欣 IMT407 V5.1”(淘寶搜索“啟明欣欣”)。預(yù)計(jì)將開發(fā)板上的STM32F407芯片替換成APM32F407的芯片,看看會(huì)發(fā)生什么樣的事情。
本文記錄一下我使用APM32F407替代STM32F407制作的一個(gè)小demo(使用SPI外設(shè)讀取W25Q128)。該demo使用原開發(fā)板電路,看看將主控?fù)Q成APM32F407后看看能不能做到pin對(duì)pin的完美替代。
本文使用環(huán)境:
硬件
啟明欣欣 IMT407 V5.1(APM32F407ZGT6)
J-link v9.7
IMT 2.8 TFTLCD
USB轉(zhuǎn)TTL
軟件:
MDK-ARM Plus Version: 5.36.0.0
fireTools
固件或例程庫(kù):
1.APM32F4xx_SDK_V1.1
2.啟明欣欣STM32F407(高配版V5.1)學(xué)習(xí)資料(2 各資源學(xué)習(xí)例程標(biāo)準(zhǔn)庫(kù)版本15 SPI_W25Qxx)
參考文檔:
1.APM32F4xxx用戶手冊(cè) V1.1
2.APM32F405xG 407xExG數(shù)據(jù)手冊(cè) V1.1
3.啟明欣欣407開發(fā)板(高配版)V5.1原理圖
4.STM32F4xx中文參考手冊(cè)
5.STM32F407ZGT6數(shù)據(jù)手冊(cè).pdf
先上一下替換芯片后的板子照片(原諒我的渣渣焊工):
1 環(huán)境配置
1.1 APM32F407開發(fā)環(huán)境
在極海官網(wǎng)獲取最新的SDK"APM32F4xx_SDK_V1.1",在其目錄下有Pack“Geehy.APM32F4xx_DFP.1.0.1.pack”,安裝完畢后才能使用keil開發(fā)APM32F407芯片。
1.2 添加APM32F407驅(qū)動(dòng)庫(kù)文件
a.在原工程下添加APM32F407的驅(qū)動(dòng)庫(kù)(本文節(jié)取原開發(fā)板例程中的SPI_W25Qxx例程),復(fù)制APM32F4xx_SDK_V1.1下的Library文件夾至工程目錄,改名為APM32F4xx_Library。
b.在原工程下添加APM32F407的中斷控制函數(shù)文件。將“APM32F4xx_SDK_V1.1ExamplesTemplateTemplateSource”和“APM32F4xx_SDK_V1.1ExamplesTemplateTemplateInclude”下的“apm32f4xx_int.c”和“apm32f4xx_int.h”復(fù)制至工程目錄“Main”下。
1.3 添加APM32F407工程及目錄
a.在“Project Items”目錄下新增“APM32F407”工程,以便換不同的工程進(jìn)行編輯編譯下載。
b.在“Groups”目錄下新增“APM32F4xx_StdPeriphDriver”與“APM32F4xx_Startup_config”分組。
c.分別在“APM32F4xx_StdPeriphDriver”與“APM32F4xx_Startup_config”分組下添加本次例程使用到的驅(qū)動(dòng)文件。
d.在“Main”分組下添加我們上一節(jié)增加的內(nèi)容“apm32f4xx_int.c”。
1.4 更改APM32F407工程芯片
將工程“APM32F407”的芯片選型設(shè)置為“APM32F407ZG”。
1.5 設(shè)置編譯選擇
a.設(shè)置不同工程目錄下的編譯選擇,以控制不同的工程下編譯的文件。
“APM32F407”工程去除STM32的編譯文件包含。
b.設(shè)置“APM32F407”工程的聲明為“APM32F40X”。
c.增加“APM32F407”工程中APM32F407驅(qū)動(dòng)庫(kù)文件頭文件目錄。
2 底層驅(qū)動(dòng)替換
更改代碼,將STM32的驅(qū)動(dòng)函數(shù)替換為APM32的驅(qū)動(dòng)函數(shù),這部分比較繁瑣,需要慢慢替換??筛鶕?jù)工程所需外設(shè)的驅(qū)動(dòng)進(jìn)行對(duì)照替換。如我們現(xiàn)在的工程主要涉及到的外設(shè)有:misc/gpio/spi/fsmc/usart/rcm??梢酝ㄟ^查看兩者的參考手冊(cè),查看那些寄存器功能基本一致的對(duì)應(yīng)的庫(kù)函數(shù)的功能也基本一致。
2.1 外設(shè)與庫(kù)函數(shù)對(duì)照
我這里也整理了本次替代過程中常用外設(shè)的寄存器與庫(kù)函數(shù)的參照,供大家參考。這里截取部分內(nèi)容,更多內(nèi)容請(qǐng)查閱附件(*附件下載鏈接:
https://bbs.21ic.com/forum.php?mod=viewthread&tid=3220654&page=1&extra=)。
2.2 驅(qū)動(dòng)替換方式
由于前文我們已經(jīng)將“APM32F407”工程的聲明設(shè)置為“APM32F40X”,這里我們僅需將涉及外部功能模塊的源碼文件內(nèi)的驅(qū)動(dòng)進(jìn)行替換。通過宏定義的方式以支持不同平臺(tái)的文件。
如包含頭文件時(shí):
#ifdef STM32F40_41xxx
/** 原 stm32 接口或外設(shè)驅(qū)動(dòng) */
#include "stm32f4xx.h"
#endif
#ifdef APM32F40X
/** 替換為 apm32 接口或外設(shè)驅(qū)動(dòng) */
#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外設(shè)驅(qū)動(dòng)時(shí):
#ifdef STM32F40_41xxx
/** 原 stm32 接口或外設(shè)驅(qū)動(dòng) */
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); //使能GPIOF時(shí)鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9; //KEY0 KEY1 KEY2 KEY3對(duì)應(yīng)引腳
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 接口或外設(shè)驅(qū)動(dòng) */
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
替換過程較為繁瑣,這里不再一一贅述。具體代碼實(shí)現(xiàn)大家可參考附件源碼。
3 程序下載與仿真
由于我們的已做雙工程處理,在修改底層驅(qū)動(dòng)至APM32F407時(shí)并不影響原工程內(nèi)容,我們可以通過選擇不同的工程對(duì)目標(biāo)芯片進(jìn)行下載。我這里選擇"APM32F407"工程通過J-LINK下載我手上的板子。
程序下載過程中會(huì)提示我們選擇芯片平臺(tái),這里選擇“M4”即可。
4 最后效果
a.程序開始運(yùn)行后,屏幕會(huì)顯示請(qǐng)用戶發(fā)送數(shù)據(jù)到串口1“Please send data to usart1”,此時(shí)用戶就要通過串口助手向開發(fā)板發(fā)送數(shù)據(jù),發(fā)送格式為S…….E?!啊?…”為用戶所需要發(fā)送的數(shù)據(jù),發(fā)送后數(shù)據(jù)存在 receive_str[ ]數(shù)值中并在顯示屏顯示。
b.將接收到的數(shù)據(jù)寫入W25Q128,KEY0按下,將串口1接收到的數(shù)據(jù)(receive_str[ ]中數(shù)據(jù))寫入25Q128。
c.將寫入到W25Q128的數(shù)據(jù)讀出并顯示,KEY1按下,將寫入到W25Q128中的數(shù)據(jù)讀出并顯示。
5 總結(jié)
以上便是本次使用APM32F407替代STM32F407的簡(jiǎn)要過程。通過本次替代經(jīng)歷,發(fā)現(xiàn)極海的APM32F407芯片的硬件與軟件環(huán)境對(duì)STM32F407都有著非常優(yōu)秀的替代能力。在原有硬件無需改動(dòng)的情況下,簡(jiǎn)單的進(jìn)行驅(qū)動(dòng)更換后也能很好運(yùn)行起來。國(guó)產(chǎn)優(yōu)秀替代者極海也!各位小伙伴可以和我一起討論替代過程中發(fā)生的趣事~
整個(gè)內(nèi)容較多,個(gè)人能力有限,些許地方可能存在較多問題,歡迎大家指出。
聲明
1.本代碼(文檔),僅供學(xué)習(xí)參考。
2.代碼(文檔)參考了網(wǎng)上開源的代碼。如涉及貴方版權(quán),請(qǐng)聯(lián)系本人刪除。
審核編輯 :李倩
-
芯片
+關(guān)注
關(guān)注
460文章
52520瀏覽量
440971 -
代碼
+關(guān)注
關(guān)注
30文章
4900瀏覽量
70747
原文標(biāo)題:國(guó)產(chǎn)優(yōu)秀替代_APM32F407替代STM32F407記錄
文章出處:【微信號(hào):mcu168,微信公眾號(hào):硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
極海APM32F407 uc/os3學(xué)習(xí)筆記之任務(wù)管理介紹

基于APM32F407如何制作I2C EEPROM(AT24C02型號(hào))的MDK-Keil下載算法

如何在APM32F407開發(fā)板上應(yīng)用uC/OS-III實(shí)時(shí)操作系統(tǒng)

stm32f407這個(gè)STM32_RCC_PERIPHCLK_SDMMC是哪里定義的?
STM32F407的高速USB,采用的是虛擬串口方式,VCP驅(qū)動(dòng)有l(wèi)inux系統(tǒng)的嗎?
求一份在STM32F407的CS1239的驅(qū)動(dòng)程序
STM32F407輸出的2片ADC的轉(zhuǎn)換值與輸入ADC的電壓值相同了,不知道是何原因?
STM32F405xx和STM32F407xx微控制器數(shù)據(jù)手冊(cè)
使用STM32F407的硬件SPI接口去讀取ADS8694的18位ad數(shù)據(jù)怎樣才能讀取出來?
STM32F407和ADS8684進(jìn)行SPI通信,寄存器怎么配置?
STM32 F407無傳感器控制PLL
STM32F407可以同時(shí)輸出四路信號(hào)嗎?
STM32F407 MCU使用SD NAND?不斷電初始化失效解決方案

評(píng)論