久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 24392|回復(fù): 22
打印 上一主題 下一主題
收起左側(cè)

STM32固件庫(kù)Keil5工程建立設(shè)置與Proteus仿真調(diào)試教程

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:430673 發(fā)表于 2018-11-21 17:04 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
STM32編程實(shí)例資料包內(nèi)容:


KEIL新建stm32工程(即使不新建工程,也請(qǐng)讀一下)

Keil5環(huán)境下的STM32v3.5庫(kù)工程建立

軟件:Keil5 for ARM

固件庫(kù):STM32F10x_StdPeriph_Lib_V3.5.0

一.文件準(zhǔn)備

一個(gè)工程一般單獨(dú)用一個(gè)文件夾,本例用Moban0作為文件夾名。里面包含本工程所有用到的源代碼,及工程工作中生成的文件。其中大部分源代碼要從固件庫(kù)等地方復(fù)制過(guò)來(lái),只有少部分源代碼需要編寫(xiě)。

在Moban0下建子文件夾:

CORE

FWlib

USER

這些文件夾不是固定的,依據(jù)個(gè)人喜好建立和取名。

把一些文件從別處拷貝到這些文件夾下:

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)

根據(jù)上面各文件后面的數(shù)字拷貝文件

(2)這兩個(gè)文件來(lái)自:

STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport這個(gè)就是 CMSIS 核心文件,提供進(jìn)入 M3 內(nèi)核接口,這是 ARM 公司提供,對(duì)所有 CM3 內(nèi)核的芯片都一樣。你永遠(yuǎn)都不需要修改這個(gè)文件。

(3)來(lái)自:STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\

STM32F10x\startup\arm ,這是一個(gè)匯編啟動(dòng)程序,啟動(dòng)程序需要按下面規(guī)則選擇:

startup_stm32f10x_cl.s =>互聯(lián)型的STM32F105xx、F107xx
startup_stm32f10x_hd.s =>大容量的STM32F101xx,F(xiàn)102xx,F(xiàn)103xx
startup_stm32f10x_hd_vl.s =>大容量的STM32F100xx
startup_stm32f10x_ld.s =>小容量的STM32F101xx,F(xiàn)102xx,F(xiàn)103xx
startup_stm32f10x_ld_vl.s =>小容量的STM32F100xx
startup_stm32f10x_md.s =>中容量的STM32F101xx,F(xiàn)102xx,F(xiàn)103xx
startup_stm32f10x_md_vl.s =>中容量的STM32F100xx
startup_stm32f10x_xl.s =>超大容量的STM32F101xx,F(xiàn)102xx,F(xiàn)103xx

由于proteus8.6里只有小容量的STM32,所以用ld型啟動(dòng)程序。

Flash<=32K為小容量,64K<=Flash<=128K為中容量,F(xiàn)lash>=256為大容量。

(4)是兩個(gè)文件夾,來(lái)自:STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver\ ,是外設(shè)固件庫(kù)的所有C語(yǔ)言源代碼。調(diào)用到固件庫(kù)函數(shù)的就會(huì)參與編譯,生成執(zhí)行代碼。

(5)來(lái)自:

STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x其中 system_stm32f10x.c 和對(duì)應(yīng)的頭文件system_stm32f10x.h 文件的功能是設(shè)置系統(tǒng)以及總線時(shí)鐘,這個(gè)里面有一個(gè)非常重要的 SystemInit()函數(shù),在啟動(dòng)時(shí)被自動(dòng)調(diào)用。stm32f10x.h 這個(gè)文件很重要,只要你做 STM32 開(kāi)發(fā),你經(jīng)常都要查看這個(gè)文件中相關(guān)的定義,這個(gè)文件里面主要是系統(tǒng)寄存器及其結(jié)構(gòu)體、宏的定義申明以及包裝內(nèi)存操作。

(6)來(lái)自:

STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template\

