STM32編程實例資料包內容:
KEIL新建stm32工程(即使不新建工程,也請讀一下)
Keil5環境下的STM32v3.5庫工程建立 軟件:Keil5 for ARM 固件庫:STM32F10x_StdPeriph_Lib_V3.5.0 一.文件準備 一個工程一般單獨用一個文件夾,本例用Moban0作為文件夾名。里面包含本工程所有用到的源代碼,及工程工作中生成的文件。其中大部分源代碼要從固件庫等地方復制過來,只有少部分源代碼需要編寫。 在Moban0下建子文件夾: CORE FWlib USER 這些文件夾不是固定的,依據個人喜好建立和取名。 把一些文件從別處拷貝到這些文件夾下: CORE core_cm3.h (2) core_cm3.c (2) startup_stm32f10x_ld.s (3) FWlib inc (4) src (4) USER system_stm32f10x.h (5) system_stm32f10x.c (5) stm32f10x.h (5) main.c (6) stm32f10x_conf.h (6) stm32f10x_it.c (6) stm32f10x_it.h (6) 根據上面各文件后面的數字拷貝文件 (2)這兩個文件來自: STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport這個就是 CMSIS 核心文件,提供進入 M3 內核接口,這是 ARM 公司提供,對所有 CM3 內核的芯片都一樣。你永遠都不需要修改這個文件。 (3)來自:STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\ STM32F10x\startup\arm ,這是一個匯編啟動程序,啟動程序需要按下面規則選擇: startup_stm32f10x_cl.s =>互聯型的STM32F105xx、F107xx
startup_stm32f10x_hd.s =>大容量的STM32F101xx,F102xx,F103xx
startup_stm32f10x_hd_vl.s =>大容量的STM32F100xx
startup_stm32f10x_ld.s =>小容量的STM32F101xx,F102xx,F103xx
startup_stm32f10x_ld_vl.s =>小容量的STM32F100xx
startup_stm32f10x_md.s =>中容量的STM32F101xx,F102xx,F103xx
startup_stm32f10x_md_vl.s =>中容量的STM32F100xx
startup_stm32f10x_xl.s =>超大容量的STM32F101xx,F102xx,F103xx 由于proteus8.6里只有小容量的STM32,所以用ld型啟動程序。 Flash<=32K為小容量,64K<=Flash<=128K為中容量,Flash>=256為大容量。 (4)是兩個文件夾,來自:STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver\ ,是外設固件庫的所有C語言源代碼。調用到固件庫函數的就會參與編譯,生成執行代碼。 (5)來自: STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x其中 system_stm32f10x.c 和對應的頭文件system_stm32f10x.h 文件的功能是設置系統以及總線時鐘,這個里面有一個非常重要的 SystemInit()函數,在啟動時被自動調用。stm32f10x.h 這個文件很重要,只要你做 STM32 開發,你經常都要查看這個文件中相關的定義,這個文件里面主要是系統寄存器及其結構體、宏的定義申明以及包裝內存操作。 (6)來自: STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template\ 其中stm32f10x_it.h 和stm32f10x_it.c這兩個文件里面是一些系統中斷服務程序函數,每個函數里面內容一般為空(直接中斷返回)或死循環,用到時自己加內容。外設中斷服務程序函數自己建立,中斷服務函數名要和前文匯編啟動程序startup_stm32f10x_xx.s中建立的中斷向量表(即中斷服務程序入口地址表)對應,除非你改中斷向量表中的名稱。默認名稱都是Xxxx_IRQHandler()的形式。其實中斷服務程序不一定放在stm32f10x_it.h文件里。 stm32f10x_conf.h中包含了所有外設的頭文件。main.c是一個空的主程序,你要填寫自己的內容,或者用自己的main.c把它替換掉。 到此為止,建工程前的準備工作已經做好,接下來就是打開Keil進行建立工程了,點擊 MDK 的菜單:Project –>New Uvision Project ,然后將目錄定位到剛才建立的文件夾Moban0 之下(有些人喜歡新建“Project”目錄放在下面,這也是可以的,這個就看個人喜好了)子文件夾USER,我們的工程文件就都保存到 USER 里面,工程命名為My32,點擊保存。 接下來會出現一個選擇 CPU 的界面,就是選擇我們的芯片型號。如下圖所示,因為我們在proteus使用的STM32型號為STM32F103R6,所以在這里我們選擇STMicroelectronics ->STM32F1 Series ->STM32F103 ->STM32F103R6,注意一定要安裝過Keil.STM32F1xx_DFP.1.0.5.pack 這個安裝包才會有這些型號選項,否則請關閉 MDK,然后安裝此包。 
點擊 OK,MDK 會彈出 下圖Manage Run-Time Environment 對話框: 
這是 MDK5 新增的一種新建工程功能,利用這個功能,前文“文件準備”就不用做了,在這里可以直接添加自己需要的組件,構建工程開發環境,不過這里我們不用這種方法,直接點擊 Cancel,窗口消失。軟件界面左側工程欄出現新建工程的雛形(下圖)。 
接下來點上圖箭頭所指圖標,出現下圖窗口,此窗口用于建立和修改工程的樹狀結構,層次依次是:Project --> tergets --> groups -->files,雙擊Source Group 1改名為CORE,再添加兩個組USER、FWlib,在每個組下面按照下下圖結構添加文件(都是前文“文件準備”復制過來的),.h文件可以不放進來。FWlib組中加入外設固件庫文件,本例只用到GPIO和RCC兩種外設,所以只加入了兩個固件庫文件,以后用到其它外設還可以再添文件。 

