STM32韌體庫使用分析

2021-08-03 05:20:46 字數 3841 閱讀 4503

stm32

的v3.3.0庫,內有cmsis的資料夾為arm cortex

微控制器軟體介面標準,現在將我實際工作中的作乙個簡要分析: 1.

選擇啟動檔案:根據自己所用的晶元的型號,選擇正確的啟動檔案。這個根據資料手冊上的劃分。例如

stm32f101vbt6

,就選擇

startup_stm32f10x_md.s

,在這個檔案裡,首選要定義自已的堆和棧的大小,這個根據自已的需要確定。檔案中已經定義好了中斷向量的位置及堆和棧的初始化操作。

reset_handler    proc

export reset_handler            [weak]

import  __main

import  systeminit

ldr     r0, =systeminit

blx     r0

ldr     r0, =__main

bx      r0

endp

從上面這段文字中,可以看到,在系統復位後,先執行

systeminit()

,再進入

main()

函式。systeminit()

在檔案system_stm32f10x.c

中定義,我們稍後再說。

2.stm32f10x.h

:這個標頭檔案包含了

stm32

的大部份定義: a.

定義晶元的型別,如

#define stm32f10x_md b.

定義是否包含標準庫,

#define use_stdperiph_driver c.

定義外部振盪器頻率,

#define hse_value

上面三個定義,建議在

main.c

檔案中剛開始就定義好,或者是在編譯器選項中定義好,

這樣就可以不修改這個檔案了。 d.

定義中斷號 e.

包含core_cm3.h

,system_stm32f10x.h f.

定義資料型別,u8,

s8等為了相容以前的庫所定義的資料,建議程式中用標準的

uint8_t

這樣的型別。此外還定義了

bool

,flagstatus

,alstatus

及errorstatus g.

定義外設結構體,位址及用到的資料常量。 h.

包含stm32f10x_conf.h

來配置外設 i.

定義位操作的巨集

3.system_stm32f10x.h和.c

,這兩個檔案中: a.

定義乙個全域性變數

uint32_t systemcoreclock: 

系統時鐘頻率與你選擇有關

b.systeminit():

這個函式就是啟動檔案中呼叫的函式

(1)在system_stm32f10x.c

的開始部份,選擇相關的系統時鐘頻率, 如

#define  sysclk_freq_24mhz  24000000

(2)

通過systeminit()

函式,就將

sysclk = hclk = pclk1=pclk2=pll

輸出24mhz

。注意:這個頻率為

hse為

8mhz

時為條件,如果

hse不為

8mhz

或用hsi

時,就會有問題。

c.systemcoreclockupdate():更新systemcoreclock的值,與系統頻率一致。

可能看到,這個檔案中的

rcc設定很有侷限性,所以在程式中,可以不用它,而用標準庫存中的

stm32f10x_rcc

中的函式進行設定。

4.stm32f10x_conf.h

a.配置需要的標準外設庫,需要用到的外設,把相應標頭檔案包含進去就可以。

b.定義assert_param的模式,選擇#define use_full_assert時,斷言輸出問題所在的位置,在除錯時很有用,在正式版本時,把它注釋掉即可。

a. 在mdk中,開總中斷:__enable_irq();   關總中斷:__disable_irq();

b. 中斷處理程式:

(1) nvic_setprioritygrouping(uint32_t prioritygroup);

設定中斷組,這裡的值只能是

0~7,在

stm32

中,只能用

8位中的前

4位來設定組,可以分為兩部份:搶占優先順序和亞優先順序。這個數值就是亞優先順序開始的位。它前面的位是搶占式優先順序的位。例如:

nvic_setprioritygrouping(5)

,那麼d7,d6

表示搶占式優先順序(

0~3),d5,

d4表示亞優先順序(

0~3)。優先順序數值越小,優先順序越高。搶占式優先順序高的中斷可以打斷搶占式優先順序低的中斷。搶占式優先順序相同,亞優先順序不同的兩個中斷,如果同時到來,先執行亞優先順序高的中斷,再執行亞優先順序低的中斷,但不能打斷。

(2)nvic_enableirq(irqn_type irqn);   使能乙個中斷

(3) nvic_disableirq(irqn_type irqn);   禁止乙個中斷

(4)nvic_setpriority(irqn_type irqn,uint32 priority); 設定乙個中斷的優先順序

(5) nvic_encodepriority(uint32_t prioritygroup,uint32_tpreemptpriority,uint32_t subpriority);

(4)和

(5)通常一起使用,這樣設定更直觀,例如要將外部中斷

0設為搶占式優先順序為

0,亞優先順序為

2,則:

nvic_setpriority(exti0_irqn,nvic_encodepriority(5,0,2)); 注意

prioritygroup

的引數應與

(1)中設定的一致。

除了這種方式設定中斷外,也可以使用標準庫中的misc中的中斷設定函式來操作。

c. systick_config(uint32_t ticks)

:設定系統嘀嗒時鐘並使能中斷 在

stm32

中與cm3

核心描述不太一樣,這個時鐘源有兩個選擇:

ahb/8

和ahb

,在該函式中是選擇了

hclk(systick_ctrl_clksource_msk)

,所以定時時間

=ticks / hclk

,當要定時

10ms

,而hclk

為24mhz

時,ticks = 10000 * 24 = 240000。

如果需要選擇

hclk/8

,可以直接修改這個函式,或在這個函式後跟隨

misc

中的systick_clksourceconfig(uint32_tsystick_clksource)

來設定。

d.nvic_systemreset()

:復位晶元。

6. stm32f10x_it

中斷實現,在這裡編寫相應的中斷服務函式。 7.

還需要注意的一點是:進入

main

函式後,除了設定嘀嗒時鐘和中斷外,在操作各外設之前,呼叫:

rcc_ahbperiphclockcmd(),rcc_apb1periphclockcmd(),rcc_apb2periphclockcmd()

,啟動相應的時鐘,否則外設就不能正常工作。

STM32韌體庫檔案分析

1 彙編編寫的啟動檔案 startup stm32f10x hd.s 設定堆疊指標 設定pc指標 初始化中斷向量表 配置系統時鐘 對用c庫函式 main最終去到c的世界 2 時鐘配置檔案 system stm32f10x.c 把外部時鐘hse 8m,經過pll倍頻為72m。3 外設相關的 stm32...

STM32 標準韌體庫檔案分析

1 彙編編寫的啟動檔案 startup stm32f10x hd.s 設定堆疊指標 設定pc指標 初始化中斷向量表 配置系統時鐘 對用c庫函式 main最終去到c的世界 2 時鐘配置檔案 system stm32f10x.c 把外部時鐘hse 8m,經過pll倍頻為72m。3 外設相關的 stm32...

STM32韌體庫模版

開發工具 keil4 剛開始用這個庫的時候很無助,因為第一次用韌體庫 以下是我建立模版的步驟和注意事項 1.解壓韌體庫後先觀察目錄的整體結構,可以知道韌體庫裡面要弄出來的東西是libraries目錄,project目錄是韌體庫的應用,可以為今後開發專案做參考。2.現在建立乙個keil4的新工程,規劃...