stm32之路 二 證明你可以

2021-06-08 13:36:32 字數 3431 閱讀 4264

建好工程,下一步,就是寫程式了。就像所有的所有的上位機程式設計開始都會叫大家做個「hello world!」的程式一樣,微控制器程式設計的第一步呢,就是點亮led燈。估計是因為這樣能很直觀地看到程式設計的效果吧,這樣的教程經久不衰,哈哈。

接著上次的工程。忘了說一點,庫版本是2.0.3,現在比較新的3.5.0,其中有一些不同之處,請注意。新建的資料夾中的startup和interrupt需要的檔案比較固定,就不說了。lib下的檔案和使用者程式的關係比較密切,使用者程式要呼叫一些庫函式,這些庫函式就必須放在工程中。以下,以點亮led燈為例說明,io口為pf的6和8。程式幾乎是照抄的,我也是初學啊······

#include

int main(void)

while(1)

gpio_setbits(gpiof,gpio_pin_6);

gpio_setbits(gpiof,gpio_pin_8);

gpio_resetbits(gpiof,gpio_pin_6);

gpio_resetbits(gpiof,gpio_pin_8);

這個大家應該都能看的差不多吧。第一行是標頭檔案,相當於hello world!中的 #include ,至於詳細作用,以後再說,今天的重點不在這裡。while中的4行,是將6、8置位和復位,也就是輸出高低電平,因為我還想讓led閃一閃。

這裡就有問題了,置位和復位不該是寫1和0嗎?怎麼是這樣?

答案是:庫函式。在工程部分的lib下,我們看到了四個.c檔案,這是在建工程的時候加的,剛說過,這個和使用者程式關係密切,希望自己好好想想,所以就不說怎麼加了。(我知道是因為我的程式是照抄的!但是以後自己寫的話,那指定沒的抄!!!所以,要一開始就這樣思考。)繼續說程式,stm32f10x_gpio.c中有這兩個函式的定義,大家可以去看下。推薦一下,source insight,很好用的。

因為要讓led閃,所以需要個延遲函式,這個大家都知道吧,愛放哪放哪吧,不說了。

又有個問題,怎麼算延時時間呢?對了,時鐘!不過,stm32的沒微控制器那麼簡單:這是個大問題。我們用乙個函式來解決時鐘問題,就用rcc_cofigruation();吧,其中,在加點注釋。

void rcc_cofigruation(void)

errorstatus hsestartupstatus;            //定義列舉型別的變數,為了下一步判斷;

rcc_deinit();                                          //復位系統時鐘設定;

rcc_hseconfig(rcc_hse_on);       //開啟hse;

hsestartupstatus =rcc_waitforhsestartup();//等待hse起振;

if(hsestartupstatus == success)     //是否hse起振;

rcc_hclkconfig(rcc_sysclk_div1);          //hclk為sysclk1分頻;

rcc_pclk2config(rcc_hclk_div1);             //pclk2為hclk1分頻;

rcc_pclk1config(rcc_hclk_div2);             //pclk1為hclk2分頻;

flash_setlatency(flash_latency_2);            //flash延時週期為2;

flash_prefetchbuffercmd(flash_prefetchbuffer_enable);   //使能flash預取快取;

rcc_pllconfig(rcc_pllsource_hse_div1,rcc_pllmul_9);//pll設定;

rcc_pllcmd(enable);                          //pll使能;

while(rcc_getflagstatus(rcc_flag_pllrdy)==reset);   //等待pll穩定;

rcc_sysclkconfig(rcc_sysclksource_pllclk);//選擇pll為sysclk;

while(rcc_getsysclksource()!=0x08);          //等待pll成為sysclk;

rcc_apb2periphclockcmd(rcc_apb2periph_gpiof,enable);   //開啟gpiof時鐘;

以上就是時鐘配置的全部程式。由於晶元內部有幾條匯流排,所以要配置相應的時鐘。同時,flash要有個延時,io口也要有自己時鐘,這點是stm32的特殊地方。以前沒見過,現在,知道了吧。這裡面的函式,都在stm32f10x_rcc.c中,所以lib資料夾中要包括這個.c檔案。對了,還要加上stm32f10x_flash.c,剛才用到了。

完了嗎?沒呢。還要設定io口,就像以前用的微控制器,總得確定是輸入還是輸出吧?不過,stm32要複雜不少,下面,還是乙個函式:gpio_configuration();

voidgpio_configuration(void)

gpio_inittypedef gpio_initstructure;

gpio_initstructure.gpio_pin =gpio_pin_6|gpio_pin_8;      //使用6和8;

gpio_initstructure.gpio_speed =gpio_speed_50mhz;        //最大翻轉頻率50mhz;

gpio_initstructure.gpio_mode =gpio_mode_out_pp;        //推挽輸出;

gpio_init(gpiof,&gpio_initstructure);                               //使用pf;

結構體,熟悉吧?所有的io口在使用時都需要設定,希望這是個好的模板。同樣,這個structure的定義在stm32f10x_gpio.c中,記得加上。

裡面的很多東西需要先看下stm32的基本情況才能理解,大家還是先去看下。到這裡,程式就差不多了,把後面的兩函式在主函式中呼叫下,前面宣告,好習慣。下面,是完整的前半部分,後面的,已經很清楚了。

#include

#define delay(n)while((n--))

voidrcc_cofigruation(void);

voidgpio_configuration(void);

int main(void)

vu32 n;

rcc_cofigruation();

gpio_configuration();

while(1)

n=2000000;

gpio_setbits(gpiof,gpio_pin_6);

gpio_setbits(gpiof,gpio_pin_8);

delay(n);

n=2000000;

gpio_resetbits(gpiof,gpio_pin_6);

gpio_resetbits(gpiof,gpio_pin_8);

delay(n);

stm32學習之路

gpio就是那些介面,可以連線外部裝置的,也可以作為輸入埠,它是外設,由apb2負責,apb的意思是外圍匯流排。apb主要用於低頻寬的周邊外設之間的連線。外設 gpiox 都是掛接在 apb2 匯流排上,屬於高速的外 設,而 apb2 匯流排的基位址是 0x4001 0000 如下圖可看到gpioa...

STM32基礎入門(二) STM32入坑指南

最近有不少學弟新入微控制器的坑,萬事開頭難。作為乙個比較陌生的領域,再結合我當時入坑時的一些問題,寫下這篇部落格,希望能夠給初學者一些啟發。1.開發板的選擇 學習stm32,不能繞開的第一件事,那就是開發板。開發板的意義 開發板提供了足夠的資源,包含硬體資源和軟體資源。硬體資源,即開發板上自帶的le...

STM32終於可以免費使用ThreadX全家桶了

從threadx開源那會起,就一直想深入研究這個系統,因為實在是太強了,所以還是非常想通過教程的形式推薦給大家。但這個裡面有個很大的問題,開源不等於免費,但我依然決定還是做教程,即使是他們後期沒有免費讓廠家使用,我清晰的記得當時的想法很簡單,不能老是守在自己的一畝三分地,得走出舒適區,沒有什麼能比學...