1.STM32F4工程新建學習

目錄

寄存器版本新建工程

1.新建工程目錄,複製需要的文件到工程目錄下

2.把工程需要的文件添加到工程

3.在MDK中設置頭文件存放路徑,以便工程能引用這些文件 

4.配置MDK:全局宏定義

5.編寫用戶函數

6.編譯工程,排錯

7.複製正點原子的SYSTEM文件夾到工程,替換啓動文件,然後編寫代碼

新建基於 HAL 庫工程模板

1. 複製所需要文件到工程包中。

2.把工程文件引入到工程

3.設置頭文件的包含路徑

 4.MDK設置(全局宏定義標識符)

5.編寫用戶程序

6.添加正點原子的SYSTEM文件夾

7.編寫函數

8.其他配置


 

學習目的:屬性STM32的工程結構及其各目錄的意義。


 

  • 寄存器版本新建工程

1.新建工程目錄,複製需要的文件到工程目錄下

1.1打開mdk軟件,然後Project ->New uVision Project

1.2.在本地新建一個目錄,作爲工程目錄,接着再目錄中新建一個子文件夾USER

1.3.新建工程保存到USER目錄下:

1.4.選擇芯片類型,這裏以STM32F429IGTx爲例:

下一步點擊取消:

這樣一個簡單的工程就新建完成,可以在本地看到USER目錄下面多了一些文件:

OK,現在這個工程是一個空的,如果需要開發stm32f429必須添加一些必要的文件。

1.5.添加工程所需的文件,如下所示

文件/文件夾名稱 文件描述 在stm32CubeF4包中路徑
startup_stm32f429xx.s 啓動文件 \Drivers\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm
cmsis_armcc.h 內核頭文件 \Drivers\CMSIS\Include
core_cm4.h
core_cmFunc.h
core_cmInstr.h
core_cmSimd.h
stm32f4xx.h 頂層頭文件 \Drivers\CMSIS\Device\ST\STM32F4xx\Include
stm32f429xx.h
system_stm32f4xx.h

1.6.把啓動文件放置於USER目錄下

新建一個CORE(內核含義)文件夾,然後把\Drivers\CMSIS\Include的五個有關於內核頭文件和頂層頭文件放置於USER下:

複製\Drivers\CMSIS\Device\ST\STM32F4xx\Include的三個頂層頭文件,到test/CORE工程目錄下:

 

複製完,工程目錄下的CORE就有了8個頭文件了,如下:

 


2.把工程需要的文件添加到工程

2.1.管理工程

2.2.新建三個組,用於引入我們在第一步添加的一些頭文件和啓動文件:

把啓動文件添加到USER下:

3.在MDK中設置頭文件存放路徑,以便工程能引用這些文件 

添加頭文件路徑:

注意:MKD查找頭文件的規則,如果我們選擇是CORE,那麼MDK只會在CORE目錄下查找頭文件,不會到下以及目錄下查找,如果在CORE的子目錄還有文件的話,同樣需要把子目錄的路徑也添加進去。


4.配置MDK:全局宏定義

重要的預編譯全局宏定義標識符:   STM32F429xx,入戲所示

5.編寫用戶函數

5.1.新建一個.c文件,然後編輯一個main入口函數,保存:

5.2.添加這個.c文件添加到分組USER中:


6.編譯工程,排錯

6.1.編譯

報錯:.\Objects\test.axf: Error: L6218E: Undefined symbol SystemInit (referred from startup_stm32f429xx.o).

到startup_stm32f429xx.o這個檔案去看一看:

報錯的原因是因爲我們沒有SystemInit這個函數可以調用,如果是使用HAL庫的話,直接可以調用一個系統的初始化函數,寄存器只能自己搞了。那我們先把系統初始化的代碼先註釋掉,不讓它報錯先:

6.2.再次編譯,程序直接從mian函數開始執行,這時編譯就沒有錯誤了

6.3.此時一個模板就完成了,如果使用STM32F4的寄存器進行代碼的編輯的話,必須引入的就是我們剛剛添加的頭文件啦。

如下圖:

注意:雖然此時工程編譯時沒有任何問題的,但是我們沒有任何系統的一些初始化的文件,比如系統時鐘配置等,所以還是暫時不能使用該工程模板編寫程序的。


7.複製正點原子的SYSTEM文件夾到工程,替換啓動文件,然後編寫代碼:

7.1.複製寄存器版本的SYSTEM文件夾到工程目錄下,如下所示

7.2.在工程中新建一個組,添加.c文件和.h文件:

添加頭文件:

編譯,通過:

替換啓動文件:複製正點原子模板的文件

修改完,編譯通過。


7.3.在mian入口函數編寫代碼:

代碼如下:

#include "sys.h" 
#include "usart.h" 
#include "delay.h" 