其中stm32f10x_it.h 和stm32f10x_it.c這兩個(gè)文件里面是一些系統(tǒng)中斷服務(wù)程序函數(shù),每個(gè)函數(shù)里面內(nèi)容一般為空(直接中斷返回)或死循環(huán),用到時(shí)自己加內(nèi)容。外設(shè)中斷服務(wù)程序函數(shù)自己建立,中斷服務(wù)函數(shù)名要和前文匯編啟動(dòng)程序startup_stm32f10x_xx.s中建立的中斷向量表(即中斷服務(wù)程序入口地址表)對(duì)應(yīng),除非你改中斷向量表中的名稱。默認(rèn)名稱都是Xxxx_IRQHandler()的形式。其實(shí)中斷服務(wù)程序不一定放在stm32f10x_it.h文件里。 stm32f10x_conf.h中包含了所有外設(shè)的頭文件。main.c是一個(gè)空的主程序,你要填寫(xiě)自己的內(nèi)容,或者用自己的main.c把它替換掉。

  • 建立工程

到此為止,建工程前的準(zhǔn)備工作已經(jīng)做好,接下來(lái)就是打開(kāi)Keil進(jìn)行建立工程了,點(diǎn)擊 MDK 的菜單:Project –>New Uvision Project ,然后將目錄定位到剛才建立的文件夾Moban0 之下(有些人喜歡新建“Project”目錄放在下面,這也是可以的,這個(gè)就看個(gè)人喜好了)子文件夾USER,我們的工程文件就都保存到 USER 里面,工程命名為My32,點(diǎn)擊保存。

接下來(lái)會(huì)出現(xiàn)一個(gè)選擇 CPU 的界面,就是選擇我們的芯片型號(hào)。如下圖所示,因?yàn)槲覀冊(cè)趐roteus使用的STM32型號(hào)為STM32F103R6,所以在這里我們選擇STMicroelectronics ->STM32F1 Series ->STM32F103 ->STM32F103R6,注意一定要安裝過(guò)Keil.STM32F1xx_DFP.1.0.5.pack 這個(gè)安裝包才會(huì)有這些型號(hào)選項(xiàng),否則請(qǐng)關(guān)閉 MDK,然后安裝此包。

點(diǎn)擊 OK,MDK 會(huì)彈出 下圖Manage Run-Time Environment 對(duì)話框:

這是 MDK5 新增的一種新建工程功能,利用這個(gè)功能,前文“文件準(zhǔn)備”就不用做了,在這里可以直接添加自己需要的組件,構(gòu)建工程開(kāi)發(fā)環(huán)境,不過(guò)這里我們不用這種方法,直接點(diǎn)擊 Cancel,窗口消失。軟件界面左側(cè)工程欄出現(xiàn)新建工程的雛形(下圖)。

接下來(lái)點(diǎn)上圖箭頭所指圖標(biāo),出現(xiàn)下圖窗口,此窗口用于建立和修改工程的樹(shù)狀結(jié)構(gòu),層次依次是:Project --> tergets --> groups -->files,雙擊Source Group 1改名為CORE,再添加兩個(gè)組USER、FWlib,在每個(gè)組下面按照下下圖結(jié)構(gòu)添加文件(都是前文“文件準(zhǔn)備”復(fù)制過(guò)來(lái)的),.h文件可以不放進(jìn)來(lái)。FWlib組中加入外設(shè)固件庫(kù)文件,本例只用到GPIO和RCC兩種外設(shè),所以只加入了兩個(gè)固件庫(kù)文件,以后用到其它外設(shè)還可以再添文件。

點(diǎn)OK后窗口消失,界面左側(cè)出現(xiàn)上圖工程結(jié)構(gòu)圖。新建工程框架完成。

  • 設(shè)置工程

點(diǎn)魔法棒圖標(biāo),或菜單Project -> Options for Terget,進(jìn)入選項(xiàng)窗口。

1.預(yù)define 符號(hào)設(shè)置

將下面內(nèi)容復(fù)制到下圖Define框中。

STM32F10X_LD,USE_STDPERIPH_DRIVER

其中LD表示低密度器件,如果前面選的是高密度器件,則要把LD改為HD,中密度則改MD。逗號(hào)不能是中文符。

  • include路徑設(shè)置。

