STM32F103至STM32F407程式移植參考
最近做了從STM32F103到STM32F407的程式移植工作。在做這項工作之前發現網上沒有太全面的移植攻略,因而確實費了一番功夫和走了一些彎路。現在程式移植工作基本做完,趁著還能記起來遇到的問題,把程式移植需要注意的點整理在這裡,希望對以後做這個工作的朋友能有些幫助。
雖然我做的是F407的移植,但是大部分內容對於F40xx_41xx,乃至F4其他系列的晶片都適用。
文章如要轉載請私信與我聯絡,並註明作者Mr.括號。
一、硬體相容改造
先說一下硬體吧,兩種晶片的大部分引腳是相同的,需要改動部分電源引腳。官方的晶片資料手冊上給出了相容版的設計圖,以100引腳的為例:
其中19引腳從VSS改成VDD,49和73引腳分別從接VSS改成接電容,電容值為2.2uF。
二、系統時鐘設定
F407的外部高速時鐘的巨集定義在system_stm32f4xx.c中。
#define HSE_BYPASS_INPUT_FREQUENCY 8000000
其中8000000代表外部時鐘選用8M晶振,此處需對應實際情況修改。
時鐘設定在函式SetSysClock()中進行設定,關鍵語句為:
RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1)-1) << 16) |(RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);
主時鐘PLL的值等為:PLL=M*N/(M*P),對應需求進行修改。
三、外設時鐘使能
F407的外設時鐘使能的函式和F103的相同,但是外設對應的外設時鐘的對映關係發生了改變。具體的對映關係在檔案stm32f4xx.h中有巨集定義。
例如:在F103中GPIOA的外設時鐘使能語句為:
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );
在F407中,在stm32f4xx.h查詢GPIOA,可以查到巨集定義:
#define RCC_AHB1Periph_GPIOA ((uint32_t)0x00000001)
因而該使能語句可以改為:
RCC_AHB1PeriphClockCmd ( RCC_AHB1Periph_GPIOA , ENABLE );
四、GPIO埠初始化
在F103中,GPIO_InitTypeDef結構體為:
typedef struct
{
uint16_t GPIO_Pin;
GPIOSpeed_TypeDef GPIO_Speed;
GPIOMode_TypeDef GPIO_Mode;
}GPIO_InitTypeDef;
在F407中,該結構體為:
typedef struct
{
uint32_t GPIO_Pin;
GPIOMode_TypeDef GPIO_Mode;
GPIOSpeed_TypeDef GPIO_Speed;
GPIOOType_TypeDef GPIO_OType;
GPIOPuPd_TypeDef GPIO_PuPd;
}GPIO_InitTypeDef;
F103中的GPIO_Mode在F407中被拆解成了三個引數:GPIO_Mode、GPIO_OType和GPIO_PuPd。其中GPIO_Mode有輸入、輸出、複用和模擬四種模式可選,GPIO_OType選擇推輓和開漏,GPIO_PuPd選擇上拉、下拉和浮空。
五、DMA設定
F407中DMA的Channel統一換成了Stream與Channel組合的形式。DMA的初始化結構體DMA_InitTypeDef中多出了引數DMA_InitStructure.DDMA_Channel。不同外設請求對應的資料流和通道在官方參考手冊中有明確的示例。DMA1和DMA2的請求對映如下:
另外還有一個小改動,在F103中DMA_Channel_TypeDef結構體中的元素為:
typedef struct
{
__IO uint32_t CCR;
__IO uint32_t CNDTR;
__IO uint32_t CPAR;
__IO uint32_t CMAR;
} DMA_Channel_TypeDef;
對應在F407中的DMA_Stream_TypeDef為:
typedef struct
{
__IO uint32_t CR;
__IO uint32_t NDTR;
__IO uint32_t PAR;
__IO uint32_t M0AR;
__IO uint32_t M1AR;
__IO uint32_t FCR;
} DMA_Stream_TypeDef;
在呼叫到該結構體中引數時需要注意。
六、重對映
在F407中不存在重對映(REMAP)的概念了,取而代之的是引腳的複用對映(AF)。而相比於F103的重對映,引腳複用功能更加靈活和全面。引腳複用時是對單獨引腳進行配置。例如對USART2的PA2和PA3的複用設定指令為:
GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_USART2);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_USART2);
Mr.括號我直接把複用對映表列出來,方便大家查詢:
七、其他
用BSRRH代替了BRR
用BSRRL代替了BSRR
目前想到的就是上述這些,如果還有其他沒提及的歡迎補充,如有紕漏敬請指正!
轉載:https://zhuanlan.zhihu.com/p/24981431