int main(void)
{ 
	u8 t=0;
	Stm32_Clock_Init(360,25,2,8);	//設置時鐘,180Mhz
	delay_init(180);				//初始化延時函數
	uart_init(90,115200);			//串口初始化爲115200
	while(1)
	{
		printf("t:%d\r\n",t);
		delay_ms(500);
		t++;
	}
}

系統時鐘初始化函數:

編譯代碼,下載到開發板,串口500ms的週期增加t的值。

 


  • 新建基於 HAL 庫工程模板

1. 複製所需要文件到工程包中。

文件/文件夾名稱 文件描述 在stm32CubeF4包中路徑 工程模板中的文件夾  
Inc、Src文件夾 外設庫文件 \Drivers\STM32F4xx_HAL_Driver HALLIB  
startup_stm32f429xx.s 啓動文件 \Drivers\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm CORE  
cmsis_armcc.h 內核頭文件 \Drivers\CMSIS\Include CORE  
core_cm4.h  
core_cmFunc.h  
core_cmInstr.h  
core_cmSimd.h  
stm32f4xx.h 頂層頭文件 \Drivers\CMSIS\Device\ST\STM32F4xx\Include USER  
stm32f429xx.h  
system_stm32f4xx.h  
main.h 頭文件 \Projects\STM32F429I-Discovery\Templates\Inc  
stm32f4xx_hal_conf.h  
stm32f4xx_it.h  
main.c 源文件 \Projects\STM32F429I-Discovery\Templates\Src  
stm32f4xx_hal_msp.c  
stm32f4xx_it.c  
system_stm32f4xx.c  

在本地新建工程模板的文件夾,並複製到本地工程目錄, 如下圖所示:

複製上面所示的所有文件到指定的文件夾下:包括16個文件和2個文件夾


2.把工程文件引入到工程:

1.1打開mdk軟件,然後Project ->New uVision Project

保存,選擇芯片類型:

把我們在本地工程文件引入到工程,和上面一樣:

刪除在HALLIB下的三個.c文件

同時在工程中要刪掉下面三個文件  
   
stm32f4xx_hal_dsi.c mipi接口相關函數
stm32f4xx_hal_iptim.c 低功耗定時器相關函數
stm32f4xx_hal_msp_template.c 空函數

3.設置頭文件的包含路徑

設置一些工程的晶振和輸入路徑以及輸入中間文件保存路徑和生成hex文件等

在本地test目錄下新建一個obj文件夾,然後產生的中間文件都輸出到這個文件夾,以便後期工程管理:


 4.MDK設置(全局宏定義標識符)

重要的預編譯全局宏定義標識符:    USE_HAL_DRIVER,STM32F429xx    中間要用逗號“,”隔開。

意義:這個標識符是可以被整個工程所見的。


5.編寫用戶程序

5.1.刪除main.c文件裏面的所有文件,然後寫一個main入口函數,編譯通過

此時可以在main.c中添加stm32f4xx.h的頭文件,就可以調用hal庫的代碼了。此時還沒有系統初始化的一些時鐘,所以引入正點原子的system文件夾,去調用系統初始化函數


6.添加正點原子的SYSTEM文件夾

6.1添加這個文件夾,然後在工程新建一個組,添加.c文件,在頭文件路徑添加.h文件。

添加.c文件:

添加.h文件:

然後編譯,通過編譯。


7.編寫函數

複製下面的代碼到mian.函數裏面:

#include "sys.h"
#include "delay.h"
#include "usart.h"




void Delay(__IO uint32_t nCount);

void Delay(__IO uint32_t nCount)
{
  while(nCount--){}
}

int main(void)
{

	GPIO_InitTypeDef GPIO_Initure;
     
    HAL_Init();                     //初始化HAL庫    
    Stm32_Clock_Init(360,25,2,8);   //設置時鐘,180Mhz

    __HAL_RCC_GPIOB_CLK_ENABLE();           //開啓GPIOB時鐘
	
    GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1; //PB1,0
    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //推輓輸出
    GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速
    HAL_GPIO_Init(GPIOB,&GPIO_Initure);

	while(1)
	{
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET);	//PB1置1 
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET);	//PB0置1  			
		Delay(0x7FFFFF);
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET);	//PB1置0
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);	//PB0置0  
		Delay(0x7FFFFF);
	}
	}

編譯通過。


8.其他配置

8.1修改外部晶振爲25M

8.2.修改中斷優先級分組爲2

再次編譯後,下載到開發板中。程序運行,PB0和PB1交替輸出高低電平!


工程模板下載:

寄存器模板:https://download.csdn.net/download/qq_36243942/10734027

hal庫模板:https://download.csdn.net/download/qq_36243942/10734132

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章