點(diǎn)上圖紅圈建立3個(gè)include 路徑。具體路徑當(dāng)然和你一開(kāi)始建立的文件夾有關(guān),凡是你放了頭文件的文件夾都要加進(jìn)來(lái)。

  • 設(shè)置優(yōu)化等級(jí)。

  如果使用proteus仿真,上圖紫圈里的優(yōu)化等級(jí)必須等于Level 2,或大于Level 2。

  • C版本設(shè)置。

  上圖勾選C99 Mode(棕色圈),這個(gè)設(shè)置不是必須的,如果沒(méi)有勾選,有些按C99版本編寫(xiě)的代碼會(huì)被判錯(cuò),典型的情況:C99版允許在函數(shù)里任一地方定義變量(當(dāng)然要在使用之前),而不必在函數(shù)開(kāi)頭。


  • 晶振頻率設(shè)置(只做proteus仿真可不設(shè))

  • 輸出路徑和文件設(shè)置。

輸出文件的默認(rèn)路徑是項(xiàng)目文件所處文件夾(本例是USER)下面自動(dòng)建的Objects文件夾,也可以點(diǎn)下圖藍(lán)圈修改,比如新建一個(gè)和USER平級(jí)的文件夾OBJ。

下圖紅圈里可設(shè)定輸出文件名稱,本例加上.elf擴(kuò)展名,這是因?yàn)閜roteus里只接受.elf文件或.HEX文件,如果輸出.HEX格式文件,把下圖黑圈中的勾打上。elf文件含有調(diào)試信息,可以在proteus中源碼級(jí)調(diào)試,但HEX文件不能調(diào)試,只能執(zhí)行。

用elf文件,在proteus中可實(shí)現(xiàn)在C語(yǔ)言源碼上設(shè)置斷點(diǎn)、單步執(zhí)行、執(zhí)行到指定行等,暫停時(shí)可以在變量窗口(Variable Window)查看變量的值,運(yùn)行時(shí)在watch窗口監(jiān)視變量值的變化(需從變量窗口把要監(jiān)視的變量拖入監(jiān)視窗口),還可以在監(jiān)視窗口監(jiān)視片內(nèi)外設(shè)的寄存器值:點(diǎn)右鍵->add item(by name)->選片內(nèi)外設(shè)的寄存器,雙擊加入窗口。

  • 調(diào)試(Debug)選項(xiàng)設(shè)置(只用proteus仿真的不需此步)

只做proteus仿真不必做此設(shè)置,需要做Keil軟件內(nèi)仿真調(diào)試,或硬件調(diào)試的要設(shè)置,下圖黑圈中內(nèi)容要設(shè)置,且要和你用的具體STM32型號(hào)一致。

如果做Keil軟件內(nèi)仿真調(diào)試,要選擇紅圈Use Simulator。

如果連接硬件調(diào)試,要選擇右邊藍(lán)色圈。

Keil軟件內(nèi)仿真調(diào)試在有些場(chǎng)合非常好用,它和proteus仿真的主要區(qū)別在于,Keil內(nèi)仿真沒(méi)有處理器以外的電路,很多仿真無(wú)法進(jìn)行。

  • 硬件下載仿真器設(shè)置(只用proteus仿真的不需此步)

選上圖右邊藍(lán)色圈,選擇硬件仿真器型號(hào),并點(diǎn)Settings設(shè)置,具體略。



  • 編程調(diào)試

可暫將下列代碼復(fù)制到main.c中,點(diǎn)Build或rebuild圖標(biāo)就可以編譯鏈接了。

  1. <font style="font-size: 12pt">#include "stm32f10x.h"

  2. u32  j=0,k=9;
  3. u16  m,i2;
  4. void Delay(u32 count)
  5. {
  6.               u32 i1;
  7.               for(i1=0;i1<count;i1++) i2+=i1;
  8. }
  9. int main(void)
  10. {
  11.               GPIO_InitTypeDef GPIO_InitStructure;            
  12.             
  13.               RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD, ENABLE);
  14.             
  15.               GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //LED0-->PA.8 端口配置
  16.               GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
  17.               GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO 口速度為 50MHz
  18.               GPIO_Init(GPIOA, &GPIO_InitStructure); //根據(jù)設(shè)定參數(shù)初始化 GPIOA.8
  19.             
  20.               GPIO_SetBits(GPIOA,GPIO_Pin_8); //PA.8 輸出高
  21.             
  22.               GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //LED1-->PD.2 端口配置, 推挽輸出
  23.               GPIO_Init(GPIOD, &GPIO_InitStructure); //推挽輸出 ,IO 口速度為 50MHz
  24.             
  25.               GPIO_SetBits(GPIOD,GPIO_Pin_2); //PD.2 輸出高            
  26.             
  27.               while(1)
  28.               {
  29.                             j++; k--; // j,k,m 沒(méi)什么用, 只為在proteus中看它們的值, 這幾句可刪除
  30.                             m+=k;
  31.                             if((j&0x0F)==0){
  32.                                           k=j;                             m=k+j;
  33.                             }               
  34.                                                       
  35.                             GPIO_ResetBits(GPIOA,GPIO_Pin_8);
  36.                             GPIO_SetBits(GPIOD,GPIO_Pin_2);
  37.                             Delay(300000);
  38.                            
  39.                             GPIO_SetBits(GPIOA,GPIO_Pin_8) ;
  40.                             GPIO_ResetBits(GPIOD,GPIO_Pin_2);
  41.                             Delay(300000);
  42.               }
  43. }</font>
