1. 程式人生 > >STM32F103至STM32F407程式移植參考

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