目錄
7.複製正點原子的SYSTEM文件夾到工程,替換啓動文件,然後編寫代碼
學習目的:屬性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