復(fù)制代碼


然后可打開(kāi)proteus軟件,點(diǎn)圖標(biāo)新建一個(gè)proteus工程,保存在USER文件夾下。畫(huà)上電路,關(guān)聯(lián)文件選My32.elf,時(shí)鐘值一定要填,可以填常用的72M,想時(shí)間快的話可以填8M,設(shè)置好隱藏電源引腳,就能仿真了。


STM32編程類作業(yè)。
這些作業(yè)只需根據(jù)示例略作修改就能完成。主要參考資料是PPT課件。
1.    實(shí)現(xiàn)8個(gè)LED的流水燈,3個(gè)連續(xù)亮燈接2個(gè)連續(xù)滅燈循環(huán)移動(dòng)。
2.    上題的延時(shí)用定時(shí)器定時(shí)中斷實(shí)現(xiàn)。
3.    用定時(shí)器1的通道2產(chǎn)生PWM波,周期40μS,占空比20%、50%、80%三擋可調(diào)。
4.    用定時(shí)器2的通道3的捕獲功能測(cè)一個(gè)信號(hào)的周期,進(jìn)而算出頻率。



全部資料51hei下載地址:

編程作業(yè)及示例.rar (3.16 MB, 下載次數(shù): 637)



評(píng)分

參與人數(shù) 1黑幣 +30 收起 理由
cc燦 + 30 贊一個(gè)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏26 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:276118 發(fā)表于 2018-12-18 13:07 | 只看該作者
很好的指導(dǎo)作用
回復(fù)

使用道具 舉報(bào)

板凳
ID:116773 發(fā)表于 2018-12-18 21:34 | 只看該作者
不錯(cuò)!就是最后的作業(yè)跨度太大,不是初學(xué)者立馬能獨(dú)立完成的。
回復(fù)

使用道具 舉報(bào)

地板
ID:331281 發(fā)表于 2019-4-11 14:27 | 只看該作者
非常感謝,菜鳥(niǎo)學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

5#
ID:492068 發(fā)表于 2019-4-16 09:00 | 只看該作者
真的太感謝了!
回復(fù)

使用道具 舉報(bào)

6#
ID:488831 發(fā)表于 2019-7-24 17:34 | 只看該作者
這個(gè)太麻煩了吧。直接雙擊Proteus的芯片就可以選擇hex文件燒錄進(jìn)去就可以仿真了,跟使用st—link差不多,就是不能在線編程。
回復(fù)

使用道具 舉報(bào)

7#
ID:690605 發(fā)表于 2020-2-22 15:58 | 只看該作者
用proteus7可以仿真stm32嗎?
回復(fù)

使用道具 舉報(bào)

8#
ID:100312 發(fā)表于 2020-2-22 19:22 | 只看該作者

不能,只有proteus8支持stm32的
回復(fù)

使用道具 舉報(bào)

9#
ID:690605 發(fā)表于 2020-2-23 20:21 | 只看該作者
s414545584 發(fā)表于 2020-2-22 19:22
不能,只有proteus8支持stm32的

好的,謝謝,下了一個(gè)8.6的
回復(fù)

使用道具 舉報(bào)

