建好工程,下一步,就是寫程式了。就像所有的所有的上位機程式設計開始都會叫大家做個「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開源那會起,就一直想深入研究這個系統,因為實在是太強了,所以還是非常想通過教程的形式推薦給大家。但這個裡面有個很大的問題,開源不等於免費,但我依然決定還是做教程,即使是他們後期沒有免費讓廠家使用,我清晰的記得當時的想法很簡單,不能老是守在自己的一畝三分地,得走出舒適區,沒有什麼能比學...