點OK后窗口消失,界面左側出現上圖工程結構圖。新建工程框架完成。 點魔法棒圖標,或菜單Project -> Options for Terget,進入選項窗口。 1.預define 符號設置 將下面內容復制到下圖Define框中。 STM32F10X_LD,USE_STDPERIPH_DRIVER 其中LD表示低密度器件,如果前面選的是高密度器件,則要把LD改為HD,中密度則改MD。逗號不能是中文符。 
點上圖紅圈建立3個include 路徑。具體路徑當然和你一開始建立的文件夾有關,凡是你放了頭文件的文件夾都要加進來。 如果使用proteus仿真,上圖紫圈里的優化等級必須等于Level 2,或大于Level 2。 上圖勾選C99 Mode(棕色圈),這個設置不是必須的,如果沒有勾選,有些按C99版本編寫的代碼會被判錯,典型的情況:C99版允許在函數里任一地方定義變量(當然要在使用之前),而不必在函數開頭。

輸出文件的默認路徑是項目文件所處文件夾(本例是USER)下面自動建的Objects文件夾,也可以點下圖藍圈修改,比如新建一個和USER平級的文件夾OBJ。 下圖紅圈里可設定輸出文件名稱,本例加上.elf擴展名,這是因為proteus里只接受.elf文件或.HEX文件,如果輸出.HEX格式文件,把下圖黑圈中的勾打上。elf文件含有調試信息,可以在proteus中源碼級調試,但HEX文件不能調試,只能執行。 
用elf文件,在proteus中可實現在C語言源碼上設置斷點、單步執行、執行到指定行等,暫停時可以在變量窗口(Variable Window)查看變量的值,運行時在watch窗口監視變量值的變化(需從變量窗口把要監視的變量拖入監視窗口),還可以在監視窗口監視片內外設的寄存器值:點右鍵->add item(by name)->選片內外設的寄存器,雙擊加入窗口。 - 調試(Debug)選項設置(只用proteus仿真的不需此步)。
只做proteus仿真不必做此設置,需要做Keil軟件內仿真調試,或硬件調試的要設置,下圖黑圈中內容要設置,且要和你用的具體STM32型號一致。 如果做Keil軟件內仿真調試,要選擇紅圈Use Simulator。 如果連接硬件調試,要選擇右邊藍色圈。 Keil軟件內仿真調試在有些場合非常好用,它和proteus仿真的主要區別在于,Keil內仿真沒有處理器以外的電路,很多仿真無法進行。 
- 硬件下載仿真器設置(只用proteus仿真的不需此步)。
選上圖右邊藍色圈,選擇硬件仿真器型號,并點Settings設置,具體略。 
可暫將下列代碼復制到main.c中,點Build或rebuild圖標就可以編譯鏈接了。 - <font style="font-size: 12pt">#include "stm32f10x.h"
-
- u32 j=0,k=9;
- u16 m,i2;
- void Delay(u32 count)
- {
- u32 i1;
- for(i1=0;i1<count;i1++) i2+=i1;
- }
- int main(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD, ENABLE);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //LED0-->PA.8 端口配置
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO 口速度為 50MHz
- GPIO_Init(GPIOA, &GPIO_InitStructure); //根據設定參數初始化 GPIOA.8
-
- GPIO_SetBits(GPIOA,GPIO_Pin_8); //PA.8 輸出高
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //LED1-->PD.2 端口配置, 推挽輸出
- GPIO_Init(GPIOD, &GPIO_InitStructure); //推挽輸出 ,IO 口速度為 50MHz
-
- GPIO_SetBits(GPIOD,GPIO_Pin_2); //PD.2 輸出高
-
- while(1)
- {
- j++; k--; // j,k,m 沒什么用, 只為在proteus中看它們的值, 這幾句可刪除
- m+=k;
- if((j&0x0F)==0){
- k=j; m=k+j;
- }
-
- GPIO_ResetBits(GPIOA,GPIO_Pin_8);
- GPIO_SetBits(GPIOD,GPIO_Pin_2);
- Delay(300000);
-
- GPIO_SetBits(GPIOA,GPIO_Pin_8) ;
- GPIO_ResetBits(GPIOD,GPIO_Pin_2);
- Delay(300000);
- }
- }</font>
復制代碼
然后可打開proteus軟件,點圖標 新建一個proteus工程,保存在USER文件夾下。畫上電路,關聯文件選My32.elf,時鐘值一定要填,可以填常用的72M,想時間快的話可以填8M,設置好隱藏電源引腳,就能仿真了。 
STM32編程類作業。
這些作業只需根據示例略作修改就能完成。主要參考資料是PPT課件。
1. 實現8個LED的流水燈,3個連續亮燈接2個連續滅燈循環移動。
2. 上題的延時用定時器定時中斷實現。
3. 用定時器1的通道2產生PWM波,周期40μS,占空比20%、50%、80%三擋可調。
4. 用定時器2的通道3的捕獲功能測一個信號的周期,進而算出頻率。
全部資料51hei下載地址:
編程作業及示例.rar
(3.16 MB, 下載次數: 637)
2018-11-21 18:18 上傳
點擊文件名下載附件
|