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的新工程,規劃...