10#
ID:720726 發(fā)表于 2020-4-5 18:32 | 只看該作者
sakuralap 發(fā)表于 2019-7-24 17:34
這個(gè)太麻煩了吧。直接雙擊Proteus的芯片就可以選擇hex文件燒錄進(jìn)去就可以仿真了,跟使用st—link差不多,就 ...

請(qǐng)問(wèn)下,我就是這樣弄得,但是仿真出現(xiàn)了錯(cuò)誤AVR: Program property is not defined.和Real Time Simulation failed to start.
是怎么回事
回復(fù)

使用道具 舉報(bào)

11#
ID:759427 發(fā)表于 2020-5-24 07:29 | 只看該作者
感謝分享,學(xué)習(xí)了。
回復(fù)

使用道具 舉報(bào)

12#
ID:764602 發(fā)表于 2020-6-2 23:07 | 只看該作者
我的就是使用proteus仿真,上圖紫圈里的優(yōu)化等級(jí)沒(méi)有等于Level 2,或大于Level 2。仿真怎么都不行!看到樓主的帖子,改成level2,果然就成功了!太感謝這篇貼了!
回復(fù)

使用道具 舉報(bào)

13#
ID:540270 發(fā)表于 2020-6-3 19:29 | 只看該作者
感謝樓主分享
回復(fù)

使用道具 舉報(bào)

14#
ID:116487 發(fā)表于 2020-6-4 09:57 | 只看該作者
好好學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

15#
ID:116487 發(fā)表于 2020-6-4 09:59 | 只看該作者
學(xué)習(xí)一下,一直不對(duì)
回復(fù)

使用道具 舉報(bào)

16#
ID:789710 發(fā)表于 2020-6-27 14:19 | 只看該作者
挺好的。學(xué)習(xí)了。下載下來(lái)看看
回復(fù)

使用道具 舉報(bào)

17#
ID:830028 發(fā)表于 2020-10-14 23:04 來(lái)自手機(jī) | 只看該作者
keil和preteus中的晶振頻率要一致嗎
回復(fù)

使用道具 舉報(bào)

18#
ID:473104 發(fā)表于 2020-10-30 08:46 | 只看該作者
這個(gè)不錯(cuò),無(wú)硬件調(diào)試不錯(cuò)
回復(fù)

使用道具 舉報(bào)

19#
ID:186696 發(fā)表于 2021-5-2 01:45 | 只看該作者
這個(gè)是有溫度的學(xué)習(xí)筆記,感謝樓主
回復(fù)

使用道具 舉報(bào)

20#
ID:604096 發(fā)表于 2023-1-3 22:06 | 只看該作者
這個(gè)帖子的作用太大了,感謝樓主分享
回復(fù)

使用道具 舉報(bào)

21#
ID:604096 發(fā)表于 2023-1-3 22:07 | 只看該作者
太好了,糾結(jié)好幾天了,終于找到這么使用的例程
回復(fù)

使用道具 舉報(bào)

22#
ID:829222 發(fā)表于 2023-6-1 11:45 | 只看該作者
有空測(cè)試一下,看看效果,之前一直都不行,使用hex都不行,不知道為什么,一直都是直接硬件調(diào)試
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久男人 | 欧美一级片| 日日摸日日添日日躁av | av夜夜操| 中文字幕电影在线观看 | 国产精品久久久久久 | 特黄av| 国产亚洲精品久久久久久牛牛 | 成人在线影视 | 精品久久久久久久久久 | 特级做a爰片毛片免费看108 | 超碰操| 中文在线一区二区 | 日本黄色短片 | 中文字幕一区在线观看视频 | 精品久久精品 | 亚洲免费网站 | 欧美不卡 | 久久久久久毛片免费观看 | 91黄在线观看 | 天天操 天天操 | 中文一区 | 久久专区 | 欧美一区二区三区视频在线播放 | 欧美日本免费 | 亚洲精品区 | 亚洲91精品| 成人精品鲁一区一区二区 | 中文字幕在线播放第一页 | 亚洲第一成年免费网站 | 久久精品网| 成人免费一区二区 | 久久精品成人一区 | 国产无套一区二区三区久久 | 色在线视频网站 | 久草网站| 亚洲精品一区二区网址 | 999视频在线播放 | 中国黄色毛片视频 | 国产成人精品一区 | 中文字幕免